Принципы проектирования s.o.l.i.d

Download Принципы проектирования S.O.L.I.D

If you can't read please download the document

Upload: andreygeonya

Post on 16-Apr-2017

19.202 views

Category:

Technology


0 download

TRANSCRIPT

S.O.L.I.D

:

S - Single responsibility principle (SRP)O - Open/closed principle (OCP)L - Liskov substitution principle (LSP)I - Interface segregation principle (ISP)D - Dependency inversion principle (DIP)

?

, () .

.

(SRP)

.

? ( - ).

SRP God Object

:

:

/ (OCP)

(, , ) , .

? -.

class Logger {public function log($text) {// ( )}}

class Product {private $_logger;public function __construct() {$this->_logger = new Logger();}

/* */public function sale() {// // $this->_logger->log('Sale time: '. time());}}

?

?! !
:

class DBLogger {public function log($text) {// - ( )}}

class Product {private $_logger;public function __construct() {// Product, ( SRP?)$this->_logger = new DBLogger();}/* */public function sale() {// // ...// $this->_logger->log('Sale time: '. time());}}

( )

interface ILogger {public function log($text);}

class Logger implements ILogger {public function log($text) {// - ( )}}

class DBLogger implements ILogger {public function log($text) {// - ( )}}

class Product {private $_logger;public function __construct(ILogger $logger) {$this->_logger = $logger;}/* */public function sale() {// // ...// $this->_logger->log('Sale time: '. time());}}

(LSP)

, .

? , , .

( )

/* */abstract class Duck{private $_batteryStatus = 100; // (%)private $_steps = 0; // (.)public function getBatteryStatus() {return $this->_batteryStatus;}public function setBatteryStatus($value) {$this->_batteryStatus = $value;}public function getSteps() {return $this->_steps;}public function setSteps($value) {$this->_steps = $value;}// ( -)abstract public function move();abstract public function quack();}

(, )

/* */class AmericanDuck extends Duck{public function move() {$this->setSteps($this->getSteps() + 1); // $this->setBatteryStatus($this->getBatteryStatus() - 20); // echo " {$this->getSteps()} ( : {$this->getBatteryStatus()}%) \n";}public function quack() {echo ", ! \n";}}

/* */class ChinaDuck extends Duck{public function move() {$this->setSteps($this->getSteps() + 1); // $this->setBatteryStatus($this->getBatteryStatus() - 10); // ( )echo " {$this->getSteps()} ( : {$this->getBatteryStatus()}%) \n";}public function quack() {echo ", , -, ! \n";}}

// $duckList = array(new AmericanDuck(), new ChinaDuck());

// foreach($duckList as $duck) {$duck->quack(); // while ($duck->getBatteryStatus() > 0) { // , $duck->move();sleep(1);}echo "\n";}

!

/* . , */class BrainyDuck extends Duck{public function move() {$this->setSteps($this->getSteps() + 1); // echo " {$this->getSteps()} \n";}public function quack() {echo ", ! \n";}public function getBatteryStatus() {throw new Exception(' ? , !');}public function setBatteryStatus() {throw new Exception(' ? , !');}}

Fail

// $duckList = array(new AmericanDuck(), new ChinaDuck(), new BrainyDuck());

// foreach($duckList as $duck) {$duck->quack(); // while ($duck->getBatteryStatus() > 0) { // , $duck->move();sleep(1);}echo "\n";}

(ISP)

, .

? , , , , .


( )

interface IMegaTrsansformer {public function transformToCar();public function transformToShip();public function transformToPlane();}

class MegaTrsansformer implements IMegaTrsansformer {public function transformToCar() {echo ' !';}public function transformToShip() {echo ' !';}public function transformToPlane() {echo ' !';}}

( )

class TaxiTrsansformer implements IMegaTrsansformer {public function transformToCar() {echo ' !';}public function transformToShip() {throw new Exception(' ');}public function transformToPlane() {throw new Exception(' ');}}class StelthTrsansformer implements IMegaTrsansformer {public function transformToCar() {throw new Exception(' ');}public function transformToShip() {throw new Exception(' ');}public function transformToPlane() {echo ' !';}}class IcebreakerTrsansformer implements IMegaTrsansformer {public function transformToCar() {throw new Exception(' ');}public function transformToShip() {echo ' !';}public function transformToPlane() {throw new Exception(' ');}}

interface ICarTrsansformer {public function transformToCar();}

interface IShipTrsansformer {public function transformToShip();}

interface IPlaneTrsansformer {public function transformToPlane();}

class MegaTrsansformer implements ICarTrsansformer, IShipTrsansformer, IPlaneTrsansformer {public function transformToCar() {echo ' !';}public function transformToShip() {echo ' !';}public function transformToPlane() {echo ' !';}}

class TaxiTrsansformer implements ICarTrsansformer {public function transformToCar() {echo ' !';}}

class StelthTrsansformer implements IPlaneTrsansformer {public function transformToPlane() {echo ' !';}}

class IcebreakerTrsansformer implements IShipTrsansformer {public function transformToShip() {echo ' !';}}

(DIP)

.

.


(X Y + )

:- ;- ;- .

class siteMapBilder {private $_dataStorage;private $_webGrabber;public function __construct() {$this->_dataStorage = new FileDataStorage();$this->_webGrabber = new CurlWebGrabber();}// ... - }

SiteMapBuilder
( )

class siteMapBilder {private $_dataStorage;private $_webGrabber;public function __construct(WebGrabber $dataStorage, DataStorage $webGrabber) {$this->_dataStorage = $dataStorage;$this->_webGrabber = $webGrabber;}// ... - }

... - , .

TopLayer DeepLayer,

?

*

( ): http://msdn.microsoft.com/ru-ru/magazine/cc337885.aspx

( ): http://habrahabr.ru/blogs/programming/83269/

(S.O.L.I.D.) ( ): http://blog.byndyu.ru/2009/10/solid.html

SRP (Robert C. Martin): www.objectmentor.com/resources/articles/srp.pdf

OCP (Robert C. Martin): http://www.objectmentor.com/resources/articles/ocp.pdf

LSP (Robert C. Martin): http://www.objectmentor.com/resources/articles/lsp.pdf

ISP (Robert C. Martin): http://www.objectmentor.com/resources/articles/isp.pdf

DIP (Robert C. Martin): http://www.objectmentor.com/resources/articles/dip.pdf

* :-)

Muokkaa otsikon tekstimuotoa napsauttamalla

Muokkaa jsennyksen tekstimuotoa napsauttamallaToinen jsennystasoKolmas jsennystasoNeljs jsennystasoViides jsennystasoKuudes jsennystasoSeitsems jsennystasoKahdeksas jsennystasoYhdekss jsennystaso