Зацепление (программирование): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Преамбула: Перепутаны понятия. Видимо, опечатка.
Преамбула: внутренние ссылки
 
(не показано 48 промежуточных версий 19 участников)
Строка 1: Строка 1:
{{другое значение|У терминов «[[Зацепление]]» и «[[Сцепление]]» есть также другие значения}}
'''Зацепле́ние''', '''сцепле́ние''', '''сопряже́ние'''{{sfn|Макконнел|2010}} ({{lang-en|coupling}}) — способ и степень взаимозависимости между [[Модуль (программирование)|программными модулями]]<ref name="ISO_24765">ISO/IEC/IEEE 24765-2010 Systems and software engineering — Vocabulary</ref>; сила взаимосвязей между модулями<ref name="ISO_TR_19759">ISO/IEC TR 19759:2005, Software Engineering — Guide to the Software Engineering Body of Knowledge (SWEBOK)</ref>; мера того, насколько связаны подпрограммы или модули<ref name="ISO_24765"/>.
'''Зацепление'''<ref>''Кравченко А. К., Афанасьева И. В.'' [https://cyberleninka.ru/article/n/vliyanie-izmeneniya-zatsepleniya-i-svyaznosti-na-slozhnost-koda-i-ego-bystrodeystvie-v-razrabotke-programmnogo-obespecheniya Влияние изменения зацепления и связности на сложность кода и его быстродействие в разработке программного обеспечения] // Радиоэлектроника и информатика, 2016, № 3, с. 9—12.</ref>, '''сцепление''', '''связанность''', '''сопряжение'''{{sfn|Макконнелл|2010}} ({{lang-en|coupling}}) — способ и степень взаимозависимости между [[Модуль (программирование)|программными модулями]]<ref name="ISO_24765">{{Cite web |url=https://standards.iso.org/ittf/PubliclyAvailableStandards/c071952_ISO_IEC_IEEE_24765_2017.zip |title=ISO/IEC/IEEE 24765-2017 Systems and software engineering — Vocabulary |access-date=2021-11-01 |archive-date=2022-03-31 |archive-url=https://web.archive.org/web/20220331214951/https://standards.iso.org/ittf/PubliclyAvailableStandards/c071952_ISO_IEC_IEEE_24765_2017.zip |deadlink=no }}</ref>; сила взаимосвязей между модулями<ref name="ISO_TR_19759">ISO/IEC TR 19759:2005, Software Engineering — Guide to the Software Engineering Body of Knowledge (SWEBOK)</ref>; мера того, насколько взаимозависимы разные подпрограммы или модули<ref name="ISO_24765"/>.


Зацепление обычно противопоставляется [[Связность (программирование)|связности]] ({{lang-en|cohesion}}). Слабое зацепление часто сочетается с сильной связностью и наоборот. [[Метрика программного обеспечения|Метрики]] зацепления и связности были придуманы [[:en:Larry Constantine|Ларри Константином]], изначальным разработчиком структурного проектирования<ref>W. Stevens, G. Myers, L. Constantine, «Structured Design», IBM Systems Journal, 13 (2), 115—139, 1974.</ref>, который был также ранним сторонником таких концепций (см. также [[:en:Structured Systems Analysis and Design Methodology|SSADM]]). Сильное зацепление часто является признаком хорошо структурированной компьютерной системы и признаком хорошего проекта, и, когда она комбинируется со слабой связностью, соответствует общим показателям хорошей читаемости и сопровождаемости.
Сильное зацепление рассматривается как серьёзный недостаток, поскольку затрудняет понимание логики модулей, их модификацию, автономное тестирование, а также переиспользование по отдельности. Например, при изменении требований к одному модулю понадобится модификация также всех зависимых от него. Слабое зацепление, напротив, является признаком хорошо структурированной и хорошо спроектированной системы, и, когда оно комбинируется с сильной [[Связность (программирование)|связностью]], соответствует общим показателям хорошей читаемости и сопровождаемости.


[[Метрика программного обеспечения|Метрики]] зацепления и связности были придуманы [[:en:Larry Constantine|Ларри Константином]], изначальным разработчиком структурного проектирования<ref>W. Stevens, G. Myers, L. Constantine, «Structured Design», IBM Systems Journal, 13 (2), 115—139, 1974.</ref>, который был также ранним сторонником таких концепций (см. также [[Метод структурированного системного анализа и проектирования|SSADM]]).
Слабое зацепление является одним из [[шаблон проектирования|шаблонов]] [[GRASP]] [[Ларман, Крэйг|Крэйга Лармана]]<ref>{{книга

| автор = Philip A. Laplante, Philip A. Laplante
Слабое зацепление является одним из [[шаблон проектирования|шаблонов]] [[GRASP]] [[Ларман, Крэг|Крэйга Лармана]]<ref>{{книга |автор=Philip A. Laplante, Philip A. Laplante |заглавие=What Every Engineer Should Know about Software Engineering |издательство=CRC Press |год=2007 |pages=105–106 |isbn=978-1-4200-0674-2}}</ref>.
| заглавие = What Every Engineer Should Know about Software Engineering
| издательство = CRC Press
| год = 2007
| pages = 105–106
| isbn = 978-1-4200-0674-2
}}</ref>.


== Типы зацепления ==
== Типы зацепления ==
[[Файл:CouplingVsCohesion.svg|thumb|300px|right|Связность и зацепление модулей:<br/> a) '''правильно''' (слабое зацепление, сильная связность), b) '''неправильно''' (сильное зацепление, слабая связность)]]
[[Файл:Coupling sketches cropped 1 ru.svg|thumb|300px|right|upright=2.0|Концептуальная модель зацепления]]


