Pull to refresh

How Non-Member Functions Improve Encapsulation (C++)

Reading time 2 min
Views 1.5K
Листал старые журналы и наткнулся на широко известную в узких кругах статью Scott Meyers: How non-member functions improve encapsulation. Если кто-то ее еще не читал — прочитайте обязательно.
Мысль там излагается понятная и верная, но все же по-моему в статье есть большая недосказанность.
Говоря кратко, в этой статье Мейерс утверждает, что вынесение функций из класса всегда делает код более инкапсулированным.

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

Имхо, писать функции не члены класса имеет смысл тогда и только тогда, когда эту функцию можно спрятать и сделать недоступной клиентам класса.
Такую функцию можно объявить и реализовать только в cpp файле, написать в ней кучу кода, а клиент даже знать про нее не будет — это отличная инкапсуляция и отличная альтернатива объявлению такой функции в private секции. Т.к. любая функция в private секции — это тоже фактически интерфейс класса, причем часто лишний интерфейс.
Один из плюсов такого подхода — в классах почти не остается private методов, т.к. они все становятся static функциями в cpp файле. А в классе остаются только интерфейсные public функции. А значит очередное изменение имплементации класса гораздо меньше будет влиять на клиентов класса.

А вы убираете ненужные функции из интерфейса класса?
Какие другие методы вы используете для увеличения инкапсуляции классов?
Tags:
Hubs:
+7
Comments 16
Comments Comments 16

Articles