Różnica między spójnością a sprzężeniem

Jaka jest różnica między spójnością a sprzężeniem?

Jak sprzężenie i spójność mogą prowadzić do dobrego lub złego projektowania oprogramowania?

Jakie są przykłady, które opisują różnicę między nimi i ich wpływ na ogólną jakość kodu?

 352
Author: iliketocode, 2010-06-21

12 answers

Spójność odnosi się do tego, co klasa (lub moduł) może zrobić. Niska spójność oznaczałaby, że Klasa wykonuje wiele różnych działań - jest szeroka, nie skupiona na tym, co powinna robić. Wysoka spójność oznacza, że Klasa koncentruje się na tym, co powinna robić, tzn. tylko na metodach odnoszących się do intencji klasy.

Przykład niskiej spójności:

-------------------
| Staff           |
-------------------
| checkEmail()    |
| sendEmail()     |
| emailValidate() |
| PrintLetter()   |
-------------------
Przykład wysokiej spójności:
----------------------------
| Staff                   |
----------------------------
| -salary                 |
| -emailAddr              |
----------------------------
| setSalary(newSalary)    |
| getSalary()             |
| setEmailAddr(newEmail)  |
| getEmailAddr()          |
----------------------------

Jeśli chodzi o sprzężenie , odnosi się do tego, jak powiązane lub zależne są dwa klasy / moduły są względem siebie. W przypadku klas o niskim sprzężeniu zmiana czegoś ważnego w jednej klasie nie powinna wpływać na drugą. Wysokie sprzężenie utrudniłoby zmianę i utrzymanie kodu; ponieważ klasy są ze sobą ściśle powiązane, dokonanie zmiany może wymagać zmiany całego systemu.

Dobry projekt oprogramowania ma wysoką spójność i niską sprzężenie .

 518
Author: mauris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-18 21:31:05

Wysoka spójność wewnątrz modułówi niska sprzężenie pomiędzy modułami są często uważane za związane z wysoką jakością w językach programowania OO.

Na przykład, kod wewnątrz każdej klasy Java musi mieć wysoką spójność wewnętrzną, ale być możliwie luźno sprzężony z kodem w innych klasach Java.

Rozdział 3 Meyer ' s Object-Oriented Software Construction (2nd edition) jest doskonałym opisem tych zagadnień.

 62
Author: CesarGon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 16:59:26

Spójność jest wskazaniem na to, jak powiązane i skoncentrowane są obowiązki elementu oprogramowania.

Coupling odnosi się do tego, jak silnie element oprogramowania jest połączony z innymi elementami.

Elementem oprogramowania może być Klasa, pakiet, komponent, podsystem lub system. Przy projektowaniu systemów zaleca się posiadanie elementów oprogramowania, które mają wysoką spójność i wsparcie niskie sprzężenie.

Niski spójność prowadzi do klas monolitycznych, które są trudne do utrzymania, zrozumienia i zmniejsza ponowną użyteczność. Podobnie wysokie sprzężenie powoduje, że klasy są ściśle sprzężone, a zmiany nie są zwykle lokalne, trudne do zmiany i zmniejszają ponowne użycie.

Możemy przyjąć hipotetyczny scenariusz, w którym projektujemy typowy monitor-able ConnectionPool z następującymi wymaganiami. Zauważ, że może to wyglądać zbyt wiele dla prostej klasy, takiej jak ConnectionPool, ale podstawowa intencja jest po prostu aby zademonstrować niskie sprzężenie i wysoką spójność za pomocą prostego przykładu i myślę, że powinno pomóc.

  1. wsparcie uzyskiwania połączenia
  2. uwolnij połączenie
  3. uzyskaj statystyki dotyczące liczby połączeń i użycia
  4. uzyskaj statystyki dotyczące połączenia vs czas
  5. przechowuj informacje o połączeniu i udostępniaj je do bazy danych w celu późniejszego raportowania.

Z małą spójnością możemy zaprojektować ConnectionPool klasę siłą wypychanie wszystkich tych funkcji/obowiązków w jedną klasę, jak poniżej. Widzimy, że ta pojedyncza klasa jest odpowiedzialna za zarządzanie połączeniami, interakcję z bazą danych, a także utrzymywanie statystyk połączeń.

