티스토리 뷰

 

오브젝트<조영호> 책의 내용에 근거해 코드를 리팩토링 하고 있습니다. 책에 있는 내용을 잘 정리 해놓은 블로그가 있어서 참고하고 있는데 포스팅 저자님께서 '응집도가 높고 낮음'을 판단하는 부분에 대해 코드를 다음번에 올려주신다고 하여 제가 직접 찾아보고 이 포스팅을 작성 합니다.

 

 

용어 정리

응집도(Cohesion) - 모듈 또는 클래스의 내부 요소들이 얼마나 밀접하게 관련되어 있는지를 나타내는 개념입니다. 높은 응집도는 밀접한 관련성을 나타내며, 낮은 응집도는 모듈이나 클래스의 내부 요소들 간의 관련성이 낮음을 나타냅니다.
 

결합도(Coupling) - 모듈 또는 클래스 간의 상호 의존성을 나타내는 개념입니다. 높은 결합도는 모듈이나 클래스 간에 강력한 의존성을 나타내며, 낮은 결합도는 모듈이나 클래스 간에 약한 의존성을 나타냅니다.

 

 

응집도는 높을 수록 좋고 결합도는 낮을 수록 좋습니다.

 

응집도의 높고 낮음을 판단하는 조건

다음 내용은 아래 블로그에서 발췌한 내용입니다.

 


응집도 관련한 기준들이 몇가지 있습니다. 응집도가 낮을수록 유연하지 않은 설계입니다.
응집도가 높고 낮음을 판단하기 위한 척도가 필요하겠죠?


1.클래스가 하나 이상의 이유로 변경되야 한다면 응집도가 낮다
2.클래스의 인스턴스들을 초기화하는 시점에 경우에 따라 서로 다른 속성을 초기화 하면 클래스를 분리해야 한다
3.메서드들이 인스턴스 변수를 사용하는 정도가 높다면 응집도가 낮은 것이다

 

https://huisam.tistory.com/entry/Object

 

오브젝트(조영호) 책 후기 - 객체지향설계의 끝은 어디인가

본 게시글은 오브젝트를 읽고 블로그 포스팅자가 정리한 글임을 밝힙니다 객체 지향 프로그래밍(OOP) 객체라는게 뭘까요? 우리가 현실 세계에서 많은 문제들을 토대로 프로그래밍하곤 합니다 예

huisam.tistory.com

 

 

예제 코드를 첨부 합니다.

 

1. 클래스가 하나 이상의 이유로 변경되야 한다면 응집도가 낮다

낮은 응집도의 예시: 하나의 클래스가 여러 가지 역할을 수행하며 변경되어야 하는 경우
높은 응집도의 예시: 하나의 클래스가 특정 기능이나 책임을 담당하고 있어서 해당 기능이 변경될 때만 클래스가 변경되는 경우

 

낮은 응집도 - 안좋음

클래스가 Payment처리와 Report생성 두가지 기능을 수행하고 있습니다. Payment쪽이 변경될 때 클래스의 변경이 일어납니다.

// 낮은 응집도의 예시
class MixedResponsibilitiesClass {
    void processPayment() {
        // payment processing logic
    }
    
    void generateReport() {
        // report generation logic
    }
}

 

 

높은 응집도 - 좋음

클래스 각각이 한가지 기능을 수정하고 있습니다. Payment쪽이 변경되면 PaymentProcessor클래스만 변경 됩니다.

// 높은 응집도의 예시
class PaymentProcessor {
    void processPayment() {
        // payment processing logic
    }
}

class ReportGenerator {
    void generateReport() {
        // report generation logic
    }
}

 

 

2. 클래스의 인스턴스들을 초기화하는 시점에 경우에 따라 서로 다른 속성을 초기화하면 클래스를 분리해야 한다.

초기화 로직이 서로 다른 속성을 다뤄야 하는 경우 클래스를 분리하는 것이 바람직합니다.

// 초기화 로직이 서로 다른 속성을 다루는 클래스
class MixedInitializationClass {
    private String name;
    private int age;
    
    MixedInitializationClass(String name) {
        this.name = name;
        // name에 따라 다른 초기화 로직 수행
        if (name.equals("John")) {
            // John에 대한 초기화
        } else {
            // 다른 경우에 대한 초기화
        }
    }
}

 

// 초기화 로직이 서로 다른 속성을 다루는 클래스를 분리
class Person {
    private String name;
    private int age;
    
    Person(String name) {
        this.name = name;
        // 초기화 로직 수행
    }
}

class JohnInitializer {
    void initialize(Person person) {
        // John에 대한 초기화 로직
    }
}

class OtherPersonInitializer {
    void initialize(Person person) {
        // 다른 경우에 대한 초기화 로직
    }
}

 

3. 메서드들이 인스턴스 변수를 사용하는 정도가 높다면 응집도가 낮은 것이다.

클래스의 메서드가 클래스의 인스턴스 변수를 자주 사용한다면, 클래스는 여러 책임을 수행하는 것으로 간주할 수 있습니다.

 

// 메서드가 인스턴스 변수를 자주 사용하는 클래스
class HighCouplingClass {
    private int value;

    HighCouplingClass(int value) {
        this.value = value;
    }

    void process() {
        // value를 사용하는 로직
    }

    void update() {
        // value를 업데이트하는 로직
    }
}

 

인스턴스 변수였던 value를 파라메터로 변경하여 리팩터링

// 메서드가 인스턴스 변수를 사용하지 않고 외부에서 주입받아 사용하는 클래스
class LowCouplingClass {
    void process(int value) {
        // 주어진 value를 사용하는 로직
    }

    void update(int value) {
        // 주어진 value를 업데이트하는 로직
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함