SOLID - Принцип единственной обязанности (ответственности)

Принципы проектирования классов SOLID в PHP

Принцип единственной обязанности (ответственности)(Single responsibility principle).

Этот принцип первый в списке принципов SOLID.
Обозначает, что любой объект должен иметь лишь одну обязанность и эта обязанность должна быть полностью реализована в классе объекта (инкапсулирована).
 
Из этого следует что должна быть одна причина чтобы вносить изменения в объект.
 
Пример
index.php
	$product = new Product();
	$product->setPrice(10);

	...
product.php
	class Product {
	public function setPrice($price) {
	    try {
	        // save price in db
	    } catch (DbException $e) {
	        $this->logError($e->getMessage());
	    }
	}

	public function logError($error) {
	    // save error message
	    }
	}

Класс Product нарушает принцип единственной ответственности, так как он имеет две ответственности:

  • 1) Работа с продуктом
  • 2) Логирование ошибок
То есть у нас могут быть две причины вносить в него изменения. Для того чтобы это исправить нам требуется вынести обязанность по логированию ошибок в отдельный класс (создаем файл logger.php):

logger.php
	class Logger {
	    public function log($message) {
	        //...
	        $this->saveToFile($message);
	    }
	}

Теперь изменим файл index.php:

index.php
	$logger  = new Logger();
	$product = new Product($logger);
	$product->setPrice(10);
	
Изменим класс Product:
product.php
class Product {
	private $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());
	    }
	}
}

Добавить отзыв (пожелание, комментарий)

Чижик Пыжик, Кишинёв
Спасибо. Пока очень доходчиво объясняете.