Что такое хорошее соглашение об именах для процедуры, которая устанавливает глобальную переменную в том же классе

В Code Complete (глава 7, раздел 3) сказано, что для возвращаемого значения должна быть названа хорошая функция, а для того, что она делает, должно быть названо хорошее имя процедуры в классе.

Когда я пишу синхронизированные методы в Delphi (до 2009 года), мне иногда приходится использовать их для установки глобальных переменных, что, казалось бы, плохая практика программирования, но однажды необходимо, поскольку я не могу передавать переменные. Я не хочу называть их "Get" или "Set", потому что я использую их для своих методов свойств.

У кого-нибудь есть лучшее соглашение об именах для них?

6 ответов

Я не хочу называть их "Get" или "Set", потому что я использую их для своих методов свойств.

Это кажется довольно произвольным решением. Можете ли вы также сказать, что вы не хотите использовать "set" для "setName", потому что вы также использовали его для "setAge"?

Тем не менее, наличие статики с сеттером буквально является публичной глобальной переменной ALA Basic-- Вы уверены, что это единственный способ выполнить вашу миссию?

Я не говорю, что статика абсолютно неправильная, но вы должны приложить все усилия, чтобы манипулировать ею в объекте, который ее определяет, а не в установщике, иначе вы подвергаете большую часть внутреннего состояния вашего объекта таким образом, что это будет трудно контролировать.

Я бы сказал, что совет от Code Complete довольно сильный, а ваше возражение "потому что я использую их для своих методов собственности" довольно слабое. Эти установщики / получатели свойств должны быть частными в любом случае. Считайте это формой перегрузки и назовите их SetFoo и GetFoo.

Какую версию Delphi вы используете? При использовании D2006 или 2007 вы можете переместить глобальные переменные в свойства класса с помощью методов класса, чтобы получить и установить значения. Поскольку это методы получения и установки свойств, целесообразно использовать Get и Set.

type
 TMyObject = class(TObject)
 private
    class var
      FStringProperty : string;

    class function GetStringProperty: String; static;
    class procedure SetStringProperty(const Value : string);static;
  public
    class property StringProperty : String read GetStringProperty write SetStringProperty;
  end;

Получатели и установщики свойств не имеют имен, начинающихся с get и set, потому что это соглашение, зарезервированное для именования получателей и установщиков. У них есть эти имена, потому что это то, что они делают. Поскольку целью вашего синхронизированного метода является установка значения переменной, имеет смысл дать ему имя "set".

Вы можете выбрать синоним глагола, например, назначить или скопировать, просто чтобы он отличался от установленного, но это неординарные имена для целей, которые вы описали. Когда у вас есть процедура, которая устанавливает значение FooСоглашение требует, чтобы функция была названа SetFoo, В конечном счете, я думаю, что вам просто нужно преодолеть любые проблемы с использованием get и set для вещей, которые не являются средствами доступа к свойствам.

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

SetGlobalFoo(...);

для этого. Затраты на длинное имя - ОК, IMO, потому что эти конструкции должны использоваться редко.

Я хотел бы использовать SetXXX а также GetXXX для частных и глобальных переменных, потому что я не вижу разницы в том, что делают эти методы. Операция по SetXXX является набором над областью данных. Если эта область данных является глобальной, локальной или удаленной, это внутренняя деталь метода, которая не должна быть видна извне.

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

Другие вопросы по тегам