Я собираюсь не согласиться с Саттером и Александреску по этому вопросу. Я думаю, что если поведение функции foo()
относится к сфере ответственности класса Bar
, то foo()
должно быть частью bar()
.
Тот факт, что foo()
не нуждается в прямом доступе к данным Bar
, не означает, что он концептуально не является частью Bar
. Это также может означать, что код хорошо продуман. Нередко есть функции-члены, которые выполняют все свое поведение через другие функции-члены, и я не понимаю, почему это должно быть.
Я полностью согласен с тем, что связанные с периферией функции должны не быть частью класса, но если что-то является основным для обязанностей класса, нет причины, по которой он не должен быть членом, независимо от того, напрямую связывается с данными участника.
Что касается этих конкретных пунктов:
Это способствует инкапсуляции, потому что есть меньше кода, который нуждается во внутреннем доступе класса.
Действительно, чем меньше функций, которые напрямую обращаются к внутренним органам, тем лучше. Это означает, что наличие функций-членов делает как можно больше через других функций-членов. Разделение хорошо продуманных функций из класса просто оставляет половину класса, для которого требуется множество внешних функций. Отстранение хорошо продуманных функций от их классов также, кажется, препятствует написанию хорошо продуманных функций.
Это облегчает написание шаблонов функций, потому что вам не нужно каждый раз угадывать, является ли какая-то функция членом или нет.
Я вообще не понимаю этого. Если вы извлекаете кучу функций из классов, вы возлагаете больше ответственности на шаблоны функций. Они вынуждены предположить, что еще меньше функциональность обеспечивается аргументами их шаблонов классов, если только мы не собираемся предполагать, что большинство функций, извлеченных из их классов, будут преобразованы в шаблон (тьфу). *
Сохраняет небольшой класс, что, в свою очередь, облегчает тестирование и обслуживание.
Хм, конечно. Он также создает множество дополнительных внешних функций для тестирования и обслуживания. Я не вижу значения в этом.