기준에 의한 리팩토링 - 응집도가 높은지를 판단하는 척도

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

 

오브젝트 | 조영호 - 모바일교보문고

 

용어 정리

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

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

 

 

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

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

 


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


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

 

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

 예제 코드를 첨부 합니다.

 

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

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

 

// 낮은 응집도의 예시
class MixedResponsibilitiesClass {
    void processPayment() {
        // payment processing logic
    }
    
    void generateReport() {
        // report generation logic
    }
}
// 높은 응집도의 예시
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를 업데이트하는 로직
    }
}

Read more

ISACA 2024 학술대회 발표자료

ISACA 2024 학술대회 발표자료

ISACA_2024_공동_학술대회_발표자료ISACA_2024_공동_학술대회_발표자료.pdf125 MBdownload-circle[2024. 11. 20.] 연세대, 2024 바른ICT연구소 리서치 콘퍼런스 성료 | 연세대학교연세대학교 * 키워드 * 데이터 * 신뢰 * 윤리 * 보안 * 2024 노벨상 * 물리학상, 제프리 힌튼 (인공지능, 컴퓨터 과학자) * 화학상, 데미스 허사비스 (구글 딥마인드) * 라인 경영권 이슈 * 데이터 주권 확보에 대한 노력 (경영권 분쟁이 아님.

By Hyonsok
3회 Digital ESG Conference 세미나 자료, 누빅스, 2024/10/24

3회 Digital ESG Conference 세미나 자료, 누빅스, 2024/10/24

DEA 컨퍼런스 행사 프로그램 순서DEA 컨퍼런스 행사 프로그램 순서.pdf503 KBdownload-circle[공유용] DEA 컨퍼런스 오프닝 및 DEA 업데이트_강명구[공유용] DEA 컨퍼런스 오프닝 및 DEA 업데이트_강명구.pdf3 MBdownload-circle[공유용] 콜린스_케이에너지세이브 발표자료[공유용] 콜린스_케이에너지세이브 발표자료.pdf3 MBdownload-circle[공유용]Digital ESG Alliance Conference_김정연[공유용]Digital ESG Alliance Conference_

By Hyonsok

Datadog Live Seoul 2024 (발표자료)

3개월 차 DevOps팀의 Datadog 활용 - 이병호 박상욱 김경보 김태수, 뉴넥스 & 이성욱, Datadog3개월 차 DevOps팀의 Datadog 활용 - 이병호 박상욱 김경보 김태수, 뉴넥스 & 이성욱, Datadog.pdf2 MBdownload-circle12년차 스타트업의 아키텍처 리팩토링 돌아보기 - 이정민, 드라마앤컴퍼니12년차 스타트업의 아키텍처 리팩토링 돌아보기 - 이정민, 드라마앤컴퍼니.pdf3 MBdownload-circleAsset-HighlightsDatadogLiveSeoul2024Asset-HighlightsDatadogLiveSeoul2024.pdf3 MBdownload-cir

By Hyonsok