저는 컴퓨터 프로그래밍을 배우고 있으며 여러 곳에서 응집의 개념을 우연히 발견했으며 소프트웨어가 “고 응집력”을 갖는 것이 바람직하다는 것을 이해합니다. 그러나 그것은 무엇을 의미합니까? 저는 색인에 포함되지 않고 응집력을 언급하는 책 C ++ 입문서에서 C ++를 배우는 Java, C 및 Python 프로그래머입니다.이 주제에 대한 링크를 알려 주시겠습니까? 컴퓨터 과학 응집력에 관한 위키피디아 페이지는 정보를 얻지 못했습니다. 단지 질적 측정이라고 말하고 실제 코드 예제를 제공하지 않기 때문입니다.
답변
높은 응집력은 잘 정의 된 작업을 수행하는 클래스가있는 경우입니다. 낮은 응집력은 수업이 공통점이 많지 않은 많은 일을 할 때입니다.
이 예를 보겠습니다.
두 개의 숫자를 더하는 클래스가 있지만 동일한 클래스가 결과를 표시하는 창을 만듭니다. 이것은 창과 추가 작업이 공통점이 많지 않기 때문에 응집력이 낮은 클래스입니다. 창은 프로그램의 시각적 부분이고 추가 기능은 그 뒤에있는 논리입니다.
응집력이 높은 솔루션을 만들려면 Window 클래스와 Sum 클래스를 만들어야합니다. 창은 Sum의 메서드를 호출하여 결과를 가져와 표시합니다. 이렇게하면 애플리케이션의 로직과 GUI를 별도로 개발할 수 있습니다.
답변
Steve McConnell의 Code Complete 에서 설명 :
응집력은 클래스의 모든 루틴 또는 루틴의 모든 코드 가 중심 목적 을 얼마나 밀접하게 지원 하는지를 나타냅니다 . 밀접하게 관련된 기능 을 포함 하는 클래스는
강력한 응집력을 갖는 것으로 설명되며 휴리스틱 목표는 응집력을 가능한 한 강력하게 만드는 것입니다. 응집력은 복잡성을 관리하는 데 유용한 도구입니다. 클래스에 더 많은 코드가 중심 목적을 지원할수록 두뇌가 코드가 수행하는 모든 것을 더 쉽게 기억할 수 있기 때문입니다.
Uncle Bob의 Clean Code 에서이를 달성하는 방법 :
클래스에는 적은 수의 인스턴스 변수 가 있어야 합니다 . 클래스의 각 메서드는 이러한 변수 중 하나 이상을 조작해야합니다. 일반적으로 메서드가 더 많은 변수를 조작할수록 해당 메서드는 클래스에 대해 더 응집력이 있습니다. 각 메서드에서 각 변수를 사용하는 클래스는 최대한 응집력이 있습니다.
일반적으로 이러한 최대로 응집력있는 클래스를 만드는 것은 바람직하지도 가능하지도 않습니다. 반면에 우리는 응집력이 높기를 바랍니다. 응집력이 높으면 클래스의 메서드와 변수가 서로 의존적이며 논리적 전체로 함께 묶여 있음을 의미합니다.
응집의 개념은 결합의 개념과 밀접한 관련이 있습니다. 또한 Single Responsibility Principle (SOLID의 S)이라는 높은 응집성의 휴리스틱을 기반으로하는 원칙이 있습니다.
답변
높은 응집력은 소프트웨어 엔지니어링 개념입니다. 기본적으로 클래스는해야 할 일만해야하며 완전히 수행해야한다고 말합니다. 하지 말아야 할 함수로 오버로드하지 마십시오. 직접적으로 관련된 것은 다른 클래스의 코드에도 나타나지 않아야합니다.
규모도 고려해야하므로 예제는 매우 주관적입니다. 간단한 프로그램은 너무 모듈화되어서는 안됩니다. 그렇지 않으면 조각화 될 것입니다. 복잡한 프로그램은 복잡성을 처리하기 위해 더 많은 수준의 추상화가 필요할 수 있습니다.
예 : 이메일 클래스. 여기에는 참조, 숨은 참조, 제목, 본문에 대한 데이터 멤버가 포함되어야하며 saveAsDraft (), send (), 폐기 Draft () 메소드를 포함 할 수 있습니다. 하지만 여기에는 많은 이메일 프로토콜이 있기 때문에 login ()이 없어야하며 별도로 구현해야합니다.
답변
응집력은 일반적으로 LCOM (응집력 부족) 메트릭 중 하나를 사용하여 측정되며 원래 LCOM 메트릭은 Chidamber 및 Kemerer에서 제공됩니다. 예 :
http://www.computing.dcu.ie/~renaat/ca421/LCOM.html
보다 구체적인 예 : 예를 들어 클래스에 하나의 개인 필드와 세 개의 메소드가있는 경우; 세 가지 방법 모두이 필드를 사용하여 작업을 수행하면 클래스가 매우 응집력이 있습니다.
응집력있는 클래스의 의사 코드 :
class FooBar {
private SomeObject _bla = new SomeObject();
public void FirstMethod() {
_bla.FirstCall();
}
public void SecondMethod() {
_bla.SecondCall();
}
public void ThirdMethod() {
_bla.ThirdCall();
}
}
예를 들어 클래스에 3 개의 개인 필드와 3 개의 메소드가있는 경우; 세 가지 방법 모두 세 필드 중 하나만 사용하면 클래스의 응집력이 떨어집니다.
응집력이 낮은 클래스의 의사 코드 :
class FooBar {
private SomeObject _bla = new SomeObject();
private SomeObject _foo = new SomeObject();
private SomeObject _bar = new SomeObject();
public void FirstMethod() {
_bla.Call();
}
public void SecondMethod() {
_foo.Call();
}
public void ThirdMethod() {
_bar.Call();
}
}
한 가지 원칙을 수행하는 클래스 는 Robert C. Martin이 제공 하는 단일 책임 원칙 이며 SOLID 원칙 중 하나입니다 . 원칙은 클래스가 변경할 이유가 하나만 있어야한다고 규정합니다.
Single Responsibility Principle에 가깝게 유지하면 더 일관된 코드를 만들 수 있지만 제 생각에는 두 가지가 다릅니다.
답변
이것은 낮은 응집성의 예입니다.
class Calculator
{
public static void main(String args[])
{
//calculating sum here
result = a + b;
//calculating difference here
result = a - b;
//same for multiplication and division
}
}
그러나 높은 응집력은 클래스의 함수가해야하는 일을 수행한다는 것을 의미합니다 (이름이 지정된 것처럼). 그리고 다른 기능의 일을하는 기능이 아닙니다. 따라서 다음은 높은 응집성의 예가 될 수 있습니다.
class Calculator
{
public static void main(String args[])
{
Calculator myObj = new Calculator();
System.out.println(myObj.SumOfTwoNumbers(5,7));
}
public int SumOfTwoNumbers(int a, int b)
{
return (a+b);
}
//similarly for other operations
}
답변
응집의 원리를 생각하는 일반적인 방법은 코드에 의존하거나 의존하는 다른 코드와 함께 코드를 찾아야한다는 것입니다. 응집력은 수업 수준 이상의 구성 수준에 적용될 수 있으며 적용되어야합니다. 예를 들어, 패키지 나 네임 스페이스는 어떤 공통 테마와 관련이 있고 다른 패키지 / 네임 스페이스에 의존하는 것보다 상호 의존성이 더 높은 클래스를 이상적으로 포함해야합니다. 즉, 종속성을 로컬로 유지합니다.
답변
응집력이란 클래스 나 메서드가 정의 된 작업을 하나만 수행함을 의미합니다. 메서드 또는 클래스의 이름도 자명해야합니다. 예를 들어 계산기를 작성하는 경우 클래스 이름은 “asdfghj”가 아니라 “calculator”로 지정해야합니다. 또한 각 작업에 대한 메서드를 만드는 것을 고려해야합니다. 예를 들어 subtract () add () 등 … 나중에 프로그램을 사용할 프로그래머는 메서드가 수행하는 작업을 정확히 알고 있습니다. 좋은 이름 지정은 댓글 작성 노력을 줄일 수 있습니다.
또한 원칙은 DRY입니다-반복하지 마십시오
