Oop 在类本身还是在类';建造师?

Oop 在类本身还是在类';建造师?,oop,instantiation,variable-assignment,Oop,Instantiation,Variable Assignment,这是一种设计问题,我相信有人会用两种方式来解决。但在您看来,在类中还是在构造函数中指定变量更好?例如(无论是语法还是语言,这只是为了解释): 或 请忽略不同语言和语法的混合。。。哪一个更好?为什么?内联(第一个选项): 它更具可读性 您不必在每个构造函数中重复它 如果您的语言中有这样的东西,您可以使用初始值设定项块。它们看起来像构造函数,但不需要多次定义。在Java中,它们如下所示: { var1 = 5; varTime = now(); } 在中,倾向于: 在类本身中

这是一种设计问题,我相信有人会用两种方式来解决。但在您看来,在类中还是在构造函数中指定变量更好?例如(无论是语法还是语言,这只是为了解释):

请忽略不同语言和语法的混合。。。哪一个更好?为什么?

内联(第一个选项):

  • 它更具可读性
  • 您不必在每个构造函数中重复它
  • 如果您的语言中有这样的东西,您可以使用初始值设定项块。它们看起来像构造函数,但不需要多次定义。在Java中,它们如下所示:

    {
        var1 = 5;
        varTime = now();
    }
    
在中,倾向于:

  • 在类本身中设置默认的常量值
  • 以及依赖于构造函数中其他内容(如当前时间)的值

i、 例如,我倾向于使用这样的东西(合并您的两个示例):


但是我更喜欢的语言是PHP,它不允许我在类声明中设置非常量值,所以我的方法可能有点偏颇。

这里的主要思想是在构造函数中为类输入任何启动或初始化代码。与此相反,从逻辑上讲,在析构函数中放入任何清理代码。

从可测试性的角度来看,这两种方法都有问题。除了常数,您应该有一个接受这些作为参数的构造函数,或者一个允许您设置支持字段的属性。

通常,我会创建一个“完整”构造函数,它为您提供对类的完全控制,以及一个空/默认构造函数,它调用另一个指定默认参数的构造函数。这样,所有内容都在一个地方,我不必查看支持字段来了解构建时的情况。

这实际上取决于您使用的语言。例如,在PHP中,只能在类中立即定义常量。但是,如果您希望实现跨语言兼容性,那么最好将值分配给构造函数中的所有类变量。

所有建议似乎都是有效的。。。我假设没有标准实践?是的,
private readonly int TIME_STAMP=NOW()会更好,因为我喜欢常量/默认值和变量值之间的区别。我认为这是一个逻辑上的、有用的区别。
readonly
关键字不是很明显吗?但是,正如Bozho所提到的,那么你必须在每个构造函数中重复TIME_STAMP=Now()代码。。。这是不必要的重复吗?或者由于设计原因而合理?(几乎)没有重复的代码是合理的,我在这里没有看到设计原因:)这就是我编写构造函数的方式。我唯一一次实例化某些东西是在我需要实例化以保证全局作用域时。@Bozho-初始化程序块比只将代码放入类中有什么好处(如我问题中的第一个选项)?根据首选项,它可能被认为更具可读性。
public class Example
{
   private readonly int TIME_STAMP;
   private int num;

   public Example()
   {
      TIME_STAMP = Now();
      num = 2;
   }
}
{
    var1 = 5;
    varTime = now();
}
public class Example
{
   private readonly int TIME_STAMP;
   private int num = 2;

   public Example()
   {
      TIME_STAMP = Now();
   }
}