Co to jest wysoka spójność i jak ją wykorzystać / zrobić?


84

Uczę się programowania komputerowego iw kilku miejscach natknąłem się na koncepcję spójności i rozumiem, że oprogramowanie powinno mieć „wysoką spójność”, ale co to znaczy? Jestem programistą Java, C i Python uczącym się C ++ z książki C ++ Primer, w której wspomniano o spójności bez umieszczania jej w indeksie, czy możesz wskazać mi jakieś linki na ten temat? Nie znalazłem strony wikipedii o spójności informatyki, ponieważ mówi tylko, że jest to miara jakościowa i nie podaje prawdziwych przykładów kodu.



3
Wysoka spójność: pokrewne zachowanie, aby siedzieć razem i niezwiązane zachowanie, aby siedzieć gdzie indziej.
Teoman shipahi

Odpowiedzi:


240

Wysoka spójność występuje wtedy, gdy masz klasę, która wykonuje dobrze zdefiniowaną pracę. Niska spójność występuje wtedy, gdy klasa wykonuje wiele prac, które nie mają wiele wspólnego.

Weźmy ten przykład:

Masz klasę, która dodaje dwie liczby, ale ta sama klasa tworzy okno wyświetlające wynik. Jest to klasa o niskiej spójności, ponieważ okno i operacja dodawania nie mają wiele wspólnego. Okno jest wizualną częścią programu, a funkcja dodawania to logika, która za nim stoi.

Aby stworzyć wysoce spójne rozwiązanie, należałoby stworzyć klasę Window i klasę Sum. Okno wywoła metodę Sum w celu uzyskania wyniku i wyświetlenia go. W ten sposób oddzielnie opracujesz logikę i GUI swojej aplikacji.


14
Szczerze mówiąc, tak nie definiuję spójności. Twoja definicja to SRP (zasada pojedynczej odpowiedzialności). A spójność dotyczy tego, czy pod względem pakietu, orbitujące wokół tych samych cech klasy są blisko siebie, czy nie.
v.oddou,

4
SRP (zasada pojedynczej odpowiedzialności) to po prostu inny sposób wyrażenia tej samej koncepcji. Spójność jest bardziej miernikiem; SRP jest pragmatyczną wytyczną, której przestrzeganie doprowadzi do spójnych klas.
ComDubh

3
Myślę, że okno klasy nie powinno wywoływać żadnego obiektu sumy klas, ponieważ jego jedynym celem jest renderowanie nie musi wiedzieć o "istnieniu" sumy klas lub jakiejkolwiek innej klasy. Powinna być inna klasa mówi Sterownik, który powinien otrzymać wynik z klasa sumy i przekazałby wynik do klasy Window do renderowania
Eklavyaa

1
Nie rozumiem. To nie jest spójność według czystego kodu wujka Boba. To jest SRP
karlihnos

Bardzo zgrabne wyjaśnienie! Dzięki
Vincent Llauderes

55

Wyjaśnienie, co to jest z Code Complete Steve'a McConnella :

Spójność odnosi się do tego, jak blisko wszystkie procedury w klasie lub cały kod procedury wspierają główny cel . Klasy, które zawierają silnie powiązaną funkcjonalność, są opisane jako mające silną spójność, a celem heurystycznym jest uczynienie spójności tak silną, jak to tylko możliwe. Spójność jest użytecznym narzędziem do zarządzania złożonością, ponieważ im więcej kodu w klasie obsługuje główny cel, tym łatwiej mózg może zapamiętać wszystko, co robi kod.

Niektóre ze sposobów osiągnięcia go od wuja Boba czystego kodu :

Klasy powinny mieć niewielką liczbę zmiennych instancji . Każda z metod klasy powinna manipulować co najmniej jedną z tych zmiennych. Ogólnie, im więcej zmiennych operuje metoda, tym bardziej spójna jest ta metoda ze swoją klasą. Klasa, w której każda zmienna jest używana przez każdą metodę, jest maksymalnie spójna.

Generalnie tworzenie takich maksymalnie spójnych klas nie jest ani wskazane, ani możliwe; z drugiej strony chcielibyśmy, aby spójność była wysoka. Kiedy spójność jest wysoka, oznacza to, że metody i zmienne tej klasy są współzależne i łączą się jako logiczna całość.

