Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
SOLID | Štěpán Zikmund
krása
• 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..
no, mohly by…
source code
💩
Rigidity
Fragilitiy
Imobility
Coupling? How?
OOP
SOLID
Single Responsibility Principle
Open Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Depend...
– Uncle Bob
„OOP is about managing dependency by
selectively inverted some key dependencies in
your architecture to preven...
The Dependency
Inversion Principle
Depend on abstractions, not on concretions
m
n
m n
m interface
n
class Authentication
{
private $userProvider;
public function __construct(UserProvider $userProvider)
{
$this->userProvide...
class Authentication
{
private $userProvider;
public function __construct(UserProviderInterface $userProvider)
{
$this->us...
The Single
Responsibility Principle
A class should have one, and only one, reason to
change
Symptomy
• účel třídy nejde pospat bez spojek a, nebo
• třída obsahuje velké množství properties a
public method
• třída o...
Řešení
• kompozice
• event listener
• …
Employee
+ getSalary()
+ getName()
+ setSalary()
+ setName()
+ getSalaryReport()
Employee
+ getSalary()
+ getName()
+ setSalary()
+ setName()
SalaryReportBuilder
+ getReport(Employee $employee)
The Open Closed
Principle
You should be able to extend a classes behaviour,
without modifying it
Pro přidání nové featury
nechcete editovat stávající
kód, ale vytvořit nový
function doSomething($howToDoIt)
{
if ($howToDoIt == 'something') {
return someBehaviour();
} else if ($howToDoIt == 'some...
Symptomy
• switch statement
• třída zná více různých service se stejným
interfacem nebo s podobným účelem
Employee
+ getSalary()
+ getName()
+ setSalary()
+ setName()
SalaryReportBuilder
+ getXmlReport(Employee $employee)
+ getJ...
Employee
+ getSalary()
+ getName()
+ setSalary()
+ setName()
SalaryReportBuilder
+ getXmlReport(Employee $employee)
+ getJ...
XmlReportBuilder
+ getXmlReport(..)
SalaryReportBuilder
+ getReport($type)
JsonReportBuilder
+ getJsonReport(..)
function getReport($type, $employee)
{
switch ($type):
case 'xml'
return $this->xmlReportBuilder->getReport($employee);
ca...
function getReport($type, $employee)
{
switch ($type):
case 'xml'
return $this->xmlReportBuilder->getReport($employee);
ca...
XmlReportBuilder
+ getReport(..)
+ getName()
SalaryReportBuilder
+ addBuilder(ReportInterface)
+ getReport($type)
ReportBu...
function getReport($type, $employee)
{
foraech ($this->reportBuilders as $builder) {
if ($builder->getName() == $type) {
r...
The Liskov
Substitution Principle
Derived classes must be substitutable for their base classes.
app rectangle
app rectangle
square
class Square
{
public function setHeight($height)
{
$this->height = $height;
parent::setWidth($height);
}
public function ...
if ($rectangle instanceof Square) {
//..
} else {
//..
}
app rectangle
square
OOP není modelování
skutečného světa, ale
jeho reprezentací
class Rectangle
{
public function getHeight() {}
public function getWidth() {}
public function setHeight() {}
public funct...
The Interface
Segregation Principle
Make fine grained interfaces that are client specific
m interface
n
Client specific?
m interface
n
Fine grained?
interface FileInterface
{
public function changeName()
public function changeOwner()
}
class DropboxFile implements FileInterface
{
public function changeName() { }
public function changeOwner()
{
// don’t nee...
interface FileInterface
{
public function changeName()
}
interface SupportsChangeOfOwnershipInterface
{
public function ch...
SRP
OCP
LSP
ISP
DIP
Čtvrtkon #53 - Štěpán Zikmund
Čtvrtkon #53 - Štěpán Zikmund
Nächste SlideShare
Wird geladen in …5
×

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

234 Aufrufe

Veröffentlicht am

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.

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Č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

×