Was ist logischer Zusammenhalt und warum ist er schlecht oder unerwünscht?

10

Von der c2wiki-Seite zu Kopplung und Zusammenhalt :

Kohäsions- (Interdependenz innerhalb des Moduls) Stärke- / Levelnamen: (von schlechter zu besser, hohe Kohäsion ist gut)

  • Zufälliger Zusammenhalt: (schlechteste) Modulelemente haben keine Beziehung zueinander
  • Logischer Zusammenhalt: Elemente führen ähnliche Aktivitäten aus, wie sie vom externen Modul ausgewählt wurden, dh durch ein Flag, das die auszuführende Operation auswählt (siehe auch CommandObject). Das heißt, der Funktionskörper ist ein riesiges If-else / Einschalt-Betriebsflag
  • Zeitlicher Zusammenhalt: Operationen, die nur durch die allgemeine durchgeführte Zeit zusammenhängen (dh Initialisierung () oder FatalErrorShutdown? ())
  • Prozedurale Kohäsion: Elemente, die an unterschiedlichen, aber sequentiellen Aktivitäten beteiligt sind, jeweils mit unterschiedlichen Daten (können normalerweise entlang linearer Sequenzgrenzen trivial in mehrere Module aufgeteilt werden)
  • Kommunikationszusammenhalt: Operationen ohne Bezug, außer dass dieselben Daten oder Eingaben erforderlich sind
  • Sequentielle Kohäsion: Operationen mit denselben Daten in signifikanter Reihenfolge; Die Ausgabe von einer Funktion erfolgt zur nächsten (Pipeline)
  • Informationszusammenhalt: Ein Modul führt eine Reihe von Aktionen mit jeweils einem eigenen Einstiegspunkt und unabhängigem Code für jede Aktion aus, die alle in derselben Datenstruktur ausgeführt werden. Im Wesentlichen eine Implementierung eines abstrakten Datentyps. dh definieren Sie die Struktur von sales_region_table und seinen Operatoren: init_table (), update_table (), print_table ()
  • Funktionale Kohäsion: Alle Elemente tragen zu einer einzigen, genau definierten Aufgabe bei, dh einer Funktion, die genau eine Operation ausführt. Get_engine_temperature (), add_sales_tax ()

(Hervorhebung von mir).

Ich verstehe die Definition des logischen Zusammenhalts nicht vollständig. Meine Fragen sind:

  • Was ist logischer Zusammenhalt?
  • Warum bekommt es so einen schlechten Ruf (zweitschlechteste Art von Zusammenhalt)?

quelle

Antworten:

7

Der logische Zusammenhalt kann schlecht sein, da Sie die Funktionalität eher nach technischen als nach funktionalen Merkmalen gruppieren. Stellen Sie sich beispielsweise eine Anwendung vor, die aus mehreren Modulen besteht. Jedes Modul repräsentiert eine Geschäftsdomäne und verfügt über den entsprechenden Datenzugriffscode. Wenn Sie den gesamten Datenzugriffscode über alle Module hinweg gruppieren, besteht ein logischer Zusammenhalt. Schließlich handelt es sich nur um Datenzugriff, und in einigen Fällen ist es vorteilhaft, die Datenzugriffsmuster einer Anwendung bewerten zu können. Dies ist jedoch problematisch, da die Geschäftsdomäne die Modulgrenzen und nicht die technische Domäne bereitstellt. Wenn Sie einen logischen Zusammenhalt erreichen, verlieren Sie am Ende den funktionalen Zusammenhalt. In der Regel definiert die Geschäftsdomäne eine genau definierte Bereitstellungseinheit, und technische Aspekte unterstützen die Geschäftsdomäne.

eulerfx
quelle
Das ist eine gute Antwort, obwohl ich zur Vermeidung von Verwirrung erwähnen möchte, dass ein Modul im Kontext der objektorientierten Programmierung (und der Beispiele auf Wikipedia und c2wiki) im Wesentlichen eine Klasse ist. Dies bedeutet, dass der Kommentar zum "riesigen if / else" auch sinnvoller ist.
Daniel B
2

Nach der Beschreibung würde ich sagen, dass es darum geht, Code miteinander zu koppeln, der eine gewisse Kohäsion aufweist, aber die Objektorientierung bricht.

Beispiel: Berechnung der Fläche eines Polygons. Wenn Sie die Berechnung für das Quadrat zusammen mit der Berechnung für das Dreieck setzen und nur anhand des Eingabeparameters auswählen, haben Sie zwei Dinge logisch nach ihrem Ergebnis gruppiert, ohne ihre tatsächliche Natur zu berücksichtigen.

Andy
quelle
0

Meine persönliche Meinung ist, dass der logicalBegriff schlecht gewählt wurde und zu Verwirrung führt. Wir neigen dazu, das logicalgut zu finden. In vielen Szenarien functionalkann mit ausgetauscht werden logical.

Ich würde ersetzen logicalmit technical Begriff , weil Sie Ihren Fokus auf technischen Teil und nicht auf (und ich Wort verwenden möchten logicalhier aber es wird im Rahmen dieser Diskussion irreführend sein) , was diese Komponente für das ganze System der Fall ist.

Ein typisches Beispiel kann die Gruppierung von Klassen sein, die Endpunkte für einige APIs bereitstellen.
Wenn Sie sie in einem Ordner gruppieren, weil sie Endpunkte bereitstellen, ist dies ein technical cohesion. Wenn Sie sie gruppieren, weil sie einige Funktionen bieten (z. B. die Liste der Verwaltungsbenutzer), ist dies einefunctional cohesion


Darüber hinaus würde ich hier auch den functionalBegriff herausfordern , weil er zu weit gefasst ist. Es kann sowohl die Funktion als Syntaxkonstruktion als auch die Funktionalität einer Sache bezeichnen. Im obigen Beispiel verfügt eine Endpunktklasse über zwei Funktionen: Endpunkt und Geschäftslogik.

Ich würde ersetzen functionalzu logical. Es bezieht business logicsich auf ein logical view4 + 1-Software-Ansichtsmodell, und im Allgemeinen neigen wir dazu, Dinge als "logisch" zu bezeichnen, wenn sie richtig sind.

sf
quelle