Предположим, у меня есть объект, автомобиль, и у него есть наборы методов, которые ... несопоставимы? Может быть, похож на Блоб? (как в antipattern, «blob»). Эти методы работают в достаточно разных наборах и на самом деле не пересекаются функционально.Где идут новые методы?
Car
# methods related to suburban driving
->foo1
->foo2
# methods related city driving
->bar3
->bar4
Теперь давайте говорить, что я хотел бы добавить «внедорожное вождение» в качестве одного из случаев, которые могут поддержать мой объект автомобиля. Если я добавляю методы к объекту Car, разве это не делает его более похожим на blob?
Car (augmented)
# methods related to suburban driving
->foo1
->foo2
# methods related city driving
->bar3
->bar4
# methods related off road driving
->blah5
->blah6
Должен ли я:
A: Подкласс автомобилей. Я могу сделать объект OffRoadCar extends Car. Но что, если Car и OffRoadCar используют одни и те же данные/состояние и отличаются только методами? OffRoadCar только «действует» более конкретно, чем автомобиль, но больше не описывается и не имеет уникальных полей. Поэтому создание экземпляра OffRoadCar бессмысленно.
OffRoadCar extends Car
# methods related off road driving
->blah5
->blah6
Б: Потребляйте автомобиль с статическим методом. Как OffRoadAdventure-> Embark (Car). Таким образом, класс OffRoadAdventure принимает объект Car и имеет свой путь.
В C# это будет называться методом расширения.
Я думаю, что есть другой способ: Каково решение Blap antipattern? Это подклассы? Это методы расширения?
Кроме того, еще одна причина, по которой я хотел использовать эти методы, заключается в том, что если их реализация несет определенную стоимость, например, включение других классов/пакетов? Я бы не хотел, чтобы пользователи основного класса постоянно платили за то, что они никогда не использовали. Я полагаю, что стоимость, выделяемая для меньшинства, стоит экономии большинства. И это делает граф зависимостей более точным (и не похожим на blob-like).
PS - Язык реализации Perl.
Автомобиль должен быть классом? Может ли автомобиль действительно быть ICar (интерфейс)? Я бы предложил маршрут композиции над наследованием. – OnResolve
Автомобиль уже настоящий класс, который используется. (это фактически артефакт ORM) –