Принципы проектирования s.o.l.i.d
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