Доступ к членам напрямую или всегда использовать геттеры - PullRequest
18 голосов
/ 27 сентября 2010

Примечание: специфический вопрос C ++

Лично я нахожу это странным / безобразным, когда класс использует геттер для доступа к своим собственным данным члена. Я знаю, что влияние на производительность нет, но мне просто не нравится видеть все эти вызовы методов. Есть ли какие-либо веские аргументы в любом случае, или это только одна из тех вещей, которые являются личными предпочтениями и должны быть оставлены на усмотрение каждого кодировщика или произвольно контролироваться в стандарте кодирования?

Обновление: я имею в виду простых получателей, специально для класса ' непубличных членов.

Ответы [ 11 ]

0 голосов
/ 09 января 2019

Мои мысли следующие:

Все должно быть статичным, постоянным и частным, если это возможно.

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

  • Поскольку переменная должна быть модифицируемой, вы удаляете константу.

  • Поскольку вам нужен класс / переменная для доступа к другим классамВы удаляете приват.

Использование сеттеров / геттеров - общего назначения.

  • Методы геттеры в порядке, если значение равноТОЛЬКО быть измененным классом, и мы хотим защитить его.Таким образом, мы можем получить текущее состояние этого значения без возможности изменения его значения.
  • Не следует использовать методы получения, если вы планируете предоставить Setter вместе с ним.На этом этапе вы должны просто преобразовать значение в public и просто изменить его напрямую.Так как это намерение с Get / Set.

  • Сеттер просто бесполезен, если вы планируете делать больше, чем просто «this.value = value».Тогда вам не следует называть его «SetValue», а просто опишите, что он на самом деле делает.

  • Если, скажем, вы хотите внести изменения в значение, прежде чем «ПОЛУЧИТЬ» его значение.Тогда НЕ называйте это «GetValue».Это двусмысленно для вашего намерения, и хотя вы, возможно, знаете, что происходит.Кто-то еще не стал бы, если бы не просмотрел исходный код этой функции.

  • Если, скажем, вы действительно только получаете / устанавливаете значение, но вы делаете какую-то форму безопасности.Т.е. проверка размера, проверка нуля и т. Д. - это альтернативный сценарий.Однако вы все равно должны уточнить, что в имени, например, "SafeSetValue", "SafeGetValue" или как в "printf", есть "printf_s".

Альтернативы Get /Настроить ситуации

  • Пример, который я лично имею.Что вы можете увидеть, как я справляюсь со сценарием Get / Set.Есть ли у меня класс GameTime, в котором хранятся все виды значений, и каждый тик игры изменяет эти значения.

    https://github.com/JeremyDX/DX_B/blob/master/DX_B/GameTime.cpp

  • Как вы увидите выше, мои "GETS" на самом деле не являются "GETS" со значениями
    , за исключением небольших случаев, когда модификация не требовалась,Скорее, это описания значений, которые я пытаюсь извлечь из этого
    класса GameTime.Каждое значение является «Статическим Частным».Я не могу выполнить Const
    , учитывая, что информация получена до времени выполнения, и я сохраняю это
    статичным, так как нет цели иметь несколько экземпляров Timing.

  • Как и вывидите, у меня нет никакого способа выполнить "SET" для этих данных, но есть две функции "Begin ()" и "Tick ()", которые обе меняют значения.Вот как должны обрабатываться ВСЕ «сеттеры».По сути, функция «Begin ()» сбрасывает все данные и загружает их в наши константы, которые мы НЕ можем установить в качестве констант, поскольку это данные, которые мы получаем во время выполнения.Затем TICK () обновляет определенные значения с течением времени в этом случае, поэтому мы получаем свежую актуальную информацию.

  • Если вы посмотрите глубоко в код, вы найдете значения "ResetWindowFrameTime ()" и "ElapsedFrameTicks ()".Обычно я бы не стал делать что-то подобное и просто установил бы значение public.Поскольку, как вы увидите, я получаю значение и устанавливаю его.Это еще одна форма Set / Get, но она по-прежнему использует именование, которое соответствует сценарию, и использует данные из частных переменных, поэтому не имеет смысла извлекать другую закрытую переменную, а затем умножать ее на это, вместо этого выполните работу здесь и извлекитерезультат.Также нет необходимости редактировать значение, отличное от того, чтобы сбросить его до текущего индекса кадра и затем извлечь истекшие кадры.Он используется, когда я открываю новое окно на моем экране, чтобы я мог знать, как долго я просматриваю это окно, и действовать соответственно.

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