Абстракция в классах бизнес-логики

Когда вы вызываете метод из библиотеки, вы ожидаете, что он будет делать именно то, что подразумевает его имя.

Connection c = driver.getConnection();
  1. вернуть связь
  2. сообщить об ошибке в случае сбоя
  3. не делать больше, чем ожидалось

При написании "библиотечного кода" очень легко придерживаться принципов развязки, сплоченности, абстракции. Несоблюдение этих правил в большинстве случаев означает ошибку в дизайне.

Но когда вы занимаетесь бизнес-логикой, возникают некоторые трудности и, возможно, необходимо изменить перспективу. На уровне бизнес-логики я говорю:

session.connect(); //session is of Session type, my "business logic class"

и я ожидаю, что он читает файл конфигурации, принимает значения по умолчанию, если не находит его, подключается, делает некоторую проверку, решает, какое предупреждение необходимо уведомить пользователю, например, тот факт, что версия базы данных старше, чем клиент программного обеспечения.

Если вы скажете, что метод не должен делать все это, потому что он должен быть связным, и применять его строго, вы получите метод connect с одной строкой:

 public class Session {
        ...
        Connection c;
        public void connect() {
             c = driver.getConnection();
        }      
 }

то есть метод connect бизнес-класса Session будет свернут в базовые классы.

А остальные задачи? Прочитать файл, проверить версию БД и т. Д.?

Вы откладываете код дела на "большой метод", который будет выполнять всю логику.

И это именно моя точка зрения.

Если вы примените принципы сплоченности и разделения в контексте бизнес-логики, вам не удастся разделить задачи на более мелкие подзадачи, и у вас будут несколько больших "монолитных" методов, выполняющих всю работу и плохо читаемых.

Я считаю, что хорошие принципы (связность, абстракция) для библиотек низкого уровня (Driver.getConnection()) совершенно не подходят для логики работы.

Мои идеи:

  1. сплоченность должна быть заменена совершенно новой концепцией
  2. сплоченность должна быть "растянута" до определенной точки

И поскольку я предпочитаю второе, мой вопрос в том, что это за точка.

2 ответа

И поскольку я предпочитаю второе, мой вопрос в том, что это за точка.

Я не думаю, что это ответственно каким-либо осмысленным образом.

Как указывает ответ @Erhan, Cohesion и Coupling - это меры, которые "находятся в напряжении" с другими мерами и с принципами дизайна (OO и другие). Если вы игнорируете здравый смысл и пытаетесь максимизировать / минимизировать эти меры изолированно, вы получите нечитаемый код.

ИМО, лучший подход заключается в разработке хорошей интуиции того, что делает ваш код читабельным, а ваш дизайн - понятным. Обратите внимание на различные меры, но если они противоречат вашей интуиции, будьте готовы их игнорировать. Если вы не уверены в правильности своей интуиции, попросите более опытного разработчика проверить вашу работу.

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

Я думаю, что вам не хватает некоторых частей в концепции ООП и хорошего дизайна. Если ваш код больше недоступен для чтения - как упоминал Мартин Фаулер, если ваш код пахнет - из-за ваших попыток увеличить сцепление или уменьшить связь (вы не можете удалить связь до%0 или вы не можете увеличить связь до 100%. Когда вы пытаетесь это сделать, вы получаете код, подобный вашему примеру connect() выше, вы ошибаетесь. Потому что эти концепции призваны сделать ваш код более читабельным. Существуют также концепции рефакторинга, такие как "метод извлечения" для повышения сплоченности. Сплоченность и сцепление обычно используются с прилагательными "низшая сцепка" и "более высокая сцепленность". Как низко или высоко они должны быть, дизайнер должен решить / оптимизировать это. Кстати, если вы вызываете session.connect(), я не ожидаю, что соединение должно быть настроено. Для этого существует множество других концепций, таких как фабрика соединений, менеджер сеансов и Ко. Если соединение настроено один раз, вы можете вызвать метод connect(), чтобы установить физическое соединение с устройством (базой данных).

Другие вопросы по тегам