ООП - выбор между экземпляром и статическим методом - PullRequest
0 голосов
/ 09 июня 2019

Рассмотрим следующий код:

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 всегда будет вызываться с именем в качестве аргумента (и в будущем он, скорее всего, не изменится), можно просто ссылаться на поле имени, а не передавать его в качестве строкового аргумента. Однако, если мы ожидаем, что в какой-то момент мы захотим вычислить идентификатор, используя в качестве основы строку владельца, мы можем заранее спроектировать функцию для получения строкового аргумента.
  • Я много раз слышал, что «функция должна принимать как можно меньше аргументов».

Чем больше я об этом думаю, тем больше возникает вопрос: «Насколько универсальным мы должны сделать эту функцию?» это не решается правилами ООП, а просто в каждом конкретном случае: спросите себя, нужна ли вам более общая версия, или если функция, как сейчас, так и в будущем, скорее всего будет выполнять только это одна вещь, так что вы можете свободно «закодировать» ее, вместо того, чтобы писать больше кода, чтобы сделать его более общим.

1 Ответ

1 голос
/ 09 июня 2019

Если вы хотите использовать метод generateId для генерации идентификаторов для любой заданной строки (или любого ввода), то вы можете рассмотреть первый случай.Таким образом, generateId будет полностью независим от других атрибутов класса.

Расширение вышеуказанной логики, если вы хотите сделать входной сигнал зависимым, но присваивание, которое вы делаете с результатом, независимым от других атрибутов класса, тогда предпочтительнее второй вариант.

Если вы хотите тесно связать вход и назначение из результата с атрибутами класса, то переходите к третьему подходу.В этом случае вы не можете использовать этот метод для генерации идентификаторов для других входных данных или присвоения его другим переменным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...