构造函数内部的逻辑

时间:2016-05-10 17:13:13

标签: php class oop design-patterns constructor

__constructor中使用逻辑是否是个好主意?

public class someClass
{
    public function __construct()
    {
        //some logic here
    }

到目前为止,我认为它很好;然而,this reddit comment暗示了相反的结果。

3 个答案:

答案 0 :(得分:4)

作为@Barry wrote,其中一个原因与单元测试有关,但它只是一个副作用。

让我们采取最糟糕的情况:你有一个"类",它只有一个构造函数(你可能已经看过这样的例子)。所以...为什么它甚至写成一个班级?你不能改变它的状态,你不能要求它执行任何任务而你无法检查它是否做了你想要的。您也可以使用线性文件并将其包含在内。这只是坏

现在有一个更合理的例子:让我们假设你有一个类,它在构造函数中有一些验证检查并在其中建立一个新的DB连接。然后它还有一些公共方法来执行各种任务

最明显的问题是"建立新的数据库连接" - 无法在课外影响或阻止此操作。而这个新的连接正在进行谁知道什么(可能加载一些配置并尝试抛出异常)。它也构成了一种隐藏的依赖关系,在没有检查类的代码的情况下,你没有任何指示。

代码存在类似的问题,它会对传递的参数进行验证和/或转换。它构成了隐藏的逻辑(因此违反了PoLA。它也使你的类更难扩展,因为你可能希望保留某些的验证功能,同时替换其他部分。而你没有那个选项。因为每当你创建一个新实例时,所有代码都会运行。

底线就是这样 - 构造函数中的逻辑被视为"代码气味"。它不是致命的罪(比如在全局变量上使用eval()),但它是设计糟糕的标志。

答案 1 :(得分:3)

不,这不是自动化测试的好主意。在测试时,您希望能够"模拟"允许您控制逻辑的对象,尤其是在接口方面。因此,如果您在构造函数中放置逻辑,则很难进行测试,因为您必须使用 real 对象。

这是一个非常精彩的演讲,详细说明为什么不把逻辑放在构造函数中(由Misko Hevery进行谷歌技术讲座) https://www.youtube.com/watch?v=RlfLCWKxHJ0

答案 2 :(得分:1)

我认为这个问题有点不清楚,因为我不认为__construct是逻辑上不好的地方,问题是你在这里有什么样的逻辑?某种逻辑可以放在构造函数中,但是另一种逻辑不能存在于构造函数中。例如Symfony Response - 构造函数包含逻辑,但此逻辑对于此对象是必需的,并且此构造函数不会进行一些隐式操作。这个构造函数不打印输出内容或其他内容 - 所以这是一个很好的例子(对我而言)......

同样重要的是要理解你的对象必须做什么,如果它是不可变对象 - 构造函数可以有一点点另一个视图......

遵循SOLID和适当的设计模式也很重要......