上下文:.NET,C#,但问题是关于OOP。
当我编写一个应该充当“服务”的类时,比如套接字监听器或计时器,我在编写它时会看到两种方法:
创建构造函数,并在构造函数内立即启动后台任务。例如:
public class MyTimer
{
private readonly TimeSpan interval;
public MyTimer(TimeSpan interval)
{
this.interval = interval;
StartTicking();
}
private void StartTicking()
{
// do the ticking logic
}
}
创建一个接受类设置的构造函数,并添加一个显式启动方法:
public class MyTimer
{
private readonly TimeSpan interval;
public MyTimer(TimeSpan interval)
{
this.interval = interval;
}
public void StartTicking()
{
// do the ticking logic
}
}
我倾向于认为第二种方法更好:
一个。构造函数仅用于创建有效的实例,使其保持最小和干净。
B中。实际使用我的班级的开发人员不那么惊讶。
℃。硬件资源没有被过度使用,因为“服务”类不会立即使用它们。
你怎么看?它只是编码风格的问题,还是不仅仅是编码风格?答案 0 :(得分:1)
保持构造函数最小化,并要求调用代码调用特定函数,以便执行除最简单初始化之外的任何操作。这就是Stopwatch类在.NET中所做的事情。
除了避免调用构造函数的人出现意外之外,这还允许您更好地使用依赖注入(即将您的类注入到需要它的类的构造函数中,但是不想正确使用它方式)。
我还发现某些类型的bug在构造函数中比在其他方法中更难捕获。
答案 1 :(得分:0)
我见过的几乎所有服务类都暴露了启动和停止它的方法。如果是自动启动,通常非常明确(类名可能是MyAutostartingTimer或其他东西..)
答案 2 :(得分:0)
不要在构造函数中开始运行。