Pula Połączeń O Niskiej Spójności

Z wysoką spójnością możemy przypisać tę odpowiedzialność między klasami i uczynić ją bardziej łatwą do utrzymania i wielokrotnego użytku.

Pula Połączeń O Wysokiej Spójności

Aby zademonstrować niskie sprzężenie będziemy kontynuować z diagramem high cohesion ConnectionPool powyżej. Jeśli spojrzymy na powyższy diagram, mimo że wspiera on wysoką spójność, {[0] } jest ściśle powiązana z klasą ConnectionStatistics i PersistentStore oddziałuje z nimi bezpośrednio. Zamiast tego, aby zmniejszyć sprzężenie, możemy wprowadzić interfejs ConnectionListener i pozwolić tym dwóm klasom zaimplementować interfejs i pozwolić im zarejestrować się w klasie ConnectionPool. I ConnectionPool będzie iterować przez tych słuchaczy i powiadomić ich o connection get I release zdarzeń i pozwala mniej sprzęgło.

Złącze Niskociśnieniowe

Uwaga / słowo lub Uwaga: w tym prostym scenariuszu może to wyglądać na przesadę, ale jeśli wyobrazimy sobie scenariusz w czasie rzeczywistym, w którym nasza aplikacja musi współdziałać z wieloma usługami stron trzecich, aby zakończyć transakcję: bezpośrednie połączenie naszego kodu z Usługami stron trzecich oznaczałoby, że wszelkie zmiany w usługach stron trzecich mogłyby spowodować zmiany w naszym kodzie w wielu miejscach, zamiast tego moglibyśmy mieć Facade, który oddziałuje na nas w wielu miejscach. z tych wielu usług wewnętrznie i wszelkie zmiany w usługach stają się lokalne do Facade i wymusi niskie sprzężenie z Usługami stron trzecich.

 36
Author: Madhusudana Reddy Sunnapu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-06 13:40:47

Spójność {[2] } jest wskaźnikiem zależności w obrębie modułu.

Sprzężenie {[2] } jest wskazaniem relacji pomiędzy modułami.

Tutaj wpisz opis obrazka

Spójność

  • spójność jest wskaźnikiem zależności wewnątrz modułu.
  • spójność pokazuje względną siłę funkcjonalną modułu.
  • spójność to stopień (jakość), do którego komponent / moduł skupia się na single rzecz.
  • podczas projektowania należy dążyć do wysokiej spójności tj. spójny komponent/ moduł koncentruje się na jednym zadaniu (tj., jednomyślności) z niewielką interakcją z innymi modułami system.
  • spójność jest rodzajem naturalnego rozszerzenia ukrywania danych dla przykład, klasa mająca wszystkich członków widocznych z pakietem posiadającym domyślna widoczność. Spójność jest koncepcją Wewnątrzmodułową.

Sprzęgło

  • sprzężenie jest wskazaniem relacje między modułami.
  • sprzężenie pokazuje względną niezależność między modułami.
  • sprzężenie to stopień, w jakim komponent / moduł jest połączony z innymi modułami.
  • podczas projektowania należy dążyć do niskiego sprzężenia, tzn. zależność między modułami powinna być mniejsza
  • Tworzenie prywatnych pól, prywatnych metod i klas niepublicznych zapewnia luźne powiązanie.
  • sprzężenie jest pojęciem Międzymodułowym.

Sprawdź to link

 32
Author: Buddhika Alwis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 10:46:03

Zwiększona spójność i zmniejszone sprzężenie prowadzą do dobrego projektowania oprogramowania.

Spójność dzieli funkcjonalność tak, aby była zwięzła i najbliższa danym, a oddzielenie zapewnia, że implementacja funkcjonalna jest odizolowana od reszty systemu.

oddzielenie pozwala na zmianę implementacji bez wpływu na inne części oprogramowania.

spójność zapewnia, że realizacja bardziej specyficzna dla funkcjonalność i jednocześnie łatwiejsze w utrzymaniu.

