Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto
Apr. 12, 2018•0 likes•250 views
Download to read offline
Report
Software
Druhý díl mini-serie o psaní čitelného a testovatelného php od Petra Bechyně z Driveto se zaměřuje na architekturu aplikace, resp. delegování odpovědností tříd a principu jedné odpovědnosti (Single responsibility principle).
2. Čitelný kód
• Opakování z minule
• dobře maintainovatelný
• snadno rozšiřitelný (= nerozbijeme stávající logiku)
3. SRP, SOLID, známe se?
„the S of the SOLID group of principles“
„A class should have only one reason to change“
Robert C. Martin, autor myšlenky
4. Jak ji běžně vysvětlujeme…
• Známé příklady s knížkou zde:
• https://code.tutsplus.com/tutorials/solid-part-1-the-single-responsibility-
principle--net-36074
• Jak ale tohle uchopit v našem komplexním kódu?
5. Jak na to?
• Rozličný přístup:
• Nový kód – zamyslet se, než budeme realizovat (UML diagramy, ERP)
• Stávající kód – potřebuje refaktorovat (zkusíme přemýšlet, jak to otestovat
unit testama)
6. Začneme tím jednodušším…
Příklad nového zadání:
Máme web (cestovní kancelář, eshop, katalog s auty) a potřebujeme do něj importovat
prostřednictvím XML souborů nějaká data.
Data ukládáme do SQL databáze, používáme Symfony a Doctrine.
Máme url: https://sikulove.cz/pro-partnery/tajne/prisne-tajne/export.xml
7. Takže…
1. Stáhneme XML soubor
2. Rozparsujeme XML a hydratujeme na nějaké value-objecty – přepravky
3. Namapujeme přepravky na naše Doctrine Entity
4. Doctrine Entity uložíme do databáze
8. Co se může po**at?
1. Stáhneme XML soubor
1. Host could not be reached (že by ti šikulové nebyli až tak šikovní?)
2. Nedostupné (404, 500)
2. Rozparsujeme XML a hydratujeme na nějaké value-objecty – přepravky
1. Není tam tak docela XML (<h1>It works!</h1>)
2. XML bysme měli, ale tak úplně nejde rozparsovat
3. Přibyla nějaká hodnota, co nemáme v číselníku přepravek (<fuel_type>coal</fuel_type>)
3. Namapujeme přepravky na naše Doctrine Entity
1. Hodnota z číselníku přepravek nemá definovanou hodnotu z našeho číselníku
2. Nějaká důležitá hodnota chybí (<price_vat></price_vat>)
4. Doctrine Entity uložíme do databáze
1. Integrity checks
2. Deadlock
9. Tak si to nakreslíme!
1. Stáhneme XML soubor
1. Host could not be reached (že by ti šikulové nebyli až tak šikovní?)
2. Nedostupné (404, 500)
Content getter
url
raw xml
1. Throwable?
1. Odchytím výjimku, zaloguju a pokračuju
2. Nechám umřít..
10. Tak si to nakreslíme!
1. Rozparsujeme XML a hydratujeme na nějaké value-objecty – přepravky
1. Není tam tak docela XML (<h1>It works!</h1>)
2. XML bysme měli, ale tak úplně nejde rozparsovat
3. Přibyla nějaká hodnota, co nemáme v číselníku přepravek (<fuel_type>coal</fuel_type>)
Content getter
url
raw xml
1. Throwable?
1. Odchytím výjimku, zaloguju a pokračuju
2. Nechám umřít..
Parser
ParsedImportList
ImportCategoryEnum
ImportFueltTypeEnum
11. Tak si to nakreslíme!
1. Namapujeme přepravky na naše Doctrine Entity
1. Hodnota z číselníku přepravek nemá definovanou hodnotu z našeho číselníku
2. Nějaká důležitá hodnota chybí (<price_vat></price_vat>)
Content getter
url
raw xml
1. Throwable?
1. Odchytím výjimku, zaloguju a pokračuju
2. Nechám umřít..
Parser
ParsedImportList
ImportCategoryEnum
ImportFueltTypeEnum
Mapper
CategoryMapper
FuelTypeMapper
CategoryEnum
FuelTypeEnum
Our itemList of
12. A jsme ve finále! Ani to nebolelo!
1. Doctrine Entity uložíme do databáze
1. Integrity checks
2. Deadlock
Content getter
url
raw xml
1. Throwable?
1. Odchytím výjimku, zaloguju a pokračuju
2. Nechám umřít..
Parser
ParsedImportList
ImportCategoryEnum
ImportFueltTypeEnum
Mapper
CategoryMapper
FuelTypeMapper
CategoryEnum
FuelTypeEnum
Our itemList of
Repository
13. Tak si to ukážeme v praxi
1. Reálné UML
2. Ukázka kódu v PHP stormu
14. A teď začne peklo …
Ukázka:
https://github.com/tuscanicz/writing-readable-code-2
15. Jak z toho ven?
• Prostudovat kód/analyzovat kód a napsat si, co všechno dělá
• Delegovat, delegovat, delegovat!
16. Kdy zpozornět?
• Příliš mnoho závislostí v konstruktoru (nepředpokládáme, že bychom
vstřikovali container nebo závilosti přidávali pomocí setterů)
• Chybí jednotkové testy = to nejde
• Pokud mám říct co všechno nějaká service dělá, nelze vymyslet
souvětí nebo dokonce román:
• Tato service odesílá emaily vs. Tato service sestaví šablonu emailu, vytvoří
záznam ve frontě, odešle email a zaloguje ho
17. Reference
• Další čtení:
• Robert C. Martin: Clean Code
• https://code.tutsplus.com/tutorials/solid-part-1-the-single-responsibility-
principle--net-36074
• Testovací repo:
• https://github.com/tuscanicz/writing-readable-code-2
19. Díky za pozornost!
• We are hiring
www.driveto.cz
Petr Bechyně petr.bechyne@driveto.cz
CTO Driveto 736 761 183
github.com/tuscanicz
facebook.com/petrbechynecz