Правильное использование - методы доступа / получения против обычных методов - PullRequest
0 голосов
/ 28 мая 2011

У меня проблемы с разграничением методов доступа / геттеров, которые представляют свойства объекта и обычные методы.В C ++ соглашения об именах для методов доступа и обычных методов различаются (например, руководство по стилю Google предлагает строчные буквы для методов доступа и PascalCase для обычных методов).Кроме того, порядок обычных методов и методов доступа / получателей (до или после) также является предметом соглашений.В Java может возникнуть дилемма, должен ли метод начинаться с «get» или «compute» / «find», чтобы указывать метод получения и нормальный метод, соответственно.В C # возникает дилемма, каким должно быть свойство, а каким должно быть метод.Всякий раз, когда я создаю новый класс, я не уверен, как классифицировать методы к обычным методам и получателям.

Есть ли простой способ определить, является ли свойство объекта / средства доступа / получателя и что должно бытьобычный метод?

И имеет ли какое-либо из перечисленных ниже отношение к разнице между средством доступа / получателем и обычным методом:

  1. Вычисление дешево
  2. Новый (или копия) возвращается, вместо (const) ссылки
  3. Нет сеттера
  4. Существует способ повлиять на это "свойство", но косвенно

Чтобы проиллюстрировать это, вот пример (на C ++): Предположим, я хочу создать структуру данных, которая может содержать фиксированное количество элементов, и кроме операций вставки / удаления, она предлагает ряд методов, которые работают надсодержащиеся элементы (то есть среднее, медиана, минимум, максимум и т. д.).Теперь возьмем функцию, которая вычисляет среднее значение, например;Можно сказать, что это свойство объекта, и пересчитывать его всякий раз, когда элемент вставляется / удаляется, и, таким образом, обрабатывать его как метод получения, подобный const double& average().Другой способ - вычислить его по требованию и рассматривать как обычный метод, т. Е. double ComputeAverage().Также предположим, что есть метод, который возвращает набор содержащихся элементов;он может рассматриваться как получатель const set<int>& unique_elements(), если нет необходимости каждый раз вычислять его, но если класс вычисляет его каждый раз, тогда set<int> ComputeUniqueElements() будет более подходящим.

1 Ответ

0 голосов
/ 19 июля 2012

Создание разделения между аксессорами и «обычными методами» - плохая идея. Метод есть метод; это функция-член, которая имеет определенный эффект. Тот факт, что функция-член просто устанавливает значение переменной-члена или возвращает значение переменной-члена, является подробностью реализации .

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

Допустим, у вас есть name "свойство" в вашем классе. Первоначально вы храните его как std::string. Вы предоставляете функции для получения и изменения имени. Все хорошо.

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

В C ++ соглашения об именах для методов доступа и обычных методов различаются (например, в руководстве по стилю Google предлагаются строчные буквы для методов доступа и PascalCase для обычных методов).

Руководство по стилю Google не представляет C ++ или его программистов; это только то, что делает Google.

...