Návrhové principy II
DRY & WET
aneb suché a vlhké programování
- Don't repeat yourself
- Obecný princip neopakování se
"Každý poznatek systému musí mít jedinou, jednoznačnou
a určující implementaci"
- Vztahuje se na primární zdroje informací = ty co upravují lidé
- Nedodržení -> WET - Write Everything Twice/We edit terrible
Proč DRY?
- Každý řádek kódu v aplikaci musí být udržován a je potenciálním zdrojem chyb
- Dodržení je předpokladem pro tvorbu znovupoužitelného kódu
Důsledky nedodržení DRY
-
Zvýšený výskyt chyb - s kódem kopírujeme i chyby, při následných opravách jsme nuceni opravovat i kopie a na některé zapomeneme.
-
Problematická optimalizace - kód vykonávající stejnou logiku na více místech = irelevantní výsledky profileru
-
(NE)čitelnost kódu - kód produkovaný dle DRY je čitelný a není problém při změně programátora.
- Problematická refaktorizace - nebudou refaktorovány všechny kopie kódu
Proč nedodržujeme
DRY
-
"Rychlé" programovací metody - Clone & Modify
-
Nezkušenost - poučme se i z chyb ostatních ať jich nemusíme sami dělat tolik
-
Neexistující(špatná) dokumentace - špatná orientace v aplikačním frameworku
- Špatná komunikace v týmu - hlavně neochota hledat společná řešení
Jak dodržovat DRY
-
Návrhové vzory - většin věcí které řešíme již někdo vyřešil, otestoval a zdokumentoval
-
Refaktorizace - refaktorujte! A refaktorujte často.
- Revize kódu - kontrolujte si kód vzájemně, diskutujte o návrhu při jeho implementaci.
Ne každá duplicita je porušení DRY
- Duplicitní kód spolu musí logicky souviset - vyjadřovat stejnou informaci.
- Při "špatném dodržování" zvyšujeme provázanost kódu.
double cm2M(int cm) {
return cm/100;
}
double decimal2Percent(int number) {
return number/100;
}
result.ok=right
text.right=right
Ne vždy je třeba DRY dodržet
- Jako ostatní principy nám má DRY ušetřit práci s údržbou kódu
- bezmyšlenkovité striktní dodržování může více práce přidat než ušetřit
- porušování DRY v Unit testech a HTML šablonách je obecně tolerováno
GRASP
- sada principů pro pomoc při rozdělování zodpovědností
- skládá se z 9 "principů":
- Protected variations(chráněné změny)
- High cohesion(vysoká soudržnost)
- Low coupling(slabá provázanost)
- Pure fabbrication(pouhá konstrukce)
- Polymorphism
- Indirection(nepřímá vazba)
- Information expert
- Creator
- Controller
(General Responsibility Assignment Software Patterns)
Protected variations
-
Identifikujte místa pravděpodobných změn a zodpovědnosti přiřaďte stabilním rozhraním, která okolo nich vytvoříte.
- 2 druhy změn které je třeba rozlišovat:
- variation points - změny v rámci existujícího systému
- evolution points - budoucí změny, neexistující v systému
- Výhody:
- jednodušší provádění změn
- změny neovlivní ostatní prvky
- snížení provázanosti
High cohesion
-
míra jak moc jsou zodpovědnosti jednoho prvku související
- snažíme se o zachování co nejvyšší soudržnosti
- Výhody:
- snažší pochopení prvku
- stabilnější, méně často se mění
- znovupoužitelnější
High cohesion
důvody nízké soudržnosti
- příliš hrubá granularita zodpovědností - prvke zpracovává zodpovědnosti, které by měl delegovat specializovaným prvkům
- postupné přidávání zodpovědností - místo vytvoření nového prvku přidáme zodpovědnost do již existujícícho
- HINT: pokud hodně metod prvku používá pouze malou část instančních proměnných => pravděpodobně jde o nízkou soudržnost
Low coupling
-
míra jak moc je jeden prvek propjen s dalšími prvky
- snažíme se o zachování co nejmenší provázanost
- Výhody:
- snažší pochopení prvku
- znovupoužitelnější
- Určitá míra provázanosti je normální a nezbytná
- provázanost se standartními prvky není problém
Low coupling
- zdroje provázanosti prvku A a B:
- A má atribut odkazující na B
- A volá metodu B
- Parameter nebo návratová hodnota A je typu B
- A je potomkem B
- A implementuje B
Polymorphism
-
Pokud chování závisí na typu objektu, přiřaďte zodpovědnost polymorfické metodě třídy, na které chování závisí
-
nikdy neřiďte chování pomocí podmínek testující typ objektu
- Při nedodržení je obtížné a nebezpečné přidání každé další podtřídy
Pure fabrication
- třídy pro zlepšení kvality kódu
- existují odpovědnosti jejichž přiřazení třídě z domény by narušilo soudržnost třídy
- měly by vznikat jen pokud ostatní řešení má jasné nevýhody.
- většina návrhových vzorů je pure fabrication
Indirection
-
pokud se chcete vyhnout přímé vazbě přiřaďte odpovědnost prostřeníkovi
- hlavní motivace je snižování provázanosti a dodržení protected variations
- takový to prostředník představuje pure fabrication
Information expert
-
zodpovědnost přidělte expertovi(prvku), který má informace potřebné k provedení
- zodpovědnost by měl mít objekt který obsahuje potřebná data
- Podporuje:
- zapouzdření
- nízkou provázanost
- vysokou soudržnost
Creator
-
přiřaďte třídě B zodpovědnost za vytváření A pokud:
- B je agregátor objektů A
- B obsahuje objekty A
- B uchovává záznamy o objektech A
- B úzce spolupracuje s A
-
B má inicializační data pro A
- motivace:
- snižování provázanosti
- omezení míst na kterých se vytváří instance
Controller
-
odpoveď na otázku. Kdo by měl být zodpovědný za zpracování systémových událostí?
- jde o pure fabrication prvek který leží mezi UI a doménovou vrstvou
- UI při systémové události volá controller, který akci deleguje na další součásti systému
KISS - Keep It Simple Stupid
Vždy jednej v souladu s kontextem a okolnostmi problému. Nekombinuj co není potřeba. Nedělej složitější to co není. Navrhni vždy řešení, které je efektivní v souladu s okolními podmínkami.
DRY - Don’t Repeat Yourself
Pokud něco děláš podruhé a používáš CTRL+C a CTRL+V je něco špatně! Neduplikuj kód, pokud jde něco vytknout před závorku udělej to! Využívej principy OOP.
YAGNI - You Ain’t Gonna Need It
Nestav nic co není potřeba. Dívej se do budoucnosti v rozumném horizontu. Zvaž jestli někdy využiješ přidanou funkci, zvaž jestli ti v budoucnu spíše nezkomplikuje život.
CoC - Convention over Configuration
Drž se konvencí, usnadňuje to orientaci v kódu a snižuje nutnost znát dokonale pozadí kódu. Programátor nemusí dělat zbytečná rozhodnutí, pokud se kód chová standardně podle očekávání. Není nutné se učit všechny konfigurační direktivy a postupy jak zajistit požadované chování.
navrhove pricnipy 2 DRY, GRASP
By Jiří Čížek
navrhove pricnipy 2 DRY, GRASP
- 362