응집력이라는 용어는 원래 모듈의 소스 코드가 서로 얼마나 잘 관련되어 있는지에 대한 질적 척도로서 소스 코드의 모듈을 설명하는 데 사용되었습니다. 응집력의 개념은 다양한 분야에서 사용됩니다. 예를 들어, 군대와 같은 사람들의 그룹은 응집력이있을 수 있습니다. 즉, 부대의 사람들이 공동의 목표를 향해 함께 일합니다.
소스 코드 응집의 본질은 모듈의 소스 코드가 공통되고 잘 정의 된 목표를 향해 함께 작동한다는 것입니다. 모듈 출력을 생성하는 데 필요한 최소한의 소스 코드는 모듈에 있으며 더 이상 필요하지 않습니다. 인터페이스는 잘 정의되어 있고 입력은 인터페이스를 통해 흐르고 출력은 인터페이스를 통해 다시 흐릅니다. 부작용이 없으며 미니멀리즘에 중점을 둡니다.
기능적으로 응집 된 모듈의 장점은 단위 테스트를 개발하고 자동화하는 것이 간단하다는 것입니다. 사실 모듈의 응집력에 대한 좋은 척도는 모듈에 대한 전체 단위 테스트 세트를 만드는 것이 얼마나 쉬운 지입니다.
모듈은 객체 지향 언어의 클래스이거나 기능적 언어 또는 C와 같은 비 객체 지향 언어의 함수일 수 있습니다. 응집력 측정의이 영역에서 원래 작업의 대부분은 IBM의 COBOL 프로그램과 관련된 작업이었습니다. 1970 년대의 응집력은 객체 지향 개념이 아닙니다.
응집의 개념과 결합의 관련 개념이 나온 연구의 원래 의도는 이해, 유지, 확장하기 쉬운 프로그램의 특성이 무엇인지에 대한 연구였습니다. 목표는 프로그래밍의 모범 사례를 배우고 이러한 모범 사례를 코드화 한 다음 다른 프로그래머에게 사례를 가르치는 것이 었습니다.
좋은 프로그래머의 목표는 환경과 해결되는 문제를 고려할 때 가능한 한 응집력이 높은 소스 코드를 작성하는 것입니다. 이는 대규모 응용 프로그램에서 소스 코드 본문의 일부 부분이 해당 모듈 또는 클래스에있는 소스 코드의 결합 수준에 따라 다른 부분과 다를 수 있음을 의미합니다. 당신이 얻을 수있는 최선의 경우는 당신이 해결하려는 문제로 인한 일시적 또는 순차적 응집력입니다.
최고의 응집력은 기능적 응집력입니다. 기능적 응집력이있는 모듈은 일련의 입력을 제공하고 특정 출력을 얻는다는 점에서 수학적 함수와 유사합니다. 진정으로 작동하는 모듈은 출력 외에 부작용이 없으며 어떤 종류의 상태도 유지하지 않습니다. 대신 모듈의 내부를 노출하지 않고 모듈의 기능을 캡슐화하는 잘 정의 된 인터페이스를 갖게되며 모듈을 사용하는 사람은 특정 입력 세트를 제공하고 그 대가로 특정 출력을 얻습니다. 실제로 기능하는 모듈도 스레드로부터 안전해야합니다.
많은 프로그래밍 언어 라이브러리에는 클래스, 템플릿 또는 함수와 같은 기능 모듈의 여러 예제가 포함되어 있습니다. 가장 기능적으로 응집 된 예는 sin, cosine, square root 등과 같은 수학 함수입니다.
다른 함수는 부작용이 있거나 어떤 종류의 상태를 유지하여 이러한 함수의 사용을 더 복잡하게 만들 수 있습니다.
예를 들어 예외를 던지거나 전역 오류 변수를 설정하거나 ( errno
C에서) 시퀀스에서 사용해야하는 strtok()
함수 ( 함수는 내부 상태를 유지하는 표준 C 라이브러리의 예) 또는 다음을 수행해야하는 포인터를 제공하는 함수 관리되거나 일부 로그 유틸리티에 로그를 발행하는 것은 더 이상 기능적 결합이 아닌 기능의 모든 예입니다.
Yourdon과 Constantine의 원본 책 Structured Programming을 모두 읽었습니다. 1980 년대에 응집력에 대한 아이디어를 처음 발견했고 Meilir Page-Jones의 책 Practical Guide to Structured Systems Design을 발견했으며 Page-Jones는 훨씬 더 잘 설명했습니다. 결합과 응집력 모두. Yourdon and Constantine 책은 좀 더 학문적으로 보입니다. Steve McConnell의 저서 Code Complete는 매우 훌륭하고 실용적이며 개정판에는 좋은 프로그래밍 관행에 대해 많은 의견이 있습니다.