Pojęcie spójności jest silnie powiązane z pojęciem sprzężenia; istnieje również zasada oparta na heurystyce wysokiej spójności, zwana Zasada Pojedynczej Odpowiedzialności (S od SOLID).


1
Myślę, że twoja odpowiedź jest pełniejsza niż ta przyjęta, ponieważ opisuje zarówno SRP, jak i spójność, a więc pomaga zrozumieć specyfikę i różnice między tymi dwoma pojęciami.
The Once-ler

18

Wysoka spójność to koncepcja inżynierii oprogramowania. Zasadniczo mówi, że klasa powinna robić tylko to, co powinna, i robi to w pełni. Nie przeładowuj go funkcjami, których nie powinien wykonywać, a cokolwiek bezpośrednio z nim związane nie powinno również pojawiać się w kodzie innej klasy.

Przykład jest dość subiektywny, ponieważ musimy również wziąć pod uwagę skalę. Prosty program nie powinien być zbyt modularny, bo będzie fragmentaryczny; podczas gdy złożony program może wymagać większego poziomu abstrakcji, aby zająć się złożonością.

np. klasa e-mail. Powinien zawierać elementy składowe danych do, z, cc, bcc, subject, body i może zawierać metody saveAsDraft (), send (), discardDraft (). Ale login () nie powinno być tutaj, ponieważ istnieje wiele protokołów e-mail i powinno być zaimplementowane oddzielnie.


Oto definicja SRP: „klasa powinna robić tylko to, co powinna, i robi to w pełni”.
AliN11

11

Spójność jest zwykle mierzona za pomocą jednej z miar LCOM (brak spójności), oryginalna metryka LCOM pochodzi z Chidamber i Kemerer. Zobacz na przykład: http://www.computing.dcu.ie/~renaat/ca421/LCOM.html

Bardziej konkretny przykład: jeśli klasa ma na przykład jedno pole prywatne i trzy metody; gdy wszystkie trzy metody używają tego pola do wykonania operacji, klasa jest bardzo spójna.

Pseudokod spójnej klasy:

class FooBar {
  private SomeObject _bla = new SomeObject();

  public void FirstMethod() {
    _bla.FirstCall();
  }

  public void SecondMethod() {
    _bla.SecondCall();
  }

  public void ThirdMethod() {
    _bla.ThirdCall();
  }
}

Jeśli klasa ma na przykład trzy pola prywatne i trzy metody; gdy wszystkie trzy metody używają tylko jednego z trzech pól, wówczas klasa jest słabo spójna.

Pseudokod słabo spójnej klasy:

class FooBar {
  private SomeObject _bla = new SomeObject();
  private SomeObject _foo = new SomeObject();
  private SomeObject _bar = new SomeObject();

  public void FirstMethod() {
    _bla.Call();
  }

  public void SecondMethod() {
    _foo.Call();
  }

  public void ThirdMethod() {
    _bar.Call();
  }
}

Klasa, która robi jedną rzecz, to Zasada pojedynczej odpowiedzialności, która pochodzi od Roberta C. Martina i jest jedną z zasad SOLIDNYCH . Zasada nakazuje, aby klasa miała tylko jeden powód do zmiany.

Trzymanie się zasady pojedynczej odpowiedzialności mogłoby skutkować bardziej spójnym kodem, ale moim zdaniem to dwie różne rzeczy.


4

Oto przykład niskiej spójności:

class Calculator
{


     public static void main(String args[])
     {

          //calculating sum here
          result = a + b;
          //calculating difference here
          result = a - b;
          //same for multiplication and division
     }
}

Ale wysoka spójność oznacza, że ​​funkcje w klasach robią to, co powinny (tak jak są nazwane). A nie jakaś funkcja wykonująca jakąś inną funkcję. Przykładem wysokiej spójności mogą być więc:

class Calculator
{


     public static void main(String args[])
     {

          Calculator myObj = new Calculator();
          System.out.println(myObj.SumOfTwoNumbers(5,7));
      }


     public int SumOfTwoNumbers(int a, int b)
     {

          return (a+b);
     }

     //similarly for other operations

}

3

