SlideShare a Scribd company logo
Píšeme čitelný
a testovatelný kód #3
Buďte striktní: nenechte PHP rozhodovat za Vás
O čem si budeme povídat?
• Striktní typy & optional arguments
• Pole, Listy & Immutability
• Enum
• Value object
Striktní typy
Kvíz na úvod…
$foo = “1”;
$foo *= 2;
$foo *= 1.5;
Kvíz na úvod…
(5 * ’10 příchozích plateb’) === (5 * ’10 odchozích plateb’)
Kvíz na úvod…
(5 * ’10 příchozích plateb’) === (5 * ’10 odchozích plateb’)
A co je tohle?
declare(strict_types = 1)
Nechybí tu něco?
public function getMeValue($text) {
return ‘Do I really return ‘ . $text . ‘?’;
}
Nechybí tu ještě něco?
public function getMeValue(string $text) {
return ‘Do I really return ‘ . $text . ‘?’;
}
Nechybí tu JEŠTĚ něco?
public function getMeValue(string $text): string {
return ‘Do I really return ‘ . $text . ‘?’;
}
Takže takhle? Není to málo? :-)
/**
* @param string $text
* @return string
*/
public function getMeValue(string $text): string {
return ‘Do I really return ‘ . $text . ‘?’;
}
Který zápis platí? Anotace? Typehint?
/**
* @param AppCustomer[]|DoctrineCommonCollectionsArrayCollection
*/
public function processCustomer(CustomerList $customerList) {
// do some business logic…
}
Pole, Listy & immutability
Vše v pořádku?
public function sendBulkNotification($recipients) {
foreach ($recipients as $recipient) {
$this->sendNotifiacation($recipient);
}
}
Lepší?
public function sendBulkNotification(array $recipients): void {
foreach ($recipients as $recipient) {
$this->sendNotifiacation($recipient);
}
}
Toto je tedy vše?
/**
* @param AppCustomer[] $recipients
*/
public function sendBulkNotification(array $recipients): void {
foreach ($recipients as $recipient) {
$this->sendNotifiacation($recipient);
}
}
A co bude teď?
$recipients = [
new Customer(‘Vratislav’, ‘vrata1@gmail.com’),
new Customer(‘Čestmír’, ‘cesta@seznam.cz’),
5,
];
$notifier->sendBulkNotification($recipients);
Pomůže nám List (a Consistence)
Následuje ukázka kódu:
https://github.com/TomasBlaha/pehapkari
https://github.com/consistence/consistence
Enum
Opět něco chybí…
function constructVehicle($type) {
// magic…
return $vehicle;
}
Nyní už jsme striktní?
function constructVehicle(string $vehicleType) : Vehicle {
// magic…
return $vehicle;
}
Továrna na vozidla!
function constructVehicle(string $vehicleType) : Vehicle {
// magic…
return $vehicle;
}
constructVehicle(‘passenger car’);
constructVehicle(‘truck’);
Továrna na vozidla!
function constructVehicle(string $vehicleType) : Vehicle {
// magic…
return $vehicle;
}
constructVehicle(‘banana’);
Ups…
Pomůže nám Enum (tuscanicz/enum)
Následuje ukázka kódu:
https://github.com/TomasBlaha/pehapkari
https://github.com/tuscanicz/enum
Value Object
Co s komplexní třídou?
class Car(
string $name,
string $make,
float $width,
float $height,
float $lenght,
int $doorsCount,
int $weight,
…
Rozpadnout!
class Car(
string $name,
string $make,
CarBody $carBody,
Color $color
)
class CarBody(
float $width,
float $height,
float $lenght,
int $doorsCount,
int $weight
)
Co s volitelnými parametry?
Následuje ukázka kódu:
https://github.com/TomasBlaha/pehapkari
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
Jak jsme si pomohli?
2. Atomizovaný kód
• Znovupoužitelnost komponent
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)
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/
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ě
Jak jsme si pomohli?
6. Maintenovatelnost
• Find usages
• Refactor
• Držíme type na jednom místě (anotace vs typehint)
Dotazy
• Dotazy, náměty, připomínky…?
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

More Related Content

More from Petr Bechyně

