Подписаться на RSS

плюс

Получать обновления на email:



Мои любимые книги:

М. Руссинович, Д. Соломон. Внутреннее устройство Microsoft Windows

Майкл К. Физерс. Эффективная работа с унаследованным кодом:

Стив Макконнелл. Совершенный код

Мартин Фаулер Рефакторинг. Улучшение существующего кода

Бьерн Страуструп. Язык программирования С++.

Андрей Александреску Современное проектирование на С++. Серия С++ In-Depth

Том Демарко, Тимоти Листер Человеческий фактор: успешные проекты и команды

Посмотреть весь список книг для программистов...

How Non-Member Functions Improve Encapsulation

Наткнулся в старом журнале на статью Scott Meyers: How non-member functions improve.

Мысль там излагается понятная, но по-моему там есть некоторая недосказанность.
Майерс утверждает, что вынесение функций из класса делает код более инкапсулированным.

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

Про эту проблему в статье немного сказано, но недостаточно.
Имхо, писать функции не члены класса имеет смысл всегда, если эту функцию можно спрятать и недоступной клиентам класса. Такую функцию можно написать в cpp, сделать что-то в ней и клиент даже знать про нее не будет - это отличная инкапсуляция и отличная альтернатива пиханию такой функции в private секцию. Т.к. любая функция в private секции - это тоже фактически интерфейс класса, причем часто ненужный.

Ну и напоследок вопросы:
А вы как пишете? Выносите ненужные функции из класса? Почему?
Что такое инкапсуляция? :)

Оригинал и комментарии

4 комментариев к How Non-Member Functions Improve Encapsulation

  • frogkiller

    Я рассматриваю внешние функции как статический интерфейс класса/модуля. И выношу из класса в основном при возможности обобщения метода на 2 и более родственных класса - имхо только в этом случае окупятся затраты на дополнительное “рассеяние” внимания.

    • А как быть с закрытыми функциями? Выносите?

      • frogkiller

        Обычно нет, но, вероятно, это больше психологический эффект. Закрытые функции я могу сделать статическими и вынести в базовый класс при необходимости.

        • Я долго думал над этой проблемой уже после поста и решил, что на самом деле не так уж и выгодно выносить ни скрытые ни открытые члены.
          Если вынес в функцию из класса - уже усложнил, т.к. теперь 2 разных нэймспейса, то есть 2 разных контекста - класс и глобальная функция.
          Если следовать ООП, то лучше открытые выделять в отдельный класс или базовый класс, а для закрытых использовать pImpl или что-то в таком роде. Но не выносить функцию из контекста класса.

Ответить

 

 

 

Вы можете использовать эти HTML тэги

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>