Ogólnym sposobem myślenia o zasadzie spójności jest to, że powinieneś zlokalizować kod wraz z innym kodem, który albo od niego zależy, albo od którego zależy. Spójność można i należy stosować do poziomów składu powyżej poziomu klasy. Na przykład pakiet lub przestrzeń nazw powinny idealnie zawierać klasy, które odnoszą się do jakiegoś wspólnego motywu i które są bardziej współzależne niż zależne od innych pakietów / przestrzeni nazw. To znaczy utrzymuj zależności lokalne.


1

spójność oznacza, że ​​klasa lub metoda wykonuje tylko jedno określone zadanie. nazwa metody lub klasy również powinna być oczywista. na przykład jeśli piszesz kalkulator, powinieneś nazwać klasę „kalkulator”, a nie „asdfghj”. również powinieneś rozważyć utworzenie metody dla każdego zadania, np. subtract () add () etc ... programista, który może używać twojego programu w przyszłości, dokładnie wie, co robią twoje metody. dobre nazewnictwo może zmniejszyć wysiłki związane z komentowaniem

również zasada jest SUCHA - nie powtarzaj się


1

Termin spójność był pierwotnie używany do opisania modułów kodu źródłowego jako jakościowej miary tego, jak dobrze kod źródłowy modułu był ze sobą powiązany. Idea spójności jest wykorzystywana w wielu dziedzinach. Na przykład grupa ludzi, taka jak jednostka wojskowa, może być spójna, co oznacza, że ​​ludzie w jednostce pracują razem na rzecz wspólnego celu.

Istotą spójności kodu źródłowego jest to, że kod źródłowy w module współpracuje w kierunku wspólnego, dobrze zdefiniowanego celu. Minimalna ilość kodu źródłowego potrzebna do utworzenia wyjść modułu znajduje się w module i nie więcej. Interfejs jest dobrze zdefiniowany, a wejścia przepływają przez interfejs, a wyjścia przepływają z powrotem przez interfejs. Nie ma żadnych skutków ubocznych, a nacisk kładziony jest na minimalizm.

Zaletą spójnych funkcjonalnie modułów jest to, że tworzenie i automatyzacja testów jednostkowych jest prosta. W rzeczywistości dobrą miarą spójności modułu jest to, jak łatwo jest utworzyć pełny zestaw wyczerpujących testów jednostkowych dla modułu.

Moduł może być klasą w języku zorientowanym obiektowo lub funkcją w języku funkcjonalnym lub nie zorientowanym obiektowo, takim jak C.Większa część pierwotnej pracy w tym obszarze pomiaru spójności dotyczyła głównie pracy z programami COBOL w IBM w Tak więc spójność jest zdecydowanie nie tylko koncepcją zorientowaną obiektowo.

Pierwotnym celem badań, z których wywodzi się koncepcja spójności i związana z nią koncepcja sprzężenia, było zbadanie, jakie są cechy programów, które były łatwe do zrozumienia, utrzymania i rozszerzenia. Celem było nauczenie się najlepszych praktyk programowania, skodyfikowanie tych najlepszych praktyk, a następnie nauczenie ich innych programistów.

Celem dobrych programistów jest napisanie kodu źródłowego, którego spójność jest jak najwyższa, biorąc pod uwagę środowisko i rozwiązywany problem. Oznacza to, że w dużej aplikacji niektóre części treści kodu źródłowego będą różnić się od innych części co do poziomu spójności kodu źródłowego w tym module lub klasie. Czasami najlepsze, co możesz uzyskać, to spójność czasowa lub sekwencyjna z powodu problemu, który próbujesz rozwiązać.

Najlepszym poziomem spójności jest spójność funkcjonalna. Moduł ze spójnością funkcjonalną jest podobny do funkcji matematycznej, ponieważ podajesz zestaw danych wejściowych i otrzymujesz określone wyjście. Naprawdę funkcjonalny moduł nie będzie miał żadnych skutków ubocznych oprócz wyjścia ani nie utrzyma żadnego stanu. Zamiast tego będzie miał dobrze zdefiniowany interfejs, który zawiera funkcjonalność modułu bez ujawniania jakichkolwiek elementów wewnętrznych modułu, a osoba korzystająca z modułu zapewni określony zestaw wejść i otrzyma w zamian określone wyjście. Naprawdę funkcjonalny moduł powinien być również bezpieczny dla wątków.

