什么定义了有效的对象状态?
我正在阅读一篇关于构造函数做太多工作的文章。一段内容如下:
在面向对象的样式中,依赖项倾向于反转,构造函数具有不同且更斯巴达的角色。它唯一的工作是确保对象初始化为满足其基本不变量的状态(换句话说,它确保对象实例以有效状态开始,仅此而已)。
下面是一个类的基本示例。在创建类时,我传入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
这被称为处于“无效状态”的对象吗?
此外,它有点感觉我的解析方法是一个伪装的函数,这也被另一篇文章认为是坏的(尽管我不确定这是否仅在构造函数调用该方法时,当手动调用时或两者兼而有之)。无论如何,初始化方法在设置属性之前仍然在做一些复杂的逻辑 - 这需要在可靠地调用getters之前发生。initialise
因此,要么是我误解了这些文章,要么这些文章促使我认为也许我对这个简单类的整体实现是不正确的。