Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Péhápkaři - Píšeme čitelný kód #3 by Tomáš Bláha, Driveto

85 views

Published on

Třetí díl mini-serie o psaní čitelného a testovatelného php se zaměřuje na striktní typování v rozličných případech.

Published in: Software
  • Be the first to comment

  • Be the first to like this

Péhápkaři - Píšeme čitelný kód #3 by Tomáš Bláha, Driveto

  1. 1. Píšeme čitelný a testovatelný kód #3 Buďte striktní: nenechte PHP rozhodovat za Vás
  2. 2. O čem si budeme povídat? • Striktní typy & optional arguments • Pole, Listy & Immutability • Enum • Value object
  3. 3. Striktní typy
  4. 4. Kvíz na úvod… $foo = “1”; $foo *= 2; $foo *= 1.5;
  5. 5. Kvíz na úvod… (5 * ’10 příchozích plateb’) === (5 * ’10 odchozích plateb’)
  6. 6. Kvíz na úvod… (5 * ’10 příchozích plateb’) === (5 * ’10 odchozích plateb’)
  7. 7. A co je tohle? declare(strict_types = 1)
  8. 8. Nechybí tu něco? public function getMeValue($text) { return ‘Do I really return ‘ . $text . ‘?’; }
  9. 9. Nechybí tu ještě něco? public function getMeValue(string $text) { return ‘Do I really return ‘ . $text . ‘?’; }
  10. 10. Nechybí tu JEŠTĚ něco? public function getMeValue(string $text): string { return ‘Do I really return ‘ . $text . ‘?’; }
  11. 11. Takže takhle? Není to málo? :-) /** * @param string $text * @return string */ public function getMeValue(string $text): string { return ‘Do I really return ‘ . $text . ‘?’; }
  12. 12. Který zápis platí? Anotace? Typehint? /** * @param AppCustomer[]|DoctrineCommonCollectionsArrayCollection */ public function processCustomer(CustomerList $customerList) { // do some business logic… }
  13. 13. Pole, Listy & immutability
  14. 14. Vše v pořádku? public function sendBulkNotification($recipients) { foreach ($recipients as $recipient) { $this->sendNotifiacation($recipient); } }
  15. 15. Lepší? public function sendBulkNotification(array $recipients): void { foreach ($recipients as $recipient) { $this->sendNotifiacation($recipient); } }
  16. 16. Toto je tedy vše? /** * @param AppCustomer[] $recipients */ public function sendBulkNotification(array $recipients): void { foreach ($recipients as $recipient) { $this->sendNotifiacation($recipient); } }
  17. 17. A co bude teď? $recipients = [ new Customer(‘Vratislav’, ‘vrata1@gmail.com’), new Customer(‘Čestmír’, ‘cesta@seznam.cz’), 5, ]; $notifier->sendBulkNotification($recipients);
  18. 18. Pomůže nám List (a Consistence) Následuje ukázka kódu: https://github.com/TomasBlaha/pehapkari https://github.com/consistence/consistence
  19. 19. Enum
  20. 20. Opět něco chybí… function constructVehicle($type) { // magic… return $vehicle; }
  21. 21. Nyní už jsme striktní? function constructVehicle(string $vehicleType) : Vehicle { // magic… return $vehicle; }
  22. 22. Továrna na vozidla! function constructVehicle(string $vehicleType) : Vehicle { // magic… return $vehicle; } constructVehicle(‘passenger car’); constructVehicle(‘truck’);
  23. 23. Továrna na vozidla! function constructVehicle(string $vehicleType) : Vehicle { // magic… return $vehicle; } constructVehicle(‘banana’);
  24. 24. Ups…
  25. 25. Pomůže nám Enum (tuscanicz/enum) Následuje ukázka kódu: https://github.com/TomasBlaha/pehapkari https://github.com/tuscanicz/enum
  26. 26. Value Object
  27. 27. Co s komplexní třídou? class Car( string $name, string $make, float $width, float $height, float $lenght, int $doorsCount, int $weight, …
  28. 28. Rozpadnout! class Car( string $name, string $make, CarBody $carBody, Color $color ) class CarBody( float $width, float $height, float $lenght, int $doorsCount, int $weight )
  29. 29. Co s volitelnými parametry? Následuje ukázka kódu: https://github.com/TomasBlaha/pehapkari
  30. 30. Jak jsme si pomohli? 1. Fail fast • https://www.martinfowler.com/ieeeSoftware/failFast.pdf • Chyba se projeví hned • Snadná debugovatelnost • Chyba se nepřenáší do business logiky
  31. 31. Jak jsme si pomohli? 2. Atomizovaný kód • Znovupoužitelnost komponent
  32. 32. Jak jsme si pomohli? 3. Čitelnější • Přehlednější metody (constructor etc.) • Anotace uvádíme pouze na 1 místě (anotce deprecují kód)
  33. 33. Jak jsme si pomohli? 4. Lépe testovatelný • Přehlednější testy • Méně závislostí • Immutability • SRP: https://www.facebook.com/pehapkari/videos/1652303308152806/ • Nullable: https://www.facebook.com/pehapkari/videos/1616785535037917/
  34. 34. Jak jsme si pomohli? 5. Větší a snazší kontrola • DDD - https://en.wikipedia.org/wiki/Domain-driven_design • Hinting v IDE • Práce s daty na jednom místě
  35. 35. Jak jsme si pomohli? 6. Maintenovatelnost • Find usages • Refactor • Držíme type na jednom místě (anotace vs typehint)
  36. 36. Dotazy • Dotazy, náměty, připomínky…?
  37. 37. Díky za pozornost! • Driveto is hiring  www.driveto.cz Tomáš Bláha tomas.blaha@driveto.cz Backend developer 722 582 915 facebook.com/blahatom

×