类方法:在私有方法中传递私有数据字段

时间:2013-01-31 15:16:57

标签: oop design-patterns

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

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

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

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

感谢您的见解并为我解决这个问题。

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;
   }
}

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

我会说第二种更合适,但第一种方法有效。

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

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

答案 2 :(得分:0)

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