В вычислительной технике и проектировании систем слабосвязанная система является одной из
Компоненты в слабосвязанной системе могут быть заменены альтернативными реализациями, которые предоставляют те же самые услуги. Компоненты в слабосвязанной системе менее ограничены той же платформой, языком , операционной системой или средой сборки.
Если системы разъединены во времени, то сложно также обеспечить транзакционную целостность; требуются дополнительные протоколы координации. Репликация данных между различными системами обеспечивает слабую связь (по доступности), но создает проблемы в поддержании согласованности ( синхронизации данных ).
Слабая связанность в более широком проектировании распределенной системы достигается за счет использования транзакций, очередей, предоставляемых промежуточным программным обеспечением, ориентированным на сообщения , и стандартов взаимодействия. [2]
Четыре типа автономии, способствующие слабой связанности, это: автономия ссылок , автономия времени , автономия формата и автономия платформы . [3]
Слабое связывание — это архитектурный принцип и цель проектирования в сервисно-ориентированных архитектурах . Одиннадцать форм слабого связывания и их аналоги с сильным связыванием перечислены в: [4]
Промежуточное программное обеспечение Enterprise Service Bus (ESB) было изобретено для достижения слабой связанности в нескольких измерениях. [5] Однако чрезмерно переработанные и неправильно расположенные ESB могут также иметь противоположный эффект и создавать нежелательную тесную связанность и центральную архитектурную точку перегрузки.
Архитектура, управляемая событиями, также направлена на содействие слабой связанности. [6]
Слабое связывание интерфейсов можно улучшить, опубликовав данные в стандартном формате (например, XML или JSON ).
Слабое связывание между компонентами программы может быть улучшено путем использования стандартных типов данных в параметрах. Передача настраиваемых типов данных или объектов требует, чтобы оба компонента знали определение настраиваемых данных.
Слабое связывание сервисов можно улучшить, сократив объем информации, передаваемой в сервис, до ключевых данных. Например, сервис, отправляющий письмо, наиболее пригоден для повторного использования, когда передается только идентификатор клиента, а адрес клиента получается в сервисе. Это разъединяет сервисы, поскольку сервисы не нужно вызывать в определенном порядке (например, GetCustomerAddress, SendLetter).
Сцепление относится к степени прямого знания, которое один компонент имеет о другом. Слабое сцепление в вычислениях интерпретируется как инкапсуляция против неинкапсуляции.
Примером тесной связи является ситуация, когда зависимый класс содержит указатель непосредственно на конкретный класс, который обеспечивает требуемое поведение. Зависимость не может быть заменена или ее «сигнатура» изменена без необходимости изменения зависимого класса. Слабая связь возникает, когда зависимый класс содержит указатель только на интерфейс, который затем может быть реализован одним или несколькими конкретными классами. Это известно как инверсия зависимости . Зависимость зависимого класса заключается в «контракте», указанном интерфейсом; определенном списке методов и/или свойств, которые должны предоставлять реализующие классы. Таким образом, любой класс, реализующий интерфейс, может удовлетворить зависимость зависимого класса без необходимости изменения класса. Это обеспечивает расширяемость в проектировании программного обеспечения. Новый класс, реализующий интерфейс, может быть написан для замены текущей зависимости в некоторых или всех ситуациях, без необходимости изменения зависимого класса; новые и старые классы могут свободно меняться местами. Сильная связь не допускает этого.
Это диаграмма UML, иллюстрирующая пример слабой связи между зависимым классом и набором конкретных классов, которые обеспечивают требуемое поведение:
Для сравнения эта диаграмма иллюстрирует альтернативную конструкцию с сильной связью между зависимым классом и поставщиком:
Языки программирования, имеющие понятия либо функций как основного модуля (см. Функциональное программирование ), либо функций как объектов, представляют собой прекрасные примеры слабосвязанного программирования. Функциональные языки имеют шаблоны продолжений , замыканий или генераторов. См. Clojure и Lisp в качестве примеров функциональных языков программирования. Объектно-ориентированные языки, такие как Smalltalk и Ruby, имеют блоки кода, тогда как Eiffel имеет агентов. Основная идея заключается в том, чтобы объективировать (инкапсулировать в качестве объекта) функцию независимо от любой другой охватывающей концепции (например, отделение объектной функции от любого прямого знания охватывающего объекта). См. Функция первого класса для дальнейшего изучения функций как объектов, что квалифицируется как одна из форм функции первого класса.
Например, в объектно-ориентированном языке, когда функция объекта ссылается как на объект (освобождая его от знания его включающего хост-объекта), новый функциональный объект может быть передан, сохранен и вызван позднее. Получающие объекты (которым даны эти функциональные объекты) могут безопасно выполнять (вызывать) содержащуюся функцию по своему усмотрению без какого-либо прямого знания включающего хост-объекта. Таким образом, программа может выполнять цепочки или группы функциональных объектов, при этом безопасно отделенная от наличия какой-либо прямой ссылки на включающий хост-объект.
Телефонные номера являются прекрасным аналогом и могут легко проиллюстрировать степень этого разделения.
Например, некая сущность предоставляет другой номер телефона для выполнения определенной работы. Когда номер называется, вызывающая сущность фактически говорит: «Пожалуйста, сделайте эту работу для меня». Разъединение или слабая связь сразу очевидны. Сущность, получающая номер, может не знать, откуда взялся номер (например, ссылка на поставщика номера). С другой стороны, вызывающий субъект отделен от конкретных знаний о том, кому он звонит, где он находится и как получатель звонка функционирует внутри.
Продолжая пример на шаг дальше, вызывающий может сказать получателю вызова: «Пожалуйста, сделайте эту работу для меня. Перезвоните мне по этому номеру, когда закончите». «Номер», предлагаемый получателю, называется «обратным вызовом». Опять же, слабая связанность или разъединенная природа этого функционального объекта очевидна. Получатель обратного вызова не знает, что или кто вызывается. Он знает только, что он может сделать вызов, и сам решает, когда звонить. В действительности обратный вызов может быть даже не тому, кто изначально его предоставил. Этот уровень косвенности делает объекты функций превосходной технологией для создания слабосвязанных программ.
Связь между слабосвязанными компонентами может быть основана на ряде механизмов, таких как упомянутый асинхронный стиль связи или синхронный стиль передачи сообщений [7].
Степень слабой связи можно измерить, отметив количество изменений в элементах данных , которые могут произойти в отправляющих или принимающих системах, и определив, продолжат ли компьютеры по-прежнему правильно общаться. Эти изменения включают в себя такие элементы, как: