+ All Categories
Home > Technology > Čtvrtkon #53 - Štěpán Zikmund

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

Date post: 12-Apr-2017
Category:
Upload: pehapkari
View: 112 times
Download: 0 times
Share this document with a friend
53
SOLID | Štěpán Zikmund
Transcript
Page 1: Čtvrtkon #53 - Štěpán Zikmund

SOLID | Štěpán Zikmund

Page 2: Čtvrtkon #53 - Štěpán Zikmund
Page 3: Čtvrtkon #53 - Štěpán Zikmund

krása

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

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

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

no, mohly by…

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

source code

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

💩

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

Rigidity

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

Fragilitiy

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

Imobility

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

Coupling? How?

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

OOP

Page 13: Čtvrtkon #53 - Štěpán Zikmund
Page 14: Čtvrtkon #53 - Štěpán Zikmund

SOLID

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

Single Responsibility Principle Open Closed Principle Liskov Substitution Principle Interface Segregation Principle Dependency Inversion Principle

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

– Uncle Bob

„OOP is about managing dependency by selectively inverted some key dependencies in your architecture to prevent rigidity, fragility, not

reusability“

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

The Dependency Inversion Principle

Depend on abstractions, not on concretions

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

m

n

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

m n

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

m interface

n

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

class Authentication { private $userProvider;

public function __construct(UserProvider $userProvider) { $this->userProvider = $userProvider; } }

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

class Authentication { private $userProvider;

public function __construct(UserProviderInterface $userProvider) { $this->userProvider = $userProvider; } }

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

The Single Responsibility Principle

A class should have one, and only one, reason to change

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

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

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

Řešení

• kompozice

• event listener

• …

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

Employee

+ getSalary() + getName() + setSalary() + setName() + getSalaryReport()

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

Employee

+ getSalary() + getName() + setSalary() + setName()

SalaryReportBuilder

+ getReport(Employee $employee)

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

The Open Closed Principle

You should be able to extend a classes behaviour, without modifying it

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

Pro přidání nové featury nechcete editovat stávající

kód, ale vytvořit nový

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

function doSomething($howToDoIt) { if ($howToDoIt == 'something') { return someBehaviour(); } else if ($howToDoIt == 'somethingOther') { return someOtherBehaviour(); } else { throw new \IllegalArgumentException(); } }

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

Symptomy

• switch statement

• třída zná více různých service se stejným interfacem nebo s podobným účelem

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

Employee

+ getSalary() + getName() + setSalary() + setName()

SalaryReportBuilder

+ getXmlReport(Employee $employee) + getJsonReport(Employee $employee)

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

Employee

+ getSalary() + getName() + setSalary() + setName()

SalaryReportBuilder

+ getXmlReport(Employee $employee) + getJsonReport(Employee $employee)SRP

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

XmlReportBuilder

+ getXmlReport(..)

SalaryReportBuilder

+ getReport($type)

JsonReportBuilder

+ getJsonReport(..)

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

function getReport($type, $employee) { switch ($type): case 'xml' return $this->xmlReportBuilder->getReport($employee); case 'json' return $this->jsonReportBuilder->getReport($employee); default: throw new \IllegalArgumentException(); }

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

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

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

XmlReportBuilder

+ getReport(..) + getName()

SalaryReportBuilder

+ addBuilder(ReportInterface) + getReport($type)

ReportBuilderInterface

+ getReport(..) + getName

JsonReportBuilder

+ getReport(..) + getName()

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

function getReport($type, $employee) { foraech ($this->reportBuilders as $builder) { if ($builder->getName() == $type) { return $builder->getReport($employee); } }

throw new \IllegalArgumentException(); }

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

The Liskov Substitution Principle

Derived classes must be substitutable for their base classes.

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

app rectangle

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

app rectangle

square

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

class Square { public function setHeight($height) { $this->height = $height; parent::setWidth($height); } public function setWidth($width) { $this->width = $width; parent::setHeight($width); } }

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

if ($rectangle instanceof Square) { //.. } else { //.. }

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

app rectangle

square

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

OOP není modelování skutečného světa, ale

jeho reprezentací

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

class Rectangle { public function getHeight() {} public function getWidth() {} public function setHeight() {} public function setWidth() {} }

class Square { public function getSize() {} public function setSize() {} }

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

The Interface Segregation Principle

Make fine grained interfaces that are client specific

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

m interface

n

Client specific?

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

m interface

n

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

Fine grained?

interface FileInterface { public function changeName() public function changeOwner() }

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

class DropboxFile implements FileInterface { public function changeName() { } public function changeOwner() { // don’t need this method } }

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

interface FileInterface { public function changeName() }

interface SupportsChangeOfOwnershipInterface { public function changeOwner() }

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

SRP OCP LSP ISP DIP


Recommended