Najskuteczniejszą metodą zmniejszenia sprzężenia i zwiększenia spójności jest design by interface.

To główne obiekty funkcjonalne powinny się "znać" tylko poprzez interfejsy, które implementują. Wdrożenie interfejsu wprowadza spójność jako naturalną konsekwencję.

Chociaż w niektórych senarios nie jest realistyczny, powinien być celem projektowym.

Przykład (bardzo sketchy): {]}

public interface IStackoverFlowQuestion
      void SetAnswered(IUserProfile user);
      void VoteUp(IUserProfile user);
      void VoteDown(IUserProfile user);
}

public class NormalQuestion implements IStackoverflowQuestion {
      protected Integer vote_ = new Integer(0);
      protected IUserProfile user_ = null;
      protected IUserProfile answered_ = null;

      public void VoteUp(IUserProfile user) {
           vote_++;
           // code to ... add to user profile
      }

      public void VoteDown(IUserProfile user) {
          decrement and update profile
      }

      public SetAnswered(IUserProfile answer) {
           answered_ = answer
           // update u
      }
}

public class CommunityWikiQuestion implements IStackoverflowQuestion {
     public void VoteUp(IUserProfile user) { // do not update profile }
     public void VoteDown(IUserProfile user) { // do not update profile }
     public void SetAnswered(IUserProfile user) { // do not update profile }
}

Gdzie indziej w Twojej bazie kodowej możesz mieć moduł, który przetwarza pytania niezależnie od tego, czym są:

public class OtherModuleProcessor {
    public void Process(List<IStackoverflowQuestion> questions) {
       ... process each question.
    }
}
 31
Author: Adrian Regan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-21 14:49:14

Najlepsze wyjaśnienie pochodzi z czystego kodu wujka Boba:

klasy powinny mieć niewielką liczbę zmiennych instancji. Każda z metod klasy powinna manipulować jedną lub więcej z tych zmiennych. Ogólnie rzecz biorąc, im więcej zmiennych manipuluje metoda, tym bardziej spójna jest ta metoda do swojej klasy. Klasa, w której każda zmienna jest używana przez każdą metodę, jest maksymalnie spójna.

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

strategia utrzymywania małych funkcji i utrzymywania krótkich list parametrów może czasami prowadzić do proliferacji zmiennych instancji, które są używane przez podzbiór metod. Kiedy tak się dzieje, prawie zawsze oznacza to, że istnieje co najmniej jeden inna klasa próbuje wydostać się z większej klasy. Powinieneś spróbować rozdzielić zmienne i metody na dwie lub więcej klas, tak aby nowe klasy były bardziej spójne.

 22
Author: Cătălin Rădoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-16 13:56:15

Spójność w inżynierii oprogramowania jest stopniem, do którego należą elementy pewnego modułu. Tak więc, jest to miara tego, jak silnie powiązane są poszczególne elementy funkcjonalności wyrażone przez kod źródłowy modułu oprogramowania.

Sprzężenie w prostych słowach, jest to, ile jeden składnik (ponownie wyobraźmy sobie klasę, choć niekoniecznie) wie o wewnętrznym działaniu lub wewnętrznych elementach innej, tzn. ile ma wiedzy o drugiej komponent.

Napisałem post na blogu o tym , jeśli chcesz poczytać trochę więcej szczegółów z przykładami i rysunkami. Myślę, że odpowiada na większość twoich pytań.

 11
Author: TheBoyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 07:24:50

Spójność (Co-hesion): Co co oznacza Razem, hesion {[2] } co oznacza trzymać . Układ sklejania się cząstek różnych substancji.

Dla przykładu z prawdziwego zdarzenia:
Tutaj wpisz opis obrazka
img dzięki uprzejmości

Całość jest większa niż suma części-Arystoteles.

  • Spójnik jest porządkowym typem miary i jest zwykle opisywany jako "wysoka spójność" lub "niska spójność". Moduły o wysokiej spójności wydają się być preferowane, ponieważ wysoka spójność wiąże się z kilkoma pożądanymi cechami oprogramowania, w tym solidnością, niezawodnością, wielokrotnego użytku i zrozumiałością. Natomiast niska spójność wiąże się z niepożądanymi cechami, takimi jak trudności w utrzymaniu, testowaniu, ponownym użyciu, a nawet zrozumieniu. wiki

  • Sprzężenie jest zwykle kontrastowane z spójnością. Niskie sprzęgło często koreluje z wysoką spójnością i vice versa. Niskie sprzężenie jest często 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. wiki

 2
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 02:31:54

Myślę, że różnice można ująć następująco:

  • spójność reprezentuje stopień, w jakim część bazy kodu tworzy logicznie pojedynczą jednostkę atomową.
  • sprzężenie reprezentuje stopień, w jakim pojedyncza jednostka jest niezależna od innych.
  • nie da się archiwizować pełnego rozdzielenia bez niszczenia spójności i vice versa.

W tym wpisie na blogu piszę o tym bardziej szczegółowo.

 1
Author: Vladimir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 18:24:14

Spójność jest wskaźnikiem względnej siły funkcjonalnej modułu.

  • spójny moduł wykonuje jedno zadanie, wymagające niewiele interakcja z innymi komponentami w innych częściach programu. Stwierdził po prostu spójny moduł powinien (najlepiej) zrobić tylko jedną rzecz.
  • Widok konwencjonalny:

    "jednomyślność" modułu

  • Widok oo:

    Spójność klasy zakłada, że komponent lub klasa zawiera tylko atrybuty i operacje, które są ściśle ze sobą powiązane i z samą klasą lub komponentem

  • Poziomy spójności

    Warstwa

    Komunikacyjny

    Sekwencyjny

    Temporal

    Utility

Sprzężenie jest wskaźnikiem względnej współzależności między modułami.

  • Sprzężenie zależy od złożoności interfejsu między modułami, punkt, w którym wpis lub odniesienie do modułu, a jakie dane przejdź przez interfejs.

  • Widok Konwencjonalny : Stopień, w jakim składnik jest połączony z innymi składnikami i ze światem zewnętrznym

  • Widok OO: miara jakościowa stopnia, w jakim klasy są ze sobą połączone

  • Poziom sprzężenia

    Zawartość

    Common

    Kontrola

    Znaczek

    Dane o nim

    Rutyna call

    Użycie typu

    Włączenie lub import

    Zewnętrzny #

 1
Author: zee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 02:35:13

Coupling = interakcja / relacja między dwoma modułami... spójność = interakcja między dwoma elementami w module.

Oprogramowanie składa się z wielu modułów. Moduł składa się z elementów. Moduł jest programem. Funkcja w programie jest elementem.

W czasie wykonywania, wyjście programu jest używane jako Wejście dla innego programu. Nazywa się to interakcją z modułem lub komunikacją z procesem do procesu. Jest to również nazywane jako Sprzęgło.

W ramach jednego programu wyjście funkcji jest przekazywane do innej funkcji. Nazywa się to interakcją elementów w module. Jest to również nazywane spójnością.

Przykład:

Sprzężenie = komunikacja pomiędzy 2 różnymi rodzinami... spójność = komunikacja między ojcem-matką-dzieckiem w rodzinie.

 1
Author: Dipankar Nalui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-04 03:19:08

Po prostu spójność oznacza, że klasa powinna reprezentować jedną koncepcję.

Publiczny interfejs klasy jest spójny, jeśli wszystkie cechy klasy są związane z pojęciem, które reprezentuje Klasa. Na przykład-zamiast posiadać klasę CashRegister posiadającą cechy CashRegister i coin spójność dzieli ją na 2 klasy-CashRegister i coin class

W połączeniu jedna klasa zależy od drugiej, ponieważ używa obiektów klasy.

Problem z wysokim sprzężenie polega na tym, że może wywoływać skutki uboczne. Jedna zmiana w jednej klasie może spowodować nieoczekiwany błąd w drugiej klasie i może złamać cały kod.

Ogólnie wysoka spójność i niskie sprzężenie jest uważane za wysoką jakość OOP

 0
Author: Varun Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 18:06:25