新建的课程在施工期间是否应该“开始”?

时间:2011-06-30 22:39:00

标签: oop constructor startup

上下文:.NET,C#,但问题是关于OOP。

当我编写一个应该充当“服务”的类时,比如套接字监听器或计时器,我在编写它时会看到两种方法:

  1. 创建构造函数,并在构造函数内立即启动后台任务。例如:

    public class MyTimer
    {
        private readonly TimeSpan interval;
    
        public MyTimer(TimeSpan interval)
        {
            this.interval = interval;
            StartTicking();
        }
    
        private void StartTicking()
        {
            // do the ticking logic
        }
    }
    
  2. 创建一个接受类设置的构造函数,并添加一个显式启动方法:

    public class MyTimer
    {
        private readonly TimeSpan interval;
    
        public MyTimer(TimeSpan interval)
        {
            this.interval = interval;
        }
    
        public void StartTicking()
        {
            // do the ticking logic
        }
    }
    
  3. 我倾向于认为第二种方法更好:

    一个。构造函数仅用于创建有效的实例,使其保持最小和干净。

    B中。实际使用我的班级的开发人员不那么惊讶。

    ℃。硬件资源没有被过度使用,因为“服务”类不会立即使用它们。

    你怎么看?它只是编码风格的问题,还是不仅仅是编码风格?

3 个答案:

答案 0 :(得分:1)

保持构造函数最小化,并要求调用代码调用特定函数,以便执行除最简单初始化之外的任何操作。这就是Stopwatch类在.NET中所做的事情。

除了避免调用构造函数的人出现意外之外,这还允许您更好地使用依赖注入(即将您的类注入到需要它的类的构造函数中,但是不想正确使用它方式)。

我还发现某些类型的bug在构造函数中比在其他方法中更难捕获。

答案 1 :(得分:0)

我见过的几乎所有服务类都暴露了启动和停止它的方法。如果是自动启动,通常非常明确(类名可能是MyAutostartingTimer或其他东西..)

答案 2 :(得分:0)

不要在构造函数中开始运行。

  • 您的API的用户不会期望这样,并且会使您的课程更难使用
  • 从异常处理的角度来看,您希望能够报告构造对象时发生的错误,而不是执行期间发生的错误。
  • 如果您想要执行类似静态工厂单例模式的操作,它会阻止共享对象的实例。
  • 我想第二个StriplingWarrior的观点是有很多很好的理由,比如依赖注入,需要先创建对象,以便其他类可以在以后运行它。