Это может быть лучше выполнено в цикле 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)
Когда сделать это функцией членства:
Когда сделать это автономной функцией
Herb Sutter говорит, что "мы хотим сделать их не являющимися членом недрузьями, если довольно возможный", и он более умен, чем я.
Ну, существуют аргументы в пользу обоих.
В пользу не являющихся членом функций:
container.begin()
не допустимо если container
массив. Это делает немного более неудобным написать общий код, работающий над контейнерами. Но begin(container)
может быть сделан допустимым для любого типа, даже встроенных как массивы). Это может также сделать mixins через состав намного более чистым, потому что это не требует, чтобы пользователь "отметил точкой" себя через участников для получения до смесительного объекта, на который Вы хотите воздействовать.В пользу создания вещей функции членства:
и... именно. (Но тот аргумент не должен быть недооценен. Удобочитаемость кода важна, и если люди находят легче считать членскую версию, это - веский довод в его пользу. Это просто не производит лучший код. От строгого "лучше кодируют" точку зрения, нечлены должны быть предпочтены, если это возможно.
В этом случае я пошел бы для функции членства. Правило, за которым я следую, состоит в том, что, если функция должна получить доступ к чему-то, что является внутренним из текущего состояния экземпляра, затем это должна быть часть "области" класса. В этом случае связность A и B зависит от состояния Вашего экземпляра объекта.
Конечно, Вы могли закончить тем, что имели класс, имеющий слишком много обязанностей. В этом случае содержание он, который вталкивает простой фактор и необходимо рассмотреть, пытается ли класс сделать слишком много. Затем было бы удобно иметь разделенный класс (как, в Вашем случае, ConnectednessEvaluator), чья определенная роль состоит в том, чтобы содержать алгоритмы, которые могут пересечь и действовать на Ваши экземпляры Лабиринта.
Я всегда вернулся к FAQ 13.9. Это не точная наука, но один на основе усмотрения.
Это - упрощение, чтобы сказать, что каждый раз, когда Вам нужен доступ к внутренностям класса - необходимо использовать участника. Известными примерами являются потоковые операторы вставки/извлечения (>>
и <<
соответственно) и двоичный файл +
.
В Вашем примере, isConnected
метод должен протестировать состояние объекта т.е. инспектора и идеального кандидата на то, чтобы быть участником.
Единственный материал я склонен делать не являющиеся членом функции, является вещами, которые только называют из функций членства (не должны быть видимы вне класса), и может воздействовать очень хорошо на общедоступных участников класса и/или небольшое количество параметров.