Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto

122 vues

Publié le

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).

Publié dans : Logiciels
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto

  1. 1. Píšeme čitelný a testovatelný kód #2 Single responsibility principle v praxi: přestaňte dělat 10 věcí naráz!
  2. 2. Čitelný kód • Opakování z minule  • dobře maintainovatelný • snadno rozšiřitelný (= nerozbijeme stávající logiku)
  3. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 13. Tak si to ukážeme v praxi 1. Reálné UML 2. Ukázka kódu v PHP stormu
  14. 14. A teď začne peklo … Ukázka: https://github.com/tuscanicz/writing-readable-code-2
  15. 15. Jak z toho ven? • Prostudovat kód/analyzovat kód a napsat si, co všechno dělá • Delegovat, delegovat, delegovat!
  16. 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. 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
  18. 18. Dotazy • Dotazy, náměty, připomínky…?
  19. 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

×