Типы зацепления, согласно стандарту ISO/IEC/IEEE 24765-2010, включают:
Типы зацепления, согласно стандарту ISO/IEC/IEEE 24765, включают:<ref name="ISO_24765"/>
* зацепление по общей области (common-environment coupling);
* '''зацепление по общей области''' ({{lang-en2|common-environment coupling, common coupling}}) — два программных модуля совместно используют общую область данных;
* зацепление по содержимому (content coupling);
* '''зацепление по содержимому''' ({{lang-en2|content coupling}}) — некоторые или все программные модули включены в некоторый модуль как составные части;
* зацепление по управлению (control coupling);
* '''зацепление по управлению''' ({{lang-en2|control coupling}}) — один программный модуль обменивается данными с другим модулем с явной целью повлиять на его последующее выполнение;
* зацепление по данным (data coupling);
* '''зацепление по данным''' ({{lang-en2|data coupling, input-output coupling}}) — выходные данные одного программного модуля служат входными данными другого модуля;
* '''смешанное зацепление''' ({{lang-en2|hybrid coupling}}) — различные подмножества значений некоторого элемента данных используются в нескольких программных модулях для разных и несвязанных целей;
* смешанное зацепление (hybrid coupling);
* патологическое зацепление (pathological coupling)<ref name="ISO_24765"/>.
* '''патологическое зацепление''' ({{lang-en2|pathological coupling}}) — один программный модуль зависит от деталей внутренней реализации другого модуля или влияет на них.
<!--
<!--
{{↕}}
Некоторые типы связанности по направлению от наивысшей к наинизшей связанности, следующие:
; Зацепление по общей области
: Тип зацепления,
; Зацепление по содержимому
: Тип зацепления,.
; Зацепление по управлению
: Тип зацепления,.
; Зацепление по данным
: Тип зацепления,.
; Смешанное зацепление
: Тип зацепления,.
; Патологическое зацепление
: Тип зацепления,.
-->


== Методы уменьшения зацепления ==
;Зацепление содержимого (высокая): Зацепление содержимого это когда один модуль изменяет или полагается на внутреннюю кухню другого модуля (например, доступ к локальным данным другого модуля).
Существуют различные методы уменьшения зацепления ({{lang-en|decoupling}}). Как правило, они описаны в виде [[Шаблон проектирования|шаблонов проектирования]]. Одним из ключевых методов является [[инверсия управления]], и, в частности, [[внедрение зависимости]].
: Следовательно, изменение способа, которым второй модуль производит данные (расположение, тип, время) приведёт к необходимости изменять зависимый модуль.
;Общее зацепление: Общее зацепление это когда два модуля делят между собой один и тот же глобальный набор данных (например, глобальную переменную).
: Изменение общего ресурса подразумевает изменение всех модулей, использующих его.
;Внешняя зацепление: Внешняя зацепление возникает когда два модуля делят между собой определённый извне формат данных, протокол связи, или интерфейс устройства. Это обычно основано на коммуникации со внешними средствами и устройствами.
;Зацепление управления: Зацепление управления это когда один модуль управляет исполнением другого путём передачи ему информации по поводу того, что делать (например, передачей флага «что-нужно-сделать»).
;Зацепление по отпечатку в структуре данных (stamp coupling): Это когда модули делят между собой составную структуру данных, и каждый используют только её часть, по возможности даже не ту же самую часть (например, передача полной структуры в функцию, которой нужно только одно поле этой структуры).
: Это может привести к изменению способа чтения модулем этой структуры, когда изменится поле, которое модуль не использует.
;Зацепление данных: Зацепление данных это когда модули делят общие данные через, скажем, параметры. Каждая порция данных это элементарный фрагмент, и это только те данные, которые используются совместно (например, передача целого числа функции, вычисляющей квадратный корень).
;Зацепление сообщений (низкая): Это наислабейший тип связанности. Он может быть достигнут децентрализацией состояний (как в объектах) и коммуникацией компонентов через параметры или передачу сообщений (см. [[Обмен сообщениями]]).
;Нет связанности: Модули не общаются между собой вовсе.


