Слабое сцепление, высокая когезия для
ремонтопригодное приложение
Это боевой клич, который я слышу снова и снова. Существует множество советов о том, как свободно соединять компоненты.
- Основываться на интерфейсах и внедрять все зависимости
- Использовать события
- Используйте сервисный автобус
- и т.д.
Однако я чувствую, что никогда не слышал никаких конкретных предложений по повышению сплоченности. Кто-нибудь может предложить?
Вы можете начать отвечать там, но я имею в виду конкретную ситуацию, о которой я хотел бы также посоветоваться.
У меня довольно слабосвязанное приложение MVP для Windows Forms на C #, которое основывает многие из своих компонентов на интерфейсах, внедряет их через конструкторы и использует контейнер Inversion of Control (Castle Windsor) для сборки всего этого вместе.
Я бы сказал, что он достаточно хорошо спроектирован - он уже подвергся нескольким большим запросам на изменения и довольно легко их обработал. Я в целом вполне удовлетворен этим, но я просто не могу отпустить ноющее сомнение, что это не особенно сплоченно. Это не проблема для меня как единственного разработчика, но я боюсь, что это может запутать кого-то, кто впервые входит в приложение.
Позвольте мне привести пример - приложение используется компанией A для заполнения и обработки исходящих грузовиков продуктом. Это означает, что существует объект OutgoingTransactionInfo , OutgoingTransactionInfoControl (для фактического ввода указанной информации), OutgoingTransactionValidator и OutgoingTransactionPersister . Когда приложение было запущено в производство, мы получили запрос на обработку входящих транзакций - к ним прикрепляется разная информация, другая проверка и другой способ их сохранения. Затем компания B также захотела использовать приложение для обработки своих транзакций, идея аналогична, но опять же, информация, проверки, постоянство и, возможно, несколько других компонентов отличаются.
Поскольку мое приложение имеет хороший набор тестов и свободно, я смог удовлетворить эти запросы довольно легко. Однако я понимаю, что слишком легко случайно настроить его в недопустимом состоянии. Например, вы можете подключить его к использованию объектов OutgoingTransactionInfo при проверке с помощью IncomingTransactionValidator . Если различия незначительны, ошибка может даже остаться незамеченной в течение некоторого времени.
У вас есть предложения для меня? Какие методы вы использовали, чтобы уменьшить такой риск?