Sprzęganie (programowanie komputerowe) - Coupling (computer programming)

W inżynierii oprogramowania , sprzęgło jest stopień współzależności między oprogramowania modułów ; miara tego, jak ściśle powiązane są dwie procedury lub moduły; siła relacji między modułami.

Sprzężenie i spójność

Sprzężenie jest zwykle przeciwstawiane spójności . Niskie sprzężenie często koreluje z wysoką spójnością i na odwrót. Niskie sprzężenie jest często uważane za oznakę dobrze zorganizowanego systemu komputerowego i dobrego projektu, a w połączeniu z wysoką spójnością wspiera ogólne cele wysokiej czytelności i łatwości konserwacji .

Historia

Do jakości oprogramowanie metryki sprzęgania i spójności zostały wymyślone przez Larry Konstantyna pod koniec 1960 roku jako część strukturze projektu , na podstawie cech charakterystycznych „dobrych praktyk” Programowanie że zmniejszenie kosztów konserwacji i modyfikacji. Projekt strukturalny, w tym spójność i sprzęganie, zostały opublikowane w artykule Stevens, Myers i Constantine (1974) oraz w książce Yourdon i Constantine (1979), a te ostatnie stały się następnie terminami standardowymi.

Rodzaje sprzęgieł

Model koncepcyjny sprzężenia

Sprzężenie może być „niskie” (również „ luźne ” i „słabe”) lub „wysokie” (również „ciasne” i „mocne”). Niektóre rodzaje sprzężenia, w kolejności od najwyższego do najniższego sprzężenia, są następujące:

Programowanie proceduralne

W tym przypadku moduł odnosi się do podprogramu dowolnego rodzaju, tj. zbioru jednej lub więcej instrukcji mających nazwę, a najlepiej własny zbiór nazw zmiennych.

Łączenie treści (wysokie)
Mówi się, że łączenie treści ma miejsce, gdy jeden moduł używa kodu innego modułu, na przykład gałęzi. Narusza to ukrywanie informacji – podstawową koncepcję projektowania oprogramowania.
Wspólne sprzęgło
Mówi się, że wspólne sprzężenie występuje, gdy kilka modułów ma dostęp do tych samych danych globalnych. Może jednak prowadzić do niekontrolowanego propagacji błędów i nieprzewidzianych skutków ubocznych przy wprowadzaniu zmian.
Złącze zewnętrzne
Sprzężenie zewnętrzne występuje, gdy dwa moduły współdzielą zewnętrznie narzucony format danych, protokół komunikacyjny lub interfejs urządzenia. Jest to zasadniczo związane z komunikacją z zewnętrznymi narzędziami i urządzeniami.
Złącze sterujące
Sprzężenie sterowania to jeden moduł kontrolujący przepływ przez inny, poprzez przekazywanie mu informacji o tym, co należy zrobić (np. przekazując flagę co zrobić).
Sprzęgło stemplowe (sprzęganie strukturalne)
Sprzęganie stemplowe ma miejsce, gdy moduły współdzielą złożoną strukturę danych i wykorzystują tylko jej części, być może różne części (np. przekazywanie całego rekordu do funkcji, która potrzebuje tylko jednego jego pola).
W takiej sytuacji modyfikacja pola, której moduł nie potrzebuje, może prowadzić do zmiany sposobu, w jaki moduł odczytuje rekord.
Łączenie danych
Sprzężenie danych występuje, gdy moduły współdzielą dane za pośrednictwem np. parametrów. Każdy punkt odniesienia jest elementem elementarnym i są to jedyne współdzielone dane (np. przekazanie liczby całkowitej do funkcji obliczającej pierwiastek kwadratowy).

Programowanie obiektowe

Sprzęgło podklasy
Opisuje relację między dzieckiem a jego rodzicem. Dziecko jest połączone z rodzicem, ale rodzic nie jest połączony z dzieckiem.
Sprzężenie czasowe
Dzieje się tak, gdy dwie akcje są połączone w jeden moduł tylko dlatego, że zdarzają się w tym samym czasie.

W ostatnich pracach zbadano różne inne koncepcje sprzężenia i wykorzystano je jako wskaźniki różnych zasad modularyzacji stosowanych w praktyce.

Sprzężenie dynamiczne

Celem tego typu sprzężenia jest zapewnienie oceny systemu oprogramowania w czasie wykonywania. Argumentowano, że statyczne metryki sprzężenia tracą precyzję, gdy mają do czynienia z intensywnym wykorzystaniem dynamicznego wiązania lub dziedziczenia. Próbując rozwiązać ten problem, uwzględniono miary sprzężenia dynamicznego.

Sprzężenie semantyczne

Ten rodzaj sprzężenia uwzględnia koncepcyjne podobieństwa między jednostkami oprogramowania wykorzystującymi na przykład komentarze i identyfikatory oraz opierając się na technikach, takich jak ukryte indeksowanie semantyczne (LSI).

Sprzężenie logiczne

Sprzężenie logiczne (lub sprzężenie ewolucyjne lub sprzężenie zmian) wykorzystuje historię wydań systemu oprogramowania, aby znaleźć wzorce zmian między modułami lub klasami: np. podmioty, które mogą być zmieniane razem lub sekwencje zmian (zmiana w klasie A jest zawsze następnie zmiana w klasie B).

Wady ciasnego sprzężenia

Systemy ściśle sprzężone mają tendencję do wykazywania następujących cech rozwojowych, które często są postrzegane jako wady:

  1. Zmiana w jednym module zwykle wymusza efekt domina zmian w innych modułach.
  2. Montaż modułów może wymagać więcej wysiłku i/lub czasu ze względu na zwiększoną zależność między modułami.
  3. Konkretny moduł może być trudniejszy do ponownego użycia i/lub przetestowania, ponieważ muszą być dołączone moduły zależne.

