Low coupling - Низкая связность
Coupling - [ˈkəp(ə)lɪŋ] - связность
"Low coupling" (Низкая связность) - это термин, используемый в программной инженерии для описания степени взаимозависимости между различными модулями или компонентами системы. Он относится к тому, насколько один модуль взаимодействует с другим модулем через простой и стабильный интерфейс и не нуждается в заботе о внутренней реализации другого модуля. Другими словами, низкая связность указывает на то, что каждый модуль, класс или компонент должен иметь как можно меньше зависимостей, а изменение одного модуля должно иметь мало или никакого влияния на другие модули.
Низкая связность является ключевым фактором для создания гибких и легко поддерживаемых систем. Она позволяет разрабатывать и тестировать каждый модуль независимо, уменьшая влияние изменений на другие компоненты системы . Более того, низкая связность облегчает масштабирование системы и уменьшает вероятность ошибок при изменении кода.
Примеры высокой связности
Примером высокой связности может быть класс "Кредитная карта", который специализирован на проверке и обработке информации о кредитных картах. В этом классе будут методы для проверки номера кредитной карты, проверки срока действия карты и проверки кода безопасности. Все эти методы относятся к одной области знаний и должны быть близко расположены друг к другу.
class Credit_Card {
method check_Number() {}
method check_Date() {}
method check_CVC() {}
}
Пример низкой связности
Примером низкой связности может быть класс "Кредитная карта", который также содержит методы для обработки платежей. Эти методы не относятся к проверке информации о кредитных картах и должны быть вынесены в отдельный класс "Платежи".
class Credit_Card {
method check_Number() {}
method check_Date() {}
method check_CVC() {}
////////// Платежи //////////
method make_transaction() {}
method make_overdraft() {}
}
Достижение высокой связности
Чтобы достичь высокой связности, следует использовать следующие методы:
- Разделение ответственности (Separation of concerns): Каждый модуль или класс должен выполнять только одну задачу. Это позволяет сделать код более читаемым и понятным, а также уменьшает сложность системы.
- Модульность: Разбейте систему на независимые модули, каждый из которых выполняет определенную функцию. Это позволяет легко изменять и тестировать каждый модуль независимо.
- Использование интерфейсов: Используйте интерфейсы для обеспечения простого и стабильного взаимодействия между модулями.
- Использование шаблонов проектирования: Шаблоны проектирования помогают создавать гибкие и легко поддерживаемые системы с высокой связностью и низкой связностью.
- Тестирование: Тестирование помогает обнаруживать ошибки и проблемы в системе, что позволяет улучшить её качество и поддерживаемость.
High cohesion - Высокое зацепление
Cohesion - [kə(ʊ)ˈhiːʒn] - зацепление
"High cohesion" (Высокое зацепление) - это термин, который относится к степени того, насколько элементы модуля или класса принадлежат друг другу. Высокая связность означает, что связанный код должен быть близко расположен друг к другу, поэтому мы должны стремиться к высокой связности и связывать весь связанный код вместе как можно ближе.
"Низкая связность" часто сочетается с "высоким зацеплением", что относится к степени того, насколько элементы модуля или класса принадлежат друг другу. Это два разных шаблона, которые стоит рассматривать всегда вместе. Если бы будем стремиться к низкому зацеплению, то придём к тому что у нас будет только один класс со всем подряд. В этом случае связи между классами исчезнут и один класс будет содержать всю подряд бизнес-логику (например, проверка номера кредитной карты и проведение оплат). Суть обоих шаблонов состоит в том чтобы в системе были слабо связанные классы которые содержали связанную бизнес-логику.
Слабо связанные классы должны содержать связанную бизнес-логику
Уменьшение зацепления
Существует несколько методов уменьшения зацепления в программной инженерии. Они описаны в виде шаблонов проектирования и могут быть использованы для создания гибких и легко поддерживаемых систем с высокой связностью и низкой связностью:
- Инверсия управления (Inversion of Control, IoC): Этот метод позволяет уменьшить зацепление, перенеся ответственность за создание объектов на другой компонент системы. Это делает систему более гибкой и легко поддерживаемой.
- Внедрение зависимости (Dependency injection, DI): Этот метод позволяет уменьшить зацепление, разрывая связь между компонентами системы. Вместо того, чтобы компоненты напрямую зависели друг от друга, они зависят от абстрактных интерфейсов.
- Многослойная архитектура: Этот метод позволяет уменьшить зацепление, разделяя систему на слои. Каждый слой выполняет определенную функцию и зависит только от слоя, который находится непосредственно под ним. Примером могут быть шаблоны Model-View-Controller, Model-View-Presenter, Model-View-ViewModel и т. п.
- Шаблоны проектирования: Шаблоны проектирования помогают создавать гибкие и легко поддерживаемые системы с высокой связностью и низкой связностью.