Spójność (informatyka) - Cohesion (computer science)
W programowaniu komputerowym , spójności odnosi się do stopnia, w którym elementy wewnątrz modułu są ze sobą połączone . W pewnym sensie jest to miara siły związku między metodami i danymi klasy a jakimś ujednoliconym celem lub koncepcją obsługiwanym przez tę klasę. W innym sensie jest to miara siły związku między metodami klasy a samymi danymi.
Spójność jest porządkowym rodzajem pomiaru i jest zwykle opisywana jako „wysoka spójność” lub „niska spójność”. Preferowane są moduły o wysokiej spójności, ponieważ wysoka spójność wiąże się z kilkoma pożądanymi cechami oprogramowania, w tym odpornością , niezawodnością, możliwością ponownego użycia i zrozumiałością. Natomiast niska spójność wiąże się z niepożądanymi cechami, takimi jak trudność w utrzymaniu, testowaniu, ponownym użyciu, a nawet w zrozumieniu.
Spójność jest często przeciwstawiana sprzężeniu , innej koncepcji. Wysoka kohezja często koreluje z luźnym sprzężeniem i odwrotnie. Do metryki oprogramowania sprzęgania i spójności zostały wymyślone przez Larry Konstantyna pod koniec 1960 roku jako część Structured projekt , na podstawie cech charakterystycznych „dobrych praktyk” Programowanie że zmniejszenie kosztów konserwacji i modyfikacji. Strukturalny projekt, spójność i sprzęganie zostały opublikowane w artykule Stevens, Myers i Constantine (1974) oraz w książce Yourdon i Constantine (1979); dwa ostatnie stały się następnie standardowymi terminami w inżynierii oprogramowania.
Wysoka spójność
W programowaniu obiektowym , jeśli metody obsługujące klasę są podobne pod wieloma względami, mówi się, że klasa ma wysoką spójność. W wysoce spójnym systemie zwiększa się czytelność kodu i możliwość ponownego wykorzystania , a złożoność jest możliwa do opanowania.
Spójność wzrasta, jeśli:
- Funkcjonalności osadzone w klasie, do których dostęp uzyskuje się poprzez jej metody, mają wiele wspólnego.
- Metody wykonują niewielką liczbę powiązanych działań, unikając gruboziarnistych lub niepowiązanych zestawów danych.
- Pokrewne metody znajdują się w tym samym pliku źródłowym lub w inny sposób są zgrupowane razem; na przykład w osobnych plikach, ale w tym samym podkatalogu/folderze.
Zalety wysokiej spójności (lub „silnej spójności”) to:
- Zmniejszona złożoność modułów (są prostsze, mają mniej operacji).
- Zwiększona łatwość utrzymania systemu , ponieważ logiczne zmiany w domenie wpływają na mniejszą liczbę modułów, a zmiany w jednym module wymagają mniejszej liczby zmian w innych modułach.
- Zwiększona możliwość ponownego wykorzystania modułu, ponieważ twórcy aplikacji łatwiej znajdą potrzebny komponent wśród spójnego zestawu operacji zapewnianych przez moduł.
Podczas gdy w zasadzie moduł może mieć doskonałą spójność, składając się tylko z pojedynczego, atomowego elementu – mającego na przykład jedną funkcję – w praktyce złożone zadania nie są wyrażalne przez pojedynczy, prosty element. W ten sposób moduł jednoelementowy zawiera element, który jest albo zbyt skomplikowany, aby wykonać zadanie, albo jest zbyt wąski, a zatem ściśle połączony z innymi modułami. W ten sposób spójność jest równoważona zarówno złożonością jednostek, jak i sprzężeniem.
Rodzaje spójności
Spójność jest miarą jakościową, co oznacza, że mierzony kod źródłowy jest sprawdzany za pomocą rubryk w celu określenia klasyfikacji. Rodzaje spójności, od najgorszego do najlepszego, są następujące:
- Przypadkowa spójność (najgorsza)
- Przypadkowa spójność ma miejsce, gdy części modułu są pogrupowane arbitralnie; jedyny związek między częściami polega na tym, że zostały one zgrupowane razem (np. klasa „Narzędzia”). Przykład:
/* Groups: The function definitions Parts: The terms on each function */ Module A{ /* Implementation of r(x) = 5x + 3 There is no particular reason to group functions in this way, so the module is said to have Coincidental Cohesion. */ r(x) = a(x) + b(x) a(x) = 2x + 1 b(x) = 3x + 2 }
- Spójność logiczna
- Spójność logiczna występuje wtedy, gdy części modułu sąpogrupowane ponieważsąlogicznie skategoryzowane tak,żeby robićto samo nawet jeśli sąróżnez natury (np grupowanie wszystkich procedur obsługi danych wejściowych myszy i klawiatury lub grupowanie wszystkich modeli, widoków i kontrolerów w osobnych folderach we wzorcu MVC ).
- Spójność czasowa
- Spójność czasowa ma miejsce, gdy części modułu są pogrupowane według czasu ich przetwarzania - części są przetwarzane w określonym czasie wykonywania programu (np. funkcja, która jest wywoływana po przechwyceniu wyjątku, który zamyka otwarte pliki, tworzy dziennik błędów i powiadamia użytkownika).
- Spójność proceduralna
- Spójność proceduralna ma miejsce wtedy, gdy części modułu są grupowane, ponieważ zawsze następują po określonej kolejności wykonywania (np. funkcja, która sprawdza uprawnienia do pliku, a następnie otwiera plik).
- Spójność komunikacyjna/informacyjna
- Spójność komunikacyjna ma miejsce wtedy, gdy części modułu są pogrupowane, ponieważ operują na tych samych danych (np. moduł, który operuje na tym samym zapisie informacji).
- Spójność sekwencyjna
- Spójność sekwencyjna ma miejsce, gdy części modułu są pogrupowane, ponieważ dane wyjściowe z jednej części są danymi wejściowymi dla innej części, jak linia montażowa (np. funkcja, która odczytuje dane z pliku i przetwarza dane).
- Spójność funkcjonalna (najlepsza)
- Spójność funkcjonalna występuje wtedy, gdy części modułu są pogrupowane, ponieważ wszystkie przyczyniają się do jednego, dobrze zdefiniowanego zadania modułu (np. Analiza leksykalna ciągu XML). Przykład:
/* Groups: The function definitions Parts: The terms on each function */ Module A { /* Implementation of arithmetic operations This module is said to have functional cohesion because there is an intention to group simple arithmetic operations on it. */ a(x, y) = x + y b(x, y) = x * y } Module B { /* Module B: Implements r(x) = 5x + 3 This module can be said to have atomic cohesion. The whole system (with Modules A and B as parts) can also be said to have functional cohesion, because its parts both have specific separate purposes. */ r(x) = [Module A].a([Module A].b(5, x), 3) }
- Doskonała spójność (atomowa)
- Przykład.
/* Groups: The function definitions Parts: The terms on each function */ Module A { /* Implementation of r(x) = 2x + 1 + 3x + 2 It's said to have perfect cohesion because it cannot be reduced any more than that. */ r(x) = 5x + 3 }
Chociaż spójność jest rodzajem skali rankingowej, rankingi nie wskazują na stały postęp poprawy spójności. Badania przeprowadzone przez różnych ludzi, w tym Larry'ego Constantine'a , Edwarda Yourdona i Steve'a McConnella wskazują, że dwa pierwsze typy spójności są gorsze; spójność komunikacyjna i sekwencyjna są bardzo dobre; a spójność funkcjonalna jest lepsza.
Chociaż spójność funkcjonalna jest uważana za najbardziej pożądany rodzaj spójności dla modułu oprogramowania, może nie być osiągalna. Zdarzają się przypadki, w których spójność komunikacyjna jest najwyższym poziomem spójności, jaki można osiągnąć w danych okolicznościach.