Функция членства по сравнению с не являющейся членом функцией?

Это может быть лучше выполнено в цикле for, чем в while:

salary = 1000
interest = .002 * salary
x, total_yes = 0, 0

# This will keep track of x for you
for x in range(12):
    yes = 0.15 * salary
    salary += interest
    total_yes += yes

print(total_yes)
8
задан rlbond 3 April 2009 в 22:07
поделиться

6 ответов

Когда сделать это функцией членства:

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

Когда сделать это автономной функцией

  • когда это - родовая функция, которая может быть templatized для естественной работы над другими классами (посмотрите <алгоритмы> на заголовок для хорошего примера),
11
ответ дан 5 December 2019 в 04:39
поделиться

Herb Sutter говорит, что "мы хотим сделать их не являющимися членом недрузьями, если довольно возможный", и он более умен, чем я.

http://www.gotw.ca/gotw/084.htm

14
ответ дан 5 December 2019 в 04:39
поделиться

Ну, существуют аргументы в пользу обоих.

В пользу не являющихся членом функций:

  • Это предлагает лучшую инкапсуляцию
  • Это позволяет лучшее повторное использование кода (станд.:: находка может быть снова использована для любого контейнерного типа, потому что это - бесплатная функция. Если бы это был участник, когда-либо контейнер должен был бы определить свое собственное),
  • Это делает много универсальных приемов программирования легче. (container.begin() не допустимо если container массив. Это делает немного более неудобным написать общий код, работающий над контейнерами. Но begin(container) может быть сделан допустимым для любого типа, даже встроенных как массивы). Это может также сделать mixins через состав намного более чистым, потому что это не требует, чтобы пользователь "отметил точкой" себя через участников для получения до смесительного объекта, на который Вы хотите воздействовать.

В пользу создания вещей функции членства:

  • Это знакомо. Java и C# требуют этого, и в большом количестве глаз программистов, функции членства синонимичны с ООП.

и... именно. (Но тот аргумент не должен быть недооценен. Удобочитаемость кода важна, и если люди находят легче считать членскую версию, это - веский довод в его пользу. Это просто не производит лучший код. От строгого "лучше кодируют" точку зрения, нечлены должны быть предпочтены, если это возможно.

13
ответ дан 5 December 2019 в 04:39
поделиться

В этом случае я пошел бы для функции членства. Правило, за которым я следую, состоит в том, что, если функция должна получить доступ к чему-то, что является внутренним из текущего состояния экземпляра, затем это должна быть часть "области" класса. В этом случае связность A и B зависит от состояния Вашего экземпляра объекта.

Конечно, Вы могли закончить тем, что имели класс, имеющий слишком много обязанностей. В этом случае содержание он, который вталкивает простой фактор и необходимо рассмотреть, пытается ли класс сделать слишком много. Затем было бы удобно иметь разделенный класс (как, в Вашем случае, ConnectednessEvaluator), чья определенная роль состоит в том, чтобы содержать алгоритмы, которые могут пересечь и действовать на Ваши экземпляры Лабиринта.

4
ответ дан 5 December 2019 в 04:39
поделиться

Я всегда вернулся к FAQ 13.9. Это не точная наука, но один на основе усмотрения.

Это - упрощение, чтобы сказать, что каждый раз, когда Вам нужен доступ к внутренностям класса - необходимо использовать участника. Известными примерами являются потоковые операторы вставки/извлечения (>> и << соответственно) и двоичный файл +.

В Вашем примере, isConnected метод должен протестировать состояние объекта т.е. инспектора и идеального кандидата на то, чтобы быть участником.

3
ответ дан 5 December 2019 в 04:39
поделиться

Единственный материал я склонен делать не являющиеся членом функции, является вещами, которые только называют из функций членства (не должны быть видимы вне класса), и может воздействовать очень хорошо на общедоступных участников класса и/или небольшое количество параметров.

0
ответ дан 5 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: