Successfully reported this slideshow.
Your SlideShare is downloading. ×

Čtvrtkon #53 - Štěpán Zikmund

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 53 Ad

Čtvrtkon #53 - Štěpán Zikmund

Download to read offline

Profil:
Štěpán pracuje jako jako PHP vývojář ve společnosti ZOOT.

Téma:
Programovali jste někdy aplikaci úplně od píky? Pamatujete si na rychlost, se kterou jste na začátku dokázali přidávat první featury. A znáte ten pocit, jak se po pár měsících s rozšiřující funkcionalitou a rozrůstajícím týmem z některých částí kódu stane bludiště a implementace zdánlivě jednoduché funkcí je najednou řádově obtížnější než na počátku?

Představím vám strýčka Boba – super hrdinu objektově orientovaného návrhu a jeho patero přikázání, které vám pomůže původní ladnost a efektivitu zažívat i v pokročilejších fázích projektu.

Profil:
Štěpán pracuje jako jako PHP vývojář ve společnosti ZOOT.

Téma:
Programovali jste někdy aplikaci úplně od píky? Pamatujete si na rychlost, se kterou jste na začátku dokázali přidávat první featury. A znáte ten pocit, jak se po pár měsících s rozšiřující funkcionalitou a rozrůstajícím týmem z některých částí kódu stane bludiště a implementace zdánlivě jednoduché funkcí je najednou řádově obtížnější než na počátku?

Představím vám strýčka Boba – super hrdinu objektově orientovaného návrhu a jeho patero přikázání, které vám pomůže původní ladnost a efektivitu zažívat i v pokročilejších fázích projektu.

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Similar to Čtvrtkon #53 - Štěpán Zikmund (20)

Advertisement

More from Péhápkaři (20)

Recently uploaded (20)

Advertisement

Čtvrtkon #53 - Štěpán Zikmund

  1. 1. SOLID | Štěpán Zikmund
  2. 2. krása
  3. 3. • změny v zadání • nové funkce, které jsou v rozporu s původní funkcionalitou • deadliny Co by mohly být takový překážky..
  4. 4. no, mohly by…
  5. 5. source code
  6. 6. 💩
  7. 7. Rigidity
  8. 8. Fragilitiy
  9. 9. Imobility
  10. 10. Coupling? How?
  11. 11. OOP
  12. 12. SOLID
  13. 13. Single Responsibility Principle Open Closed Principle Liskov Substitution Principle Interface Segregation Principle Dependency Inversion Principle
  14. 14. – Uncle Bob „OOP is about managing dependency by selectively inverted some key dependencies in your architecture to prevent rigidity, fragility, not reusability“
  15. 15. The Dependency Inversion Principle Depend on abstractions, not on concretions
  16. 16. m n
  17. 17. m n
  18. 18. m interface n
  19. 19. class Authentication { private $userProvider; public function __construct(UserProvider $userProvider) { $this->userProvider = $userProvider; } }
  20. 20. class Authentication { private $userProvider; public function __construct(UserProviderInterface $userProvider) { $this->userProvider = $userProvider; } }
  21. 21. The Single Responsibility Principle A class should have one, and only one, reason to change
  22. 22. Symptomy • účel třídy nejde pospat bez spojek a, nebo • třída obsahuje velké množství properties a public method • třída obsahuje velké množství závislostí na další objekty
  23. 23. Řešení • kompozice • event listener • …
  24. 24. Employee + getSalary() + getName() + setSalary() + setName() + getSalaryReport()
  25. 25. Employee + getSalary() + getName() + setSalary() + setName() SalaryReportBuilder + getReport(Employee $employee)
  26. 26. The Open Closed Principle You should be able to extend a classes behaviour, without modifying it
  27. 27. Pro přidání nové featury nechcete editovat stávající kód, ale vytvořit nový
  28. 28. function doSomething($howToDoIt) { if ($howToDoIt == 'something') { return someBehaviour(); } else if ($howToDoIt == 'somethingOther') { return someOtherBehaviour(); } else { throw new IllegalArgumentException(); } }
  29. 29. Symptomy • switch statement • třída zná více různých service se stejným interfacem nebo s podobným účelem
  30. 30. Employee + getSalary() + getName() + setSalary() + setName() SalaryReportBuilder + getXmlReport(Employee $employee) + getJsonReport(Employee $employee)
  31. 31. Employee + getSalary() + getName() + setSalary() + setName() SalaryReportBuilder + getXmlReport(Employee $employee) + getJsonReport(Employee $employee) SRP
  32. 32. XmlReportBuilder + getXmlReport(..) SalaryReportBuilder + getReport($type) JsonReportBuilder + getJsonReport(..)
  33. 33. function getReport($type, $employee) { switch ($type): case 'xml' return $this->xmlReportBuilder->getReport($employee); case 'json' return $this->jsonReportBuilder->getReport($employee); default: throw new IllegalArgumentException(); }
  34. 34. function getReport($type, $employee) { switch ($type): case 'xml' return $this->xmlReportBuilder->getReport($employee); case 'json' return $this->jsonReportBuilder->getReport($employee); default: throw new IllegalArgumentException(); } OCP
  35. 35. XmlReportBuilder + getReport(..) + getName() SalaryReportBuilder + addBuilder(ReportInterface) + getReport($type) ReportBuilderInterface + getReport(..) + getName JsonReportBuilder + getReport(..) + getName()
  36. 36. function getReport($type, $employee) { foraech ($this->reportBuilders as $builder) { if ($builder->getName() == $type) { return $builder->getReport($employee); } } throw new IllegalArgumentException(); }
  37. 37. The Liskov Substitution Principle Derived classes must be substitutable for their base classes.
  38. 38. app rectangle
  39. 39. app rectangle square
  40. 40. class Square { public function setHeight($height) { $this->height = $height; parent::setWidth($height); } public function setWidth($width) { $this->width = $width; parent::setHeight($width); } }
  41. 41. if ($rectangle instanceof Square) { //.. } else { //.. }
  42. 42. app rectangle square
  43. 43. OOP není modelování skutečného světa, ale jeho reprezentací
  44. 44. class Rectangle { public function getHeight() {} public function getWidth() {} public function setHeight() {} public function setWidth() {} } class Square { public function getSize() {} public function setSize() {} }
  45. 45. The Interface Segregation Principle Make fine grained interfaces that are client specific
  46. 46. m interface n Client specific?
  47. 47. m interface n
  48. 48. Fine grained? interface FileInterface { public function changeName() public function changeOwner() }
  49. 49. class DropboxFile implements FileInterface { public function changeName() { } public function changeOwner() { // don’t need this method } }
  50. 50. interface FileInterface { public function changeName() } interface SupportsChangeOfOwnershipInterface { public function changeOwner() }
  51. 51. SRP OCP LSP ISP DIP

×