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 ( errno
w 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.