Pull to refresh
0
Content AI
Решения для интеллектуальной обработки информации

How to: Правильно называем методы-свойства класса

Reading time2 min
Views18K

  • Как вы называете парные методы Get/Set? Допускается ли делать их несимметричными? А если для свойства используется глагол Is? А если какой-нибудь модальный глагол вроде Can?
  • Допускается ли вместо Get/Set использовать пары Is/Set?
  • И если есть ограничения, то это ваш сознательный выбор или корпоративный стандарт?


У нас в компании по этому поводу написано следующее (выдержка из инструкции программиста, часть «Рекомендация по образованию имен»):

Методы получения бинарного атрибута

Имя метода получения бинарного атрибута должно быть предикатом (вопросом, на который можно ответить Да или Нет). В большинстве случаев имя метода должно начинаться с глаголов Is или Has.

Методы получения и установки небинарного атрибута

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

Теперь же возьмём открытое у меня «произвольное» решение, состоящее примерно из 50 проектов, большей частью касающихся оболочки продукта, и включающее в себя около 5000 заголовочный файлов. И посмотрим, какие именования там встречаются:



На круговой диаграмме показано относительное распределение различных “get”-методов. На остальных по смысловым глаголам: Is, Can, Has, Need, Should. Только будьте внимательны, некоторые диаграммы строил грамотный PM.

Анализ найденного показал, что есть небольшое число парных Is/Set методов, у которых метод Set не принимает никаких параметров. Т.е. значение по умолчанию false, а set-метод его взводит, и отменить данный переход никак нельзя. Это осмысленно для IsFailed() / SetFailed(). Но во многих случаях данное ограничение вытекает скорее из ограничений UI (что сейчас пользователь так не может сделать), чем из логики свойства.

Также надо заметить, что поиск по чужому решению показал кардинально отличающееся распределение. Поэтому использование конкретных модальных глаголов, скорее всего, связано с людьми в команде, чем c правилами организации.

Так как же правильно назвать метод? NeedDoSomething или ShouldDoSomething? Какой модальный глагол выбрать? Попробуем ответить на этот вопрос. Совершенно очевидно, что таких методов должно быть шесть, а как их использовать указано ниже:



bool Do( TАction type, IObject* obj ) {
  // надо ли вообще париться
  if( !detector.ShouldDo( type, obj ) ) {
    return false;
  }

  // разрешено ли действие
  if( !callback.MayDo( type, obj ) && !DareToDo( type ) ) {
    // нам запретили выполнить действие и у нас нет смелости нарушить указание
    // проверим на обязательность действия – и кинем исключение, если надо
    check( !detector.MustDo( type, obj ), ERR_MUST_NOT_MAY );
    return false;
  }

  // выполним действие
  foreach( executor in executors ) {
    if( executor.OughtToDo( type, obj ) ) {
      if( executor.CanDo( obj ) ) {
        executor.Do( obj );
      }
      check( !detector.MustDo( type, obj ), ERR_MUST_NOT_CAN );
      return false;
    }
  };

  // executor должен быть
  check( false, ERR_EXEC_NOT_FOUND );
}

Only registered users can participate in poll. Log in, please.
А как называете методы вы?
10.43% У нас запрещено использовать методы без Get/Set-префиксов22
53.08% Можно использовать связки Is вместо Get112
36.02% Можно использовать Has вместо Get76
34.6% Можно использовать Can вместо Get73
22.27% Можно использовать Should/Need/…47
53.55% Как хочу, так и пишу. Правила для маменькиных сынков113
211 users voted. 95 users abstained.
Tags:
Hubs:
Total votes 18: ↑11 and ↓7+4
Comments31

Articles

Information

Website
www.contentai.ru
Registered
Founded
Employees
101–200 employees
Location
Россия