Glami - jak řešíme performance, aneb jak neshodit web TV reklamou
Glami - jak řešíme performance, aneb jak neshodit web TV reklamouGlami - jak řešíme performance, aneb jak neshodit web TV reklamou
Glami - jak řešíme performance, aneb jak neshodit web TV reklamou
Petr Bechyně
 
Adam Szabo: Jak jsme v Driveto zlepšovali konverze
Adam Szabo: Jak jsme v Driveto zlepšovali konverzeAdam Szabo: Jak jsme v Driveto zlepšovali konverze
Adam Szabo: Jak jsme v Driveto zlepšovali konverze
Petr Bechyně
 
Péhápkaři - Píšeme čitelný a testovatelný kód #5 by Driveto dev team
Péhápkaři - Píšeme čitelný a testovatelný kód #5 by Driveto dev teamPéhápkaři - Píšeme čitelný a testovatelný kód #5 by Driveto dev team
Péhápkaři - Píšeme čitelný a testovatelný kód #5 by Driveto dev team
Petr Bechyně
 
Péhápkaři - Píšeme čitelný kód #4 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #4 by Petr Bechyně, DrivetoPéhápkaři - Píšeme čitelný kód #4 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #4 by Petr Bechyně, Driveto
Petr Bechyně
 
Doctrine Data migrations | May 2017
Doctrine Data migrations | May 2017Doctrine Data migrations | May 2017
Doctrine Data migrations | May 2017
Petr Bechyně
 
SEO Restart 2015 - Collabim
SEO Restart 2015 - CollabimSEO Restart 2015 - Collabim
SEO Restart 2015 - Collabim
Petr Bechyně
 
Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, DrivetoPéhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto
Petr Bechyně
 
Péhápkaři - Píšeme čitelný kód #1 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #1 by Petr Bechyně, DrivetoPéhápkaři - Píšeme čitelný kód #1 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #1 by Petr Bechyně, Driveto
Petr Bechyně
 
Svlékněte konkurenci donaha: Jiří Koutný, Collabim
Svlékněte konkurenci donaha: Jiří Koutný, CollabimSvlékněte konkurenci donaha: Jiří Koutný, Collabim
Svlékněte konkurenci donaha: Jiří Koutný, Collabim
Petr Bechyně
 
Pionýři Digitálu #2 - Klíčová analýza slov
Pionýři Digitálu #2 - Klíčová analýza slovPionýři Digitálu #2 - Klíčová analýza slov
Pionýři Digitálu #2 - Klíčová analýza slov
Petr Bechyně
 

More from Petr Bechyně (10)

Glami - jak řešíme performance, aneb jak neshodit web TV reklamou
Glami - jak řešíme performance, aneb jak neshodit web TV reklamouGlami - jak řešíme performance, aneb jak neshodit web TV reklamou
Glami - jak řešíme performance, aneb jak neshodit web TV reklamou
 
Adam Szabo: Jak jsme v Driveto zlepšovali konverze
Adam Szabo: Jak jsme v Driveto zlepšovali konverzeAdam Szabo: Jak jsme v Driveto zlepšovali konverze
Adam Szabo: Jak jsme v Driveto zlepšovali konverze
 
Péhápkaři - Píšeme čitelný a testovatelný kód #5 by Driveto dev team
Péhápkaři - Píšeme čitelný a testovatelný kód #5 by Driveto dev teamPéhápkaři - Píšeme čitelný a testovatelný kód #5 by Driveto dev team
Péhápkaři - Píšeme čitelný a testovatelný kód #5 by Driveto dev team
 
Péhápkaři - Píšeme čitelný kód #4 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #4 by Petr Bechyně, DrivetoPéhápkaři - Píšeme čitelný kód #4 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #4 by Petr Bechyně, Driveto
 
Doctrine Data migrations | May 2017
Doctrine Data migrations | May 2017Doctrine Data migrations | May 2017
Doctrine Data migrations | May 2017
 
SEO Restart 2015 - Collabim
SEO Restart 2015 - CollabimSEO Restart 2015 - Collabim
SEO Restart 2015 - Collabim
 
Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, DrivetoPéhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #2 by Petr Bechyně, Driveto
 
Péhápkaři - Píšeme čitelný kód #1 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #1 by Petr Bechyně, DrivetoPéhápkaři - Píšeme čitelný kód #1 by Petr Bechyně, Driveto
Péhápkaři - Píšeme čitelný kód #1 by Petr Bechyně, Driveto
 
