Návrhový vzor je koncepční model, který pomáhá řešit problémy návrhu v různých kontextech. Je to něco jako opakovaně použitelná šablona, kterou můžete použít při strukturování kódu.
Při práci na projekt, je důležité si uvědomit, že nechcete znovu vynalézat kolo. Pokud se řešení problému osvědčilo, jeho opětovné použití vám ušetří spoustu času a několik bolestí hlavy. V případě dilemat architektury systému jsme vyvinuli několik vzorů, které usnadňují proces návrhu.
Co je to návrhový vzor?
Návrhový vzor je koncepční model, který pomáhá řešit problémy návrhu v různých kontextech. Je to něco jako opakovaně použitelná šablona, kterou můžete použít na strukturování kód. Jde o to, že návrhové vzory jsou dobře zdokumentované, osvědčené a všeobecně známé. Jinými slovy, použijte správný návrhový vzor a buďte si jisti, že ostatní zasvěcenci do návrhových vzorů (alias vaši spolupracovníci) vaše nápady bez problémů pochopí.
Chcete se učit? Přichází vzor návrhu strategie.
Návrhový vzor strategie:
definuje rodinu algoritmů,
implementuje každý z algoritmů jako samostatnou entitu,
umožňuje v daném kontextu používat jednotlivé algoritmy zaměnitelně.
Příklad ze života? Ověřování
V jedné z našich aplikací jsme implementovali několik strategií pro ověřování požadavků. Umožňujeme ověřování pomocí souborů cookie, tokenů JWT a klíčů API. Zní mi to jako rodina algoritmů.
Podívejme se na ukázkovou implementaci.
Naši rodinu autentizačních algoritmů jsme rozdělili do tří samostatných tříd. Každá třída definuje konkrétní chování; v ní se odehrávají všechny implementační detaily:
modul AuthenticationStrategies
třída CookiesAuthentication
def self.authenticate_request(request)
puts "Implementuji autentizační algoritmus cookie"
end
end
třída JWTAuthentication
def self.authenticate_request(request)
puts "Implementuji autentizační algoritmus jwt"
end
end
třída ApiKeyAuthentication
def self.authenticate_request(request)
puts "Implementuji autentizační algoritmus api klíče"
end
end
end
Dále máme třídu kontext/klient:
třída Ověřování
def self.authenticate(authentication_strategy, request)
authentication_strategy.authenticate_request(request)
end
end