Читаем Как функции, не являющиеся методами, улучшают инкапсуляцию полностью

Как функции, не являющиеся методами, улучшают инкапсуляцию

Когда приходится инкапсулировать, то иногда лучше меньше, чем большеЯ начну со следующего утверждения: Если вы пишете функцию, которая может быть выполнена или как метод класса, или быть внешней по отношению к классу, Вы должны предпочесть ее реализацию без использования метода. Такое решение увеличивает инкапсуляцию класса. Когда Вы думаете об использовании инкапсуляции, Вы должны думать том, чтобы не использовать методы.Удивлены? Читайте дальше.

Скотт Мейерс

Программирование, программы, базы данных18+

Скотт Мейерс

Как функции, не являющиеся методами, улучшают инкапсуляцию

Предпосылка

Когда, в 1991 г., я писал первое издание "Эффективное использование C++" (Effective C++ [1]), я изучал проблему определения функций, связанных с классом. Для заданного класса C и функции f, связанной с C, я разработал следующий алгоритм:

if (f необходимо быть виртуальной) сделайте f функцией-членом C;

else

 if (f – это operator›› или operator‹‹) {

  сделайте f функцией – не членом;

  if (f необходим доступ к непубличным членам C) сделайте f другом C;

 }

 else if (в f надо преобразовывать тип его крайнего левого аргумента) {

  сделайте f функцией – не членом;

  if (f необходимо иметь доступ к непубличным членам C) сделайте f другом C;

 } else сделайте f функцией-членом C;

Этот алгоритм хорошо служил мне многие годы, и когда я правил "Эффективное использование C++" для второй издания в 1997 г. [2], я не сделал никаких изменений в этот алгоритм.

Однако, в 1998 году, когда я проводил презентацию в Actel, где Аран Канду (Arun Kundu) заметил, что мой алгоритм диктовал, что функции должны быть методами даже тогда, когда они могли бы быть реализованы как не члены, которые использовали только открытый интерфейс класса C. "Это действительно, что-нибудь означает?" – спросил он меня? Другими словами, если f могла бы быть реализован как функция-член (метод) или как функция не являющаяся не другом, не членом, я действительно защищал, что ее надо реализовать как метод класса? Я немного подумал об этом и решил, что это не то, то, что я подразумевал. Поэтому я изменил алгоритм [3]:

if (f необходимо быть виртуальной) сделайте f функцией-членом C;

else if (f – это operator›› или operator‹‹) {

 сделайте f функцией – не членом;

 if (f необходим доступ к непубличным членам C) сделайте f другом C;

} else if (f необходимо преобразовывать тип его крайнего левого аргумента) {

 сделайте f функцией – не членом;

 if (f необходимо иметь доступ к непубличным членам C) сделайте f другом C;

} else if (f может быть реализована через доступный интерфейс класса) сделайте f функцией – не членом;

else сделайте f функцией-членом C;

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

Но они ошибаются.

Инкапсуляция

Инкапсуляция не определяет вершину мира. Нет ничего такого, что могло бы возвысить инкапсуляцию. Она полезна только потому, что влияет на другие аспекты нашей программы, о которых мы заботимся. В частности, она обеспечивает гибкость программы и ее устойчивость к ошибкам. Посмотрите на эту структуру, чья реализация (я думаю, что мы все согласимся) не является инкапсулированной:

struct Point {

 int x, y;

};

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT