Какой размер класса является допустимым?

Какой размер класса является допустимым?
Какой размер класса является допустимым? - chris_ainsworth22 @ Unsplash

Я давний разработчик (мне 49 лет), но довольно новичок в объектно-ориентированной разработке. Я читал об ОО со времен Eiffel Бертрана Мейера, но сделал очень мало ОО-программирования.

Дело в том, что каждая книга по ОО-проектированию начинается с примера лодки, автомобиля или любого другого обычного объекта, который мы часто используем, и они начинают добавлять атрибуты и методы и объяснять, как они моделируют состояние объекта и что с ним можно сделать.

Поэтому они обычно звучат примерно так: "Чем лучше модель, тем лучше она представляет объект в приложении, и тем лучше все получается".

Пока все хорошо, но, с другой стороны, я нашел несколько авторов, которые дают рецепты типа "класс должен умещаться на одной странице" (я бы добавил "на каком размере монитора?" теперь, когда мы стараемся не печатать код!).

Возьмем, например, класс PurchaseOrder, который имеет конечный автомат состояния, управляющий его поведением, и коллекцию PurchaseOrderItem, один из аргументов здесь на работе заключается в том, что мы должны использовать простой класс PurchaseOrder с некоторыми методами (не более чем класс данных), и иметь "экспертный класс" PurchaseOrderFSM, который управляет конечным автоматом состояния для PurchaseOrder.

Я бы сказал, что это подпадает под классификацию "Feature Envy" или "Inappropriate Intimacy" из поста Jeff Atwood's Code Smells на Coding Horror. Я бы назвал это просто здравым смыслом. Если я могу выпустить, утвердить или отменить свой реальный заказ на покупку, то класс PurchaseOrder должен иметь методы issuePO, approvePO и cancelPO.

Разве это не соответствует старым принципам "максимизации связности" и "минимизации сопряжения", которые, как я понимаю, являются краеугольными камнями ОО?

Кроме того, разве это не способствует сопровождаемости класса?

Класс должен использовать принцип единой ответственности

Большинство очень больших классов, которые я видел, делают слишком много вещей, поэтому они слишком большие. Посмотрите на каждый метод и код и решите, должен ли он быть в этом классе или отдельно, дублирующийся код - это подсказка. У вас может быть метод issuePO, но содержит ли он, например, 10 строк кода доступа к данным? Этот код, вероятно, не должен быть там.

LetsCodeIt, 22 мая 2023 г., 21:07