应该在构造函数中执行可能需要一些时间的操作,还是应该构造对象然后稍后进行初始化.
例如,当构造表示目录结构的对象时,应该在构造函数中完成对象及其子对象的填充.显然,目录可以包含目录,而目录又可以包含目录等.
这个优雅的解决方案是什么?
总结一下:
至少,构造函数需要将对象配置为其不变量为true的点.
您选择的不变量可能会影响您的客户.(对象是否承诺随时可以访问?或者仅在某些状态下?)构建者可以预先处理所有设置可能会使生活更简单为班级的客户.
长期运行的构造函数本身并不坏,但在某些情况下可能会很糟糕.
对于涉及用户交互的系统,任何类型的长时间运行方法都可能导致响应性差,应该避免.
延迟计算直到构造函数之后可能是有效的优化; 可能结果是没有必要执行所有工作.这取决于应用,不应过早确定.
总的来说,这取决于.
您通常不希望构造函数进行任何计算.使用该代码的其他人不会期望它比基本设置更多.
对于你正在谈论的目录树,"优雅"的解决方案可能不是在构造对象时构建完整的树.相反,按需构建它.使用你的对象的人可能并不真正关心子目录中的内容,所以首先让你的构造函数列出第一级,然后如果有人想要下降到特定的目录,那么在他们请求时构建树的那一部分它.
所需的时间不应成为不将某些东西放入构造函数的理由.您可以将代码本身放入私有函数中,并从构造函数中调用它,只是为了使构造函数中的代码保持清晰.
但是,如果您想要做的事情不需要给对象一个定义的条件,并且您可以在以后第一次使用时执行这些操作,这将是一个合理的论据,可以将它放出来并在以后执行.但是不要让它依赖于你的类的用户:这些东西(按需初始化)必须对你的类的用户完全透明.否则,对象的重要不变量可能很容易破坏.
这取决于(典型的CS答案).如果您在启动时为长时间运行的程序构造对象,那么在构造函数中执行大量工作就没有问题.如果这是预期快速响应的GUI的一部分,则可能不合适.与往常一样,最好的答案是首先尝试最简单的方式,从那里进行配置和优化.
对于这种特定情况,您可以对子目录对象进行延迟构造.仅为顶级目录的名称创建条目.如果访问它们,则加载该目录的内容.当用户演示目录结构时再次执行此操作.
构造函数最重要的工作是为对象提供初始有效状态.在我看来,构造函数最重要的期望是构造函数应该没有副作用.