我想知道以下哪种模式被认为更“正确”。
第一个示例通过调用隐式接受参数的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;
}
}
答案 0 :(得分:2)
在可读性和灵活性方面,第二个例子胜出。
使用第二个示例的好处是,您实际上只是将构造函数中的一些工作委托给方法。这很容易阅读,并且如果有人调用私有calculateLength()
方法而不期望实例变量发生变化,将来不会轻易破解。
在第一个示例中,calculateLength()
方法以不透明的方式对构造函数操作成员变量,这使得它不易读取,并且更容易以上述方式变脆。
答案 1 :(得分:1)
我会说第二种更合适,但第一种方法有效。
通常,getter是公共的,在类中的任何地方都可以访问私有变量,在同一个类中获取私有或受保护变量的getter是没有意义的。如果它受到保护,你可以将功能传递给你的类的子类。
这取决于你想要对变量做什么。如果值不会改变,我只需将private calculateLength()
方法移动到构造函数。如果你必须重新计算它,那么我想我可以看到无效或私有做同样的事情。我觉得第二个更清楚,因为你确切地知道calculateLength()
方法返回的确切位置,但是在第一个方法中它是否正在做任何事情都是模棱两可的。做第二个是更好的风格。
答案 2 :(得分:0)
为什么不将getLength()
函数内容嵌入到构造函数中,并同时进行复制?你将为自己节省另一个循环。
除此之外,我很确定它并不重要。只需使用流程,从方法开始,然后在您认为合适的情况下进行修改。