Der Begriff Kohäsion wurde ursprünglich verwendet, um Module des Quellcodes als qualitatives Maß dafür zu beschreiben, wie gut der Quellcode des Moduls miteinander in Beziehung stand. Die Idee des Zusammenhalts wird in einer Vielzahl von Bereichen verwendet. Zum Beispiel kann eine Gruppe von Menschen wie eine Militäreinheit zusammenhalten, was bedeutet, dass die Menschen in der Einheit zusammenarbeiten, um ein gemeinsames Ziel zu erreichen.
Das Wesentliche am Zusammenhalt des Quellcodes ist, dass der Quellcode in einem Modul auf ein gemeinsames, genau definiertes Ziel hinarbeitet. Die Mindestmenge an Quellcode, die zum Erstellen der Modulausgänge benötigt wird, befindet sich im Modul und nicht mehr. Die Schnittstelle ist gut definiert und die Eingänge fließen über die Schnittstelle ein und die Ausgänge fließen über die Schnittstelle zurück. Es gibt keine Nebenwirkungen und der Schwerpunkt liegt auf Minimalismus.
Ein Vorteil von funktional zusammenhängenden Modulen besteht darin, dass die Entwicklung und Automatisierung von Komponententests unkompliziert ist. Tatsächlich ist ein gutes Maß für die Kohäsion eines Moduls, wie einfach es ist, einen vollständigen Satz umfassender Komponententests für das Modul zu erstellen.
Ein Modul kann eine Klasse in einer objektorientierten Sprache oder eine Funktion in einer funktionalen Sprache oder einer nicht objektorientierten Sprache wie C sein. Ein Großteil der ursprünglichen Arbeit in diesem Bereich der Messung des Zusammenhalts betraf hauptsächlich die Arbeit mit COBOL-Programmen bei IBM in den USA Der Zusammenhalt der 1970er Jahre ist also definitiv nicht nur ein objektorientiertes Konzept.
Die ursprüngliche Absicht der Forschung, aus der das Konzept des Zusammenhalts und das damit verbundene Konzept der Kopplung hervorgingen, war die Untersuchung, wo die Merkmale von Programmen liegen, die leicht zu verstehen, aufrechtzuerhalten und zu erweitern sind. Ziel war es, Best Practices für die Programmierung zu erlernen, diese Best Practices zu kodifizieren und diese dann anderen Programmierern beizubringen.
Das Ziel guter Programmierer ist es, Quellcode zu schreiben, dessen Kohäsion angesichts der Umgebung und des zu lösenden Problems so hoch wie möglich ist. Dies impliziert, dass in einer großen Anwendung einige Teile des Quellcode-Körpers von anderen Teilen hinsichtlich des Kohäsionsgrades des Quellcodes in diesem Modul oder dieser Klasse abweichen. Manchmal ist das Beste, was Sie erreichen können, der zeitliche oder sequentielle Zusammenhalt aufgrund des Problems, das Sie lösen möchten.
Das beste Maß an Kohäsion ist der funktionale Zusammenhalt. Ein Modul mit funktionaler Kohäsion ähnelt einer mathematischen Funktion, indem Sie eine Reihe von Eingaben bereitstellen und eine bestimmte Ausgabe erhalten. Ein wirklich funktionsfähiges Modul hat neben der Ausgabe weder Nebenwirkungen noch behält es irgendeinen Zustand bei. Es wird stattdessen eine gut definierte Schnittstelle haben, die die Funktionalität des Moduls kapselt, ohne die Interna des Moduls freizulegen, und die Person, die das Modul verwendet, stellt einen bestimmten Satz von Eingaben bereit und erhält dafür eine bestimmte Ausgabe. Ein wirklich funktionierendes Modul sollte auch threadsicher sein.
Viele Programmiersprachenbibliotheken enthalten eine Reihe von Beispielen für Funktionsmodule, ob Klassen, Vorlagen oder Funktionen. Die funktionalsten zusammenhängenden Beispiele wären mathematische Funktionen wie Sünde, Kosinus, Quadratwurzel usw.
Andere Funktionen können Nebenwirkungen haben oder einen Zustand aufrechterhalten, was dazu führt, dass die Verwendung dieser Funktionen komplizierter wird.
Zum Beispiel eine Funktion, die eine Ausnahme auslöst oder eine globale Fehlervariable setzt ( errno
in C) oder in einer Sequenz verwendet werden muss ( strtok()
Funktion ist ein Beispiel aus der Standard C-Bibliothek, da sie einen internen Zustand beibehält) oder die einen Zeiger bereitstellt, der dann muss verwaltet werden oder ein Protokoll an ein Protokolldienstprogramm ausgeben, sind Beispiele für eine Funktion, die keinen funktionalen Zusammenhalt mehr aufweist.
Ich habe sowohl das Originalbuch von Yourdon als auch Constantine, Structured Programming, gelesen, in dem ich in den 1980er Jahren zum ersten Mal auf die Idee des Zusammenhalts gestoßen bin, und Meilir Page-Jones 'Buch Practical Guide to Structured Systems Design, und Page-Jones hat es viel besser beschrieben sowohl Kopplung als auch Zusammenhalt. Das Buch von Yourdon und Constantine wirkt etwas akademischer. Steve McConnells Buch Code Complete ist ziemlich gut und praktisch, und die überarbeitete Ausgabe hat einiges über gute Programmierpraxis zu sagen.