Я давно работаю разработчиком (мне 49 лет), но я довольно новичок в объектно-ориентированной разработке. Я читал об ОО со времен Эйфеля Бертранда Мейера, но мало занимался программированием.
Дело в том, что каждая книга по ОО-дизайну начинается с примера лодки, автомобиля или какого-либо обычного объекта, который мы часто используем, и они начинают добавлять атрибуты и методы, а также объясняют, как они моделируют состояние объекта и что можно сделать с помощью Это.
Таким образом, они обычно выглядят так: «чем лучше модель, тем лучше она представляет объект в приложении и тем лучше все получается».
Пока все хорошо, но, с другой стороны, я нашел несколько авторов, которые дают рецепты, такие как «класс должен умещаться всего на одной странице» (я бы добавил «на каком размере монитора?», Теперь, когда мы пытаемся не напечатать код!).
Возьмем, к примеру, PurchaseOrderкласс с конечным автоматом, управляющим его поведением, и коллекцией PurchaseOrderItem, одним из аргументов которого здесь является то, что мы должны использовать PurchaseOrderпростой класс с некоторыми методами (немного больше, чем класс данных), и иметь PurchaseOrderFSM«эксперт класс» , который обрабатывает конечный автомат для PurchaseOrder.
Я бы сказал, что подпадает под классификацию «Зависть к особенностям» или «Неприемлемая близость» поста Джеффа Этвуда « Запахи кода» на тему «Кодирующий ужас». Я бы назвал это здравым смыслом. Если я могу оформить, утвердить или отменить свой заказ в режиме реальной покупки, то PurchaseOrderкласс должен иметь issuePO, approvePOи cancelPOметоду.
Разве это не идет с принципами «максимизировать сплоченность» и «минимизировать сцепление», которые я понимаю как краеугольные камни ОО?
Кроме того, разве это не помогает в обслуживании класса?
PurchaseOrder, вы могли бы просто назвать свои методыissue,approveиcancel.POСуффикс добавляет только отрицательное значение.