Problemy z wydajnością

Niezależnie od tego, czy jest on luźno czy ściśle powiązany, wydajność systemu jest często ograniczana przez tworzenie komunikatów i parametrów, transmisję, translację (np. krosowanie) i interpretację komunikatów (która może być odniesieniem do ciągu, tablicy lub struktury danych), które wymagają mniejszych nakładów niż tworzenie skomplikowany komunikat, taki jak komunikat SOAP . Dłuższe wiadomości wymagają więcej procesora i pamięci do wyprodukowania. Aby zoptymalizować wydajność środowiska wykonawczego, należy zminimalizować długość komunikatu i zmaksymalizować jego znaczenie.

Narzut i wydajność transmisji wiadomości
Ponieważ wiadomość musi być transmitowana w całości, aby zachować swoje pełne znaczenie, transmisja wiadomości musi zostać zoptymalizowana. Dłuższe wiadomości wymagają więcej procesora i pamięci do przesyłania i odbierania. Ponadto, gdy jest to konieczne, odbiorcy muszą ponownie złożyć wiadomość do jej oryginalnego stanu, aby ją całkowicie odebrać. W związku z tym, aby zoptymalizować wydajność środowiska wykonawczego, należy zminimalizować długość komunikatu i zmaksymalizować jego znaczenie.
Narzut i wydajność tłumaczenia wiadomości
Protokoły komunikatów i same komunikaty często zawierają dodatkowe informacje (tj. informacje o pakiecie, strukturze, definicji i języku). W związku z tym odbiorca często musi przetłumaczyć komunikat na bardziej wyrafinowaną formę, usuwając dodatkowe znaki i informacje o strukturze i/lub konwertując wartości z jednego typu na inny. Każdy rodzaj tłumaczenia zwiększa obciążenie procesora i/lub pamięci. Aby zoptymalizować wydajność środowiska wykonawczego, należy zredukować i udoskonalić formę i treść wiadomości, aby zmaksymalizować ich znaczenie i ograniczyć tłumaczenie.
Narzut i wydajność interpretacji wiadomości
Wszystkie komunikaty muszą być zinterpretowane przez odbiorcę. Proste komunikaty, takie jak liczby całkowite, mogą nie wymagać dodatkowego przetwarzania do interpretacji. Jednak złożone komunikaty, takie jak komunikaty SOAP, wymagają parsera i transformatora łańcuchowego, aby mogły wykazywać zamierzone znaczenie. Aby zoptymalizować wydajność środowiska wykonawczego, komunikaty muszą zostać dopracowane i zredukowane, aby zminimalizować narzuty na interpretację.

Rozwiązania

Jednym z podejść do zmniejszania sprzężenia jest projektowanie funkcjonalne , które ma na celu ograniczenie odpowiedzialności modułów wraz z funkcjonalnością. Sprzężenie wzrasta między dwiema klasami A i B, jeżeli:

  • A ma atrybut, który odnosi się do (jest typu) B .
  • A wywołuje usługi obiektu B .
  • A ma metodę, która odwołuje się do B (poprzez typ zwracany lub parametr).
  • A jest podklasą (lub implementuje) klasę B .

Niskie sprzężenie odnosi się do relacji, w której jeden moduł współdziała z innym modułem poprzez prosty i stabilny interfejs i nie musi zajmować się wewnętrzną implementacją drugiego modułu (zobacz Ukrywanie informacji ).

Systemy takie jak CORBA czy COM pozwalają obiektom komunikować się ze sobą bez konieczności posiadania wiedzy o implementacji innego obiektu. Oba te systemy pozwalają nawet obiektom komunikować się z obiektami napisanymi w innych językach.

Sprzężenie a spójność

Sprzężenie i spójność to terminy, które bardzo często występują razem. Sprzężenie odnosi się do współzależności między modułami, podczas gdy spójność opisuje, jak powiązane są funkcje w ramach pojedynczego modułu. Niska spójność oznacza, że ​​dany moduł wykonuje zadania, które nie są ze sobą bardzo powiązane, a co za tym idzie mogą stwarzać problemy, gdy moduł staje się duży.

Łączenie modułów

Coupling in Software Engineering opisuje wersję metryk związanych z tą koncepcją.

W przypadku sprzężenia danych i przepływu sterowania:

  • d i : liczba parametrów danych wejściowych
  • c i : liczba wejściowych parametrów sterujących
  • d O : ilość danych wyjściowych parametrów
  • c o : liczba parametrów sterujących wyjściami

Dla globalnego sprzężenia:

  • g d : liczba zmiennych globalnych używanych jako dane
  • g c : liczba zmiennych globalnych używanych jako kontrola

Do sprzężenia środowiskowego:

  • w : liczba wywoływanych modułów (fan-out)
  • r : liczba modułów wywołujących dany moduł (fan-in)

Coupling(C)sprawia, że ​​wartość jest większa, im bardziej jest sprzężony moduł. Ta liczba waha się od około 0,67 (niskie sprzężenie) do 1,0 (wysoce sprzężone)

Na przykład, jeśli moduł ma tylko jeden parametr danych wejściowych i wyjściowych

Jeśli moduł ma 5 parametrów danych wejściowych i wyjściowych, równą liczbę parametrów sterujących i ma dostęp do 10 pozycji danych globalnych, z rozłożeniem 3 i rozłożeniem 4,

Zobacz też

Bibliografia

Dalsza lektura