Рассмотрим следующий код:
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" в качестве аргумента.
Какой «более правильный» подход должен использовать опытный программист? Почему?
Мои нынешние мысли:
- Если мы думаем, что GenerateId всегда будет вызываться с именем в качестве аргумента (и в будущем он, скорее всего, не изменится), можно просто ссылаться на поле имени, а не передавать его в качестве строкового аргумента. Однако, если мы ожидаем, что в какой-то момент мы захотим вычислить идентификатор, используя в качестве основы строку владельца, мы можем заранее спроектировать функцию для получения строкового аргумента.
- Я много раз слышал, что «функция должна принимать как можно меньше аргументов».
Чем больше я об этом думаю, тем больше возникает вопрос: «Насколько универсальным мы должны сделать эту функцию?» это не решается правилами ООП, а просто в каждом конкретном случае: спросите себя, нужна ли вам более общая версия, или если функция, как сейчас, так и в будущем, скорее всего будет выполнять только это одна вещь, так что вы можете свободно «закодировать» ее, вместо того, чтобы писать больше кода, чтобы сделать его более общим.