Каковы симптомы тесно связанных объектов?

Когда вы разрабатываете приложение, когда вы знаете, что ваши объекты тесно связаны? Каковы симптомы тесно связанных объектов / кодов?

5 ответов

Решение

Давайте возьмем два объекта A & B:

Для простоты предположим, что A обладает следующими свойствами

Имя: строка Возраст: целое число Дата рождения: дата и время

Б имеет следующий метод:

CreateInstanceOfA (имя строки, целочисленный возраст, Datetime DateOfBirth) и возвращает экземпляр A со значениями, инициализированными в аргументах метода.

Теперь предположим, что вы добавили новое свойство в A:

StateCode: строка

Теперь у вас есть проблема. Обновляете ли вы CreateInstanceOfA, чтобы включить новое свойство? Если это так, вы должны изменить код везде, на который он ссылается, чтобы включить новое поле. Если выбранный вами язык поддерживает перегрузку операторов, вы можете добавить новый метод. Это может не помешать компиляции, но вам все равно придется обновить код. Хуже того, вы бы использовали старый метод и должны были бы вручную установить новое свойство после создания.

Сын А и Б действительно тесно связаны.

Это не лучший пример, но это быстрый способ увидеть возможные последствия изменения дизайна

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

Class D это класс, который предоставляет некоторую функциональность другим классам.
Class A, Class B а также Class C используйте его напрямую.
Любые изменения в D может повлиять на A, B а также C,
Теперь предположим, что мы хотим улучшить D аутентифицировать любое действие, поступающее из класса A, Не возможно без влияния B а также C для которого мы не заботимся об аутентификации. Должен рефакторинг целиком из-за нового требования.

Другой пример: доступ к базе данных напрямую. Любое изменение в используемой базе данных может повлиять на весь код (если, например, вы делаете SQL заявления во всем без использования DAO). Ваша бизнес-логика не изменилась бы, но новое требование по переключению БД затронуло бы весь ваш код

Возможно, вы испытываете сильную связь, если ваши объекты:

  • Трудно изменить. Симптомы: вам нужно добавлять операторы if в ваши классы каждый раз, когда вы пишете новый вариант зависимости и хотите общаться с ней. В вашей кодовой базе имеется множество операторов if, которые могут работать с глобальными переменными, что делает кошмар отладкой и обслуживанием.

  • ХрупкийСимптомы: ошибка в объекте может распространяться через неожиданное количество других объектов по всей системе. Трудно предсказать последствия изменений, которые вы хотите внести в объекты, из-за отсутствия четких контрактов между зависимостями.

  • Трудно использовать повторно. Симптом: повторное использование объекта в другом контексте подразумевает перетаскивание всех его зависимостей и их деталей, некоторые из которых могут не иметь отношения к этому новому контексту.

  • Трудно проверить. Симптомы: ваши автоматизированные тесты должны склеивать большие кластеры объектов, прежде чем что-либо делать, что делает их медленными до чертиков. Ваши тесты хрупкие - изменение деталей одного объекта пронизывает все настройки тестов его зависимостей, и они легко становятся красными.

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

  • Количество импортов (Java), использования (C#), включает (C++) и т. Д.
  • Количество полей / переменных-членов в классе
  • Количество параметров для метода
  • Количество косвенных ссылок на тип (например, a.getB().getC().getD())

Изменение любого из этих типов потенциально может привести к изменению тесно связанного класса.

Закон Деметры объясняет некоторые простые рекомендации для слабой связи.

С практической точки зрения вы также можете взглянуть на Lattix, плагин Eclipse, который поможет вам отобразить и реорганизовать ваши зависимости

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