而不是使用这样的界面:
public interface IStartable
{
void Start();
void Stop();
}
我通常只是使对象的构造函数运行Start()代码,并实现IDisposable,以便dispose方法运行Stop()代码。
这只是风格问题吗?或者我没有像IStartable这样的东西错过了一些重要的东西?我所看到的只是额外的复杂性,因为你必须维持它的启动/停止状态。
使用启动/停止与使用ctor / dispose的优缺点是什么,特别是在IoC / DI容器的上下文中?
编辑:很棒的答案,你说服我使用一个可启动对象的界面。我不能确定谁的答案是最好的,所以我会接受24小时后得票最多的人。
答案 0 :(得分:6)
使用界面的一般优势是它们是自我描述和自我广告。如果没有接口,则无法询问对象,“您可以启动并停止吗?”相反,如果使用界面,则可以查询对象以查看哪些对象将响应这些类型的消息。然后,您可以安全地保证这些对象已实现接口封装的功能。
答案 1 :(得分:4)
一般来说,构造函数应该生成一个正确初始化的对象
,仅此而已!
答案 2 :(得分:2)
当你说Start()时,它可能取决于你的意思。但一般来说,将对象初始化与例程执行混合(特别是有状态和/或长时间执行!)会违反SoC。
这也留下了很多含糊之处。对于消费者而言,对于给定的对象,当我们调用ctor时,我们如何知道它是“开始”的? “对于这个没有签订合同的特定对象,我必须让作者希望它符合我的期望”?界面使动作的存在和可用性显式化。