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ść

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.

Zobacz też

Bibliografia

Linki zewnętrzne