Wiele bibliotek języków programowania zawiera szereg przykładów modułów funkcjonalnych, zarówno klas, szablonów, jak i funkcji. Najbardziej funkcjonalnymi spójnymi przykładami byłyby funkcje matematyczne, takie jak sin, cosinus, pierwiastek kwadratowy itp.

Inne funkcje mogą powodować skutki uboczne lub utrzymywać się w pewnym stanie, co utrudnia korzystanie z tych funkcji.

Na przykład funkcja, która zgłasza wyjątek lub ustawia globalną zmienną błędu ( errnow C) lub musi być użyta w sekwencji ( strtok()funkcja jest przykładem z biblioteki Standard C, ponieważ utrzymuje stan wewnętrzny) lub która zapewnia wskaźnik, który musi wtedy być zarządzanym lub wystawia dziennik do jakiegoś narzędzia dziennika to przykłady funkcji, która nie jest już spójnością funkcjonalną.

Przeczytałem zarówno oryginalną książkę Yourdona, jak i Constantine'a, Structured Programming, w której po raz pierwszy zetknąłem się z ideą spójności w latach osiemdziesiątych i książką Meilira Page-Jonesa Practical Guide to Structured Systems Design, a Page-Jones wykonał znacznie lepszą robotę opisując zarówno sprzężenie, jak i spójność. Książka Yourdon and Constantine wydaje się nieco bardziej akademicka. Książka Steve McConnell Code Complete jest całkiem dobra i praktyczna, a poprawione wydanie zawiera sporo do powiedzenia na temat dobrych praktyk programistycznych.


Mówisz, że The minimum amount of source code needed to create the module outputs is in the module and no morenie jest to związane ze spójnością, ale z DTSTTCPW
v.oddou,

@ v.oddou, minimalna ilość kodu jest rzeczywiście związana ze spójnością. Im więcej kodu w module, który nie jest powiązany z wyjściami modułu, tym większe prawdopodobieństwo, że kod ma skutki uboczne, a tym samym niższa spójność. Każda koncepcja ma inne perspektywy, zwłaszcza koncepcje takie jak spójność, które są nieco niejednoznaczne. Pomiary dla spójności są jakościowe i wymagają pewnego rodzaju logiki rozmytej w celu przypisania określonego modułu do jednej lub drugiej kategorii za pomocą pewnego rodzaju rubryki. Podanie minimalnego kodu dla wyników nie jest wystarczającą cechą dla wysokiej spójności tylko jednej z kilku.
Richard Chambers

1

Większość odpowiedzi nie wyjaśnia, czym jest spójność, jest to dobrze zdefiniowane w czystym kodzie z książki Uncle Bobobs.

Klasy powinny mieć niewielką liczbę zmiennych instancji. Każda z metod klasy powinna manipulować co najmniej jedną z tych zmiennych. Ogólnie, im więcej zmiennych operuje metoda, tym bardziej spójna jest ta metoda ze swoją klasą. Klasa, w której każda zmienna jest używana przez każdą metodę, jest maksymalnie spójna. Generalnie tworzenie takich maksymalnie spójnych klas nie jest ani wskazane, ani możliwe; z drugiej strony chcielibyśmy, aby spójność była wysoka. Kiedy spójność jest wysoka, oznacza to, że metody i zmienne tej klasy są współzależne i łączą się jako logiczna całość.

Pozwólcie, że wyjaśnię to za pomocą definicji klasy

class FooBar {
private _bla;
private _foo;
private _bar;

function doStuff()

   if(this._bla>10){
     this._foo = 10;
     this._bar = 20;
   }

}
function doOtherStuff(){

    if(this._foo==10){
       this._bar = 100;
       this._bla = 200;
    }
}

}

Jeśli widzisz powyższy przykład, klasa jest spójna, co oznacza, że ​​zmienne są współdzielone między klasami, aby ze sobą współpracować, więcej zmiennych jest wspólnych, co oznacza, że ​​klasa jest wysoce spójna i działa jako pojedyncza jednostka.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.