Я читаю статью о конструкторах, делающих слишком много работы. Один абзац гласит
В объектно-ориентированном стиле, где зависимости, как правило, инвертируются, конструктор имеет другую и более спартанскую роль. Его единственная задача - убедиться, что объект инициализируется в состояние, в котором он удовлетворяет своим основным инвариантам (другими словами, он гарантирует, что экземпляр объекта запускается в правильном состоянии и не более).
Вот базовый пример класса. При создании класса я передаю HTML-код, который необходимо проанализировать, чтобы затем установить свойства класса.
OrderHtmlParser
{
protected $html;
protected $orderNumber;
public function __construct($html)
{
$this->html = $html;
}
public function parse()
{
$complexLogicResult = $this->doComplexLogic($this->html);
$this->orderNumber = $complexLogicResult;
}
public function getOrderNumber()
{
return $this->orderNumber;
}
protected function doComplexLogic($html)
{
// ...
return $complexLogicResult;
}
}
Я вызываю его с помощью
$orderparser = new OrderHtmlParser($html);
$orderparser->parse()
$orderparser->getOrderNumber();
Я использую функцию parse
, потому что я не хочу, чтобы конструктор выполнял какую-либо логику как в предыдущей статье, так и в в этой статье. это ужасная практика.
public function __construct($html)
{
$this->html = $html;
$this->parse(); // bad
}
Однако, если я не использую метод parse
, тогда все мои свойства (в этом примере только один) вернут null
.
Известно ли это как объект в "недопустимом состоянии"?
Кроме того, похоже, что мой метод parse является скрытой функцией initialise
, которая также считается плохой другой статьей (хотя я не уверен, что это только тогда, когда конструктор вызывает этот метод, когда он вручную или оба). Несмотря на это, инициализирующий метод все еще выполняет сложную логику до установки свойства, которое должно произойти до того, как геттеры могут быть надежно вызваны.
Так что либо я неправильно понимаю эти статьи, либо эти статьи подталкивают меня к мысли, что, возможно, моя общая реализация этого простого класса неверна.