Недостатки композиции в том, что она может скрывать взаимосвязь элементов, а может труднее понять другим. С, скажем, классом 2D Point и желанием расширить его до более высоких измерений, вам, вероятно, придется добавить (по крайней мере) Z getter / setter, изменить getDistance () и, возможно, добавить метод getVolume (). Итак, у вас есть элементы Objects 101: связанное состояние и поведение.
Разработчик с композиционным мышлением предположительно определил бы метод getDistance (x, y) -> double и теперь определил бы метод getDistance (x, y, z) -> double. Или, вообще говоря, они могут определить метод getDistance (lambdaGeneratingACoordinateForEveryAxis ()) -> double. Тогда они, вероятно, напишут методы фабрики createTwoDimensionalPoint () и createThreeDimensionalPoint () (или, возможно, createNDimensionalPoint (n)), которые будут объединять различные состояния и поведение.
Разработчик с OO мышлением будет использовать наследование. Та же сложность в реализации характеристик домена, меньшая сложность с точки зрения инициализации объекта (конструктор заботится о нем по сравнению с методом Factory), но не такая гибкая с точки зрения того, что может быть инициализированным.
Теперь подумайте об этом с точки зрения понятности / читабельности. Чтобы понять состав, имеется большое количество функций, которые программно составлены внутри другой функции. Так что с точки зрения статической структуры кода (файлов, ключевых слов и т. Д.) Мало что делает взаимосвязь Z и distance () выпрыгивающей . В ОО-мире у вас есть огромный мигающий красный свет, говорящий вам об иерархии. Кроме того, у вас есть практически универсальный словарь для обсуждения структуры, широко известных графических обозначений, естественной иерархии (по крайней мере, для одиночного наследования) и т. Д.
Теперь, с другой стороны, хорошо названный и сконструированный метод Фабрики часто делает явным больше неясных отношений между состоянием и поведением, поскольку композиционный образ мышления облегчает функциональный код (то есть код, который передает состояние через параметры, а не через это ).
В профессиональной среде с опытными разработчиками гибкость композиции обычно превосходит ее более абстрактную природу. Однако никогда не следует сбрасывать со счетов важность понимания, особенно в командах, которые имеют разную степень опыта и / или высокий уровень текучести кадров.