Снизить зацепление также помогает использование многослойной архитектуры приложений, например [[Model-View-Controller]], [[Model-View-Presenter]], [[Model-View-ViewModel]] и т. п.
=== Объектно-ориентированное программирование ===
;Зацепление подклассов: Описывает взаимоотношения между дочерним и родительским элементами. Дочерний элемент связан с родительским, но родительский не связан с дочерним.

;Временное зацепление: Когда два действия связаны вместе в один модуль только потому, что они происходят в одно и то же время.
-->


== См. также ==
== См. также ==
Строка 51: Строка 47:


== Литература ==
== Литература ==
{{книга
* {{книга
|автор = [[Макконнелл, Стив]]
|автор = [[Макконнелл, Стив]]
|заглавие = Совершенный код
|заглавие = Совершенный код
Строка 66: Строка 62:
|ref = Макконнелл
|ref = Макконнелл
}}
}}
{{Качество программного обеспечения}}

{{Computer-sci-stub}}


[[Категория:Исследование программ]]
[[Категория:Исследование программ]]

Текущая версия от 07:41, 6 мая 2024

Зацепление[1], сцепление, связанность, сопряжение[2] (англ. coupling) — способ и степень взаимозависимости между программными модулями[3]; сила взаимосвязей между модулями[4]; мера того, насколько взаимозависимы разные подпрограммы или модули[3].

Сильное зацепление рассматривается как серьёзный недостаток, поскольку затрудняет понимание логики модулей, их модификацию, автономное тестирование, а также переиспользование по отдельности. Например, при изменении требований к одному модулю понадобится модификация также всех зависимых от него. Слабое зацепление, напротив, является признаком хорошо структурированной и хорошо спроектированной системы, и, когда оно комбинируется с сильной связностью, соответствует общим показателям хорошей читаемости и сопровождаемости.

Метрики зацепления и связности были придуманы Ларри Константином, изначальным разработчиком структурного проектирования[5], который был также ранним сторонником таких концепций (см. также SSADM).

Слабое зацепление является одним из шаблонов GRASP Крэйга Лармана[6].

Типы зацепления

[править | править код]
Связность и зацепление модулей:
a) правильно (слабое зацепление, сильная связность), b) неправильно (сильное зацепление, слабая связность)

Типы зацепления, согласно стандарту ISO/IEC/IEEE 24765, включают:[3]

  • зацепление по общей области (common-environment coupling, common coupling) — два программных модуля совместно используют общую область данных;
  • зацепление по содержимому (content coupling) — некоторые или все программные модули включены в некоторый модуль как составные части;
  • зацепление по управлению (control coupling) — один программный модуль обменивается данными с другим модулем с явной целью повлиять на его последующее выполнение;
  • зацепление по данным (data coupling, input-output coupling) — выходные данные одного программного модуля служат входными данными другого модуля;
  • смешанное зацепление (hybrid coupling) — различные подмножества значений некоторого элемента данных используются в нескольких программных модулях для разных и несвязанных целей;
  • патологическое зацепление (pathological coupling) — один программный модуль зависит от деталей внутренней реализации другого модуля или влияет на них.

Методы уменьшения зацепления

[править | править код]

Существуют различные методы уменьшения зацепления (англ. decoupling). Как правило, они описаны в виде шаблонов проектирования. Одним из ключевых методов является инверсия управления, и, в частности, внедрение зависимости.

Снизить зацепление также помогает использование многослойной архитектуры приложений, например Model-View-Controller, Model-View-Presenter, Model-View-ViewModel и т. п.

Примечания

[править | править код]
  1. Кравченко А. К., Афанасьева И. В. Влияние изменения зацепления и связности на сложность кода и его быстродействие в разработке программного обеспечения // Радиоэлектроника и информатика, 2016, № 3, с. 9—12.
  2. Макконнелл, 2010.
  3. 1 2 3 ISO/IEC/IEEE 24765-2017 Systems and software engineering — Vocabulary. Дата обращения: 1 ноября 2021. Архивировано 31 марта 2022 года.
  4. ISO/IEC TR 19759:2005, Software Engineering — Guide to the Software Engineering Body of Knowledge (SWEBOK)
  5. W. Stevens, G. Myers, L. Constantine, «Structured Design», IBM Systems Journal, 13 (2), 115—139, 1974.
  6. Philip A. Laplante, Philip A. Laplante. What Every Engineer Should Know about Software Engineering. — CRC Press, 2007. — P. 105–106. — ISBN 978-1-4200-0674-2.

Литература

[править | править код]