Получить / Установить в мире c ++, подделка? - PullRequest
14 голосов
/ 17 декабря 2008

Я заметил, что get / set - это не способ c ++, насколько я могу судить, взглянув на boost / stl и даже читая труды некоторых ведущих экспертов по c ++.

Кто-нибудь использует get / set в своем дизайне класса c ++, и может ли кто-нибудь предложить практическое правило, где, если вообще эта парадигма принадлежит миру c ++?

Очевидно, что он очень популярен в Java и имитируется c # с использованием свойства синтаксического сахара.

EDIT:

Хорошо, прочитав об этом больше по одной из ссылок, приведенных в ответе ниже, я наткнулся, по крайней мере, на один аргумент за то, что у аксессоров поля члена должно быть то же имя, что и у поля члена. А именно, что вы можете просто представить поле члена как public и вместо этого сделать его экземпляром класса, а затем перегрузить оператор (). Используя set / get, вы заставите клиентов не только перекомпилировать, но и фактически изменить свой код.

Не уверен, что мне нравится эта идея, мне она кажется слишком мелкой, но более подробная информация здесь:

C ++ Убил геттера / сеттера

Ответы [ 12 ]

0 голосов
/ 17 декабря 2008

Я использую геттеры / сеттеры только тогда, когда нет альтернативы. Когда я могу, я использую этот шаблон (не в том смысле, что это хорошая практика, а в том смысле, что я делаю это последовательно): изменение свойства не влияет на поведение объекта до тех пор, пока оно действительно не понадобится. Например:

myWnd->Title = "hello"; // not a setter, just a LPCSTR member
myWnd->Title = "world";
myWnd->ShowWindow();    // perhaps updates a WNDCLASS structure
                        // and other complicated things that
                        // the user of the class doesn't want to know

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

0 голосов
/ 17 декабря 2008

Мой опыт работы с C ++ и Java, хотя в настоящее время я работаю на PHP. Мои общие правила, которые я использую для PHP и C ++:

  1. Если вам нужно, чтобы переменная-член была читаемой вне класса, но не доступной для записи: используйте только getVariableX ().

  2. Если вы хотите разрешить изменение / чтение переменных-членов вне класса, но нуждаетесь в дополнительной работе над ними до / после изменения их значений: используйте setVariableX () и getVariableX ().

  3. Если переменная-член может быть изменена извне класса, а методы set / get были бы простым присваиванием: просто сделайте переменную общедоступной, как это было бы в любом случае с set / gets (просто в более запутанный способ).

Обратите внимание, что если ваши методы get и set выполняют намного больше, чем обычные операции получения и установки, вам, вероятно, следует переименовать их, чтобы более точно описать их функцию.

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