什么事情最好不要在构造函数中完成?

Par*_*der 7 php oop constructor

我首先提出了一个问题:"在构造函数上执行单元测试的最佳方法是什么(例如,PHP5中的__construct())",但在阅读相关问题时,我看到几条评论似乎表明设置成员变量或在构造函数中执行任何复杂的操作都是no-nos.

这里讨论的类的构造函数接受一个参数,对它执行一些操作(确保它通过嗅探测试,并在必要时进行转换),然后将其存储在成员变量中.

我认为这样做的好处是:

1)每当实例化该类的对象时,客户端代码将始终确定具有该成员变量的值,并且

2)它在客户端代码中保存了一个步骤(其中一个可能被遗漏),例如,

$Thing = new Thing;
$Thing->initialize($var);
Run Code Online (Sandbox Code Playgroud)

什么时候我们可以做到这一点

$Thing = new Thing($var);
Run Code Online (Sandbox Code Playgroud)

并完成它.

这是不是吗?如果是这样的话?

gnu*_*nud 16

我的经验法则是在构造函数完成后,对象应该可以使用了.但是经常有很多选项可以在之后进行调整.

我的做和卖的清单:

  • 构造函数应该为对象设置基本选项.
  • 他们应该创建辅助对象的实例.
  • 他们应该 aqquire资源(文件,插座,...),除非对象显然是身边的一些资源的包装.

当然,没有例外的规则.重要的是你要考虑你的设计和你的选择.使对象使用自然 - 包括错误报告.


Tom*_*Tom 8

这在C++讨论中出现了很多,我得到的一般结论是这样的:

如果对象没有获取任何外部资源,则必须构造函数初始化成员.这涉及在构造函数中完成所有工作.

  • (x,y)坐标(或者实际上任何其他只是一个美化元组的结构)
  • 美国州简称查找表

如果一个对象获得,它可以控制的资源,他们可以被分配构造函数:

  • 打开文件描述符
  • 分配内存
  • handle /指向外部库的指针

如果对象获取了无法完全控制的资源,则必须在构造函数之外分配它们:

  • TCP连接
  • 数据库连接
  • 弱参考

总有例外,但这涵盖了大多数情况.


Gar*_*hby 6

构造函数用于初始化对象,所以

$Thing = new Thing($var);
Run Code Online (Sandbox Code Playgroud)

完全可以接受.