4

我想知道以下哪种模式被认为更“正确”。

第一个示例通过调用隐式接受参数的 void 成员函数来设置私有数据成员长度的值。第二个示例通过将其分配给显式接受参数的成员函数的返回值来设置长度值。

似乎第二种方法使代码更清晰,因为您知道何时以及如何设置私有成员,第一种方法需要跟踪代码以验证分配值的内容和方式。第二种方法似乎也可以在以后更好地重用,因为它可以在任何类/上下文中运行(因为参数和返回类型是显式的)。

第一种方法更快,如果在整个类中使用(对于私有成员函数)可以节省一些编码,但是我不确定这是否会咬我?

感谢您的洞察力并为我澄清了这一点。

class MyDataType
{
   private int length;
   private string content;
   private char[] buffer;

   public MyDataType(str) 
   {
      content = str;

      calculateLength();

      buffer = new char[length+1];

      for(int i=0; i < length; i++)
         buffer[i] = content[i];

      buffer[i] = NULL;
   }

   private void calculateLength()
   {
      int i = 0;

      while(content[i++] != NULL) {}  // i know, buffer overflow...

      length = i;
   }
}

class MyDataType
{
   private int length;
   private string content;
   private char[] buffer;

   public MyDataType(str) 
   {
      content = str;

      length = calculateLength(content);

      buffer = new char[length+1];

      for(int i=0; i < length; i++)
         buffer[i] = content[i];

      buffer[i] = NULL;
   }

   private int calculateLength(string s)
   {
      int i = 0;

      while(s[i++] != NULL) {}

      return i;
   }
}
4

3 回答 3

2

在可读性和灵活性方面,第二个示例胜出。

使用第二个示例的优势在于,您实际上只是将构造函数中的一些工作委派给一个方法。这很容易阅读,并且将来不会轻易中断,例如,如果有人调用私有calculateLength()方法而不期望实例变量发生变化。

在第一个示例中,该calculateLength()方法以对构造函数不透明的方式对成员变量进行操作,这使得它的可读性降低并且更容易以上述方式变得脆弱。

于 2013-01-31T15:35:14.310 回答
1

我会说第二个更合适,但第一个有效。

通常 getter 是公共的,在类中的任何地方都可以访问私有变量,在同一个类中拥有一个获取私有或受保护变量的 getter 是没有意义的。如果它受到保护并且您可以将功能传递给您的类的子类。

这取决于你想对变量做什么。如果值不会改变,我只需将private calculateLength()方法移至构造函数。如果您必须重新计算它,那么我想我可以看到 void 或 private 做几乎相同的事情。我觉得第二个更清楚,因为您确切地知道该calculateLength()方法返回的位置,但在第一个中,它是否在做任何事情是模棱两可的。做第二个更好的风格。

于 2013-01-31T15:28:18.193 回答
0

为什么不将getLength()函数内容嵌入到构造函数中,同时进行复制呢?您将为自己节省另一个循环。除此之外,我很确定这并不重要。顺其自然,从一个方法开始,然后在你认为合适的时候进行修改。

于 2013-01-31T15:25:47.280 回答