Svlékněte konkurenci donaha: Jiří Koutný, Collabim
Svlékněte konkurenci donaha: Jiří Koutný, CollabimSvlékněte konkurenci donaha: Jiří Koutný, Collabim
Svlékněte konkurenci donaha: Jiří Koutný, Collabim
 
Pionýři Digitálu #2 - Klíčová analýza slov
Pionýři Digitálu #2 - Klíčová analýza slovPionýři Digitálu #2 - Klíčová analýza slov
Pionýři Digitálu #2 - Klíčová analýza slov
 

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

  • 1. Píšeme čitelný a testovatelný kód #3 Buďte striktní: nenechte PHP rozhodovat za Vás
  • 2. O čem si budeme povídat? • Striktní typy & optional arguments • Pole, Listy & Immutability • Enum • Value object
  • 4. Kvíz na úvod… $foo = “1”; $foo *= 2; $foo *= 1.5;
  • 5. Kvíz na úvod… (5 * ’10 příchozích plateb’) === (5 * ’10 odchozích plateb’)
  • 6. Kvíz na úvod… (5 * ’10 příchozích plateb’) === (5 * ’10 odchozích plateb’)
  • 7. A co je tohle? declare(strict_types = 1)
  • 8. Nechybí tu něco? public function getMeValue($text) { return ‘Do I really return ‘ . $text . ‘?’; }
  • 9. Nechybí tu ještě něco? public function getMeValue(string $text) { return ‘Do I really return ‘ . $text . ‘?’; }
  • 10. Nechybí tu JEŠTĚ něco? public function getMeValue(string $text): string { return ‘Do I really return ‘ . $text . ‘?’; }
  • 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. Který zápis platí? Anotace? Typehint? /** * @param AppCustomer[]|DoctrineCommonCollectionsArrayCollection */ public function processCustomer(CustomerList $customerList) { // do some business logic… }
  • 13. Pole, Listy & immutability
  • 14. Vše v pořádku? public function sendBulkNotification($recipients) { foreach ($recipients as $recipient) { $this->sendNotifiacation($recipient); } }
  • 15. Lepší? public function sendBulkNotification(array $recipients): void { foreach ($recipients as $recipient) { $this->sendNotifiacation($recipient); } }
  • 16. Toto je tedy vše? /** * @param AppCustomer[] $recipients */ public function sendBulkNotification(array $recipients): void { foreach ($recipients as $recipient) { $this->sendNotifiacation($recipient); } }
  • 17. A co bude teď? $recipients = [ new Customer(‘Vratislav’, ‘vrata1@gmail.com’), new Customer(‘Čestmír’, ‘cesta@seznam.cz’), 5, ]; $notifier->sendBulkNotification($recipients);
  • 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. Enum
  • 20. Opět něco chybí… function constructVehicle($type) { // magic… return $vehicle; }
  • 21. Nyní už jsme striktní? function constructVehicle(string $vehicleType) : Vehicle { // magic… return $vehicle; }
  • 22. Továrna na vozidla! function constructVehicle(string $vehicleType) : Vehicle { // magic… return $vehicle; } constructVehicle(‘passenger car’); constructVehicle(‘truck’);
  • 23. Továrna na vozidla! function constructVehicle(string $vehicleType) : Vehicle { // magic… return $vehicle; } constructVehicle(‘banana’);
  • 25. Pomůže nám Enum (tuscanicz/enum) Následuje ukázka kódu: https://github.com/TomasBlaha/pehapkari https://github.com/tuscanicz/enum
  • 27. Co s komplexní třídou? class Car( string $name, string $make, float $width, float $height, float $lenght, int $doorsCount, int $weight, …
  • 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. Co s volitelnými parametry? Následuje ukázka kódu: https://github.com/TomasBlaha/pehapkari
  • 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. Jak jsme si pomohli? 2. Atomizovaný kód • Znovupoužitelnost komponent
  • 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. 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. 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. Jak jsme si pomohli? 6. Maintenovatelnost • Find usages • Refactor • Držíme type na jednom místě (anotace vs typehint)
  • 36. Dotazy • Dotazy, náměty, připomínky…?
  • 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