User Tools

Site Tools


o

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
o [2022/03/09 13:21] – создано chifeko [2023/09/14 06:06] (current) – external edit 127.0.0.1
Line 11: Line 11:
  
 //index.php:// //index.php://
 +
 +
 +<code>
 +$logger  = new Logger();
 +$product = new Product($logger);
 +$product->setPrice(10);
 +</code>
 +
 +//product.php//
 +
 +<code>
 +protected $logger;
 +     
 +    public function __construct(Logger $logger) {
 +        $this->logger = $logger;
 +    }
 + 
 +    public function setPrice($price) {
 +        try {
 +            // save price in db
 +        } catch (DbException $e) {
 +            $this->logger->log($e->getMessage());
 +        }
 +    }
 +</code>
 +
 +
 +//logger.php//
 +
 +<code>
 +class Logger {
 +    private function saveToFile($message) {
 +        //...
 +    }
 +    public function log($message) {
 +        //...
 +        $this->saveToFile($message);
 +    }
 +}
 +</code>
 +
 +В данном примере мы имеем два класса. Класс Product который отвечает за работу с товаром. 
 +И класс Logger цель которого логировать ошибки в текстовый файл.
 +
 +Задача:
 +Сделать логирование не в текстовый файл, а в базу данных.
 +(либо логироваться в БД должен только класс Product, но другие классы, которые используют Logger, 
 +должны логировать в файл как и прежде)
 +
 +В данном примере, для того чтобы реализовать требования заказчика, мы нарушаем принцип открытости/закрытости.
 +Так как будем вынуждены модифицировать существующие классы.
 +Если функционал нашей системы не сложен, то этим можно пренебречь, 
 +но если система у нас большая, то изменения в классах могут вызвать непредсказуемые ошибки.
 +
 +Для того чтобы следовать принципу открытости/закрытости организовать нашу систему можно следующим образом.
 +
 +//LoggerInterface.php://
 +
 +<code>
 +interface ILogger {
 +    public function log();
 +}
 +</code>
 +
 +//logger.php://
 +
 +<code>
 +class FileLogger implements ILogger {
 + 
 +    private function saveToFile($message) {
 +        //...
 +    }
 +    public function log($message) {
 +        //...
 +        $this->saveToFile($message);
 +    }
 +}
 + 
 +class DBLogger implements ILogger {
 + 
 +    private function saveToDB($message) {
 +        //...
 +    }
 +    public function log($message) {
 +        //...
 +        $this->saveToDB($message);
 +    }
 +}
 +</code>
 +
 +//product.php://
 +
 +<code>
 +protected $logger;
 +     
 +    public function __construct(ILogger $logger) {
 +        $this->logger = $logger;
 +    }
 + 
 +    public function setPrice($price) {
 +        try {
 +            // save price in db
 +        } catch (DbException $e) {
 +            $this->logger->log($e->getMessage());
 +        }
 +    }
 +</code>
 +
 +
 +//index.php://
 +
 +<code>
 +$logger  = new DBLogger();
 +$product = new Product($logger);
 +$product->setPrice(10);
 +</code>
 +
 +
o.1646832061.txt.gz · Last modified: 2023/09/14 06:06 (external edit)