OOP-在实例和静态方法之间进行选择

时间:2019-06-09 08:58:54

标签: c# oop

考虑以下代码:

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”字符串作为参数。

经验丰富的程序员会采用哪种“更合适”的方法?为什么?

我目前的想法是:

  • 如果我们认为始终将使用name作为参数来调用GenerateId(并且将来很可能不会更改),则仅引用名称字段而不是将其作为字符串参数传递是安全的。但是,如果希望在某个时候使用所有者字符串作为基础来计算ID,则可以预先设计该函数以采用字符串参数。
  • 我已经多次听到“函数应该接受尽可能少的参数”。

我对它的思考越深,似乎就越有一个问题:“我们应该使该函数具有多通用性?”这不是由OOP规则决定的,而只是视情况而定:问自己是否需要更通用的版本,或者现在和将来的功能最有可能只使用这一件事,所以您可以自由地对其进行“硬编码”,而不必编写更多的代码来使其更通用。

1 个答案:

答案 0 :(得分:1)

如果要使用generateId方法为任何给定的字符串(或任何输入)生成ID,则可以考虑第一种情况。这样,generateId将完全独立于其他类属性。

扩展上述逻辑,如果您想使输入依赖,但对结果的分配独立于其他类属性,则首选2nd选项。

如果您想将输入和结果中的赋值与类属性紧密耦合,请采用第三种方法。在这种情况下,您不能使用此方法为其他输入生成ID或将其分配给其他变量。