Абстракция в классах бизнес-логики - PullRequest
0 голосов
/ 30 мая 2011

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

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 ]

1 голос
/ 30 мая 2011

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

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

КакВ ответе Эрхана указывается, что сплоченность и сцепление являются мерами, которые «находятся в напряжении» с другими мерами и с принципами дизайна (ОО и т. Д.).Если вы игнорируете здравый смысл и пытаетесь максимизировать / минимизировать эти меры по отдельности, вы в конечном итоге получаете нечитаемый код.

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

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

1 голос
/ 30 мая 2011

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

...