考虑以下代码:
public class Car {
public string name;
public string owner;
public string id;
public Car(string name, string owner) {
this.name = name;
this.owner = owner;
id = GenerateId(name);
}
private static string GenerateId(string name) {
//do some fancy computation to derive the ID from the name, such as hash it or anything else.
return result;
}
}
重要的一点是,GenerateId是一个静态函数,在此处显式接受一个参数。
现在,让我们考虑以下内容,其中将GenerateId制成一个实例函数,该函数不显式接受任何参数,而只是引用所需的实例字段。
public class Car {
public string name;
public string owner;
public string id;
public Car(string name, string owner) {
this.name = name;
this.owner = owner;
GenerateId(name);
}
private void GenerateId() {
//do some fancy computation to derive the ID from the name, such as hash it or anything else.
string computation_result = fancy_computation(this.name);
this.id = computation_result;
}
}
另一种方法是直接引用id字段的实例方法,但是无论如何都需要“ name”字符串作为参数。
经验丰富的程序员会采用哪种“更合适”的方法?为什么?
我目前的想法是:
我对它的思考越深,似乎就越有一个问题:“我们应该使该函数具有多通用性?”这不是由OOP规则决定的,而只是视情况而定:问自己是否需要更通用的版本,或者现在和将来的功能最有可能只使用这一件事,所以您可以自由地对其进行“硬编码”,而不必编写更多的代码来使其更通用。
答案 0 :(得分:1)
如果要使用generateId方法为任何给定的字符串(或任何输入)生成ID,则可以考虑第一种情况。这样,generateId将完全独立于其他类属性。
扩展上述逻辑,如果您想使输入依赖,但对结果的分配独立于其他类属性,则首选2nd选项。
如果您想将输入和结果中的赋值与类属性紧密耦合,请采用第三种方法。在这种情况下,您不能使用此方法为其他输入生成ID或将其分配给其他变量。