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

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

 

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

 

용어 정리

응집도(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

배타적 서브타입(Exlusive Subtype) 테이블 설계와 백엔드 구현

배타적 서브타입(Exlusive Subtype) 테이블 설계와 백엔드 구현

배타적 서브타입이란? 데이터베이스 테이블 설계에서 슈퍼타입(Super Type)과 서브타입(Sub Type)은 공통 속성을 기준으로 엔티티(테이블)를 상위/하위로 나누는 데이터 모델링 기법입니다. * Super Type (상위 엔티티) * 여러 엔티티가 공통으로 가지는 속성을 모아 놓은 엔티티 * 식별자(PK, ID)를 포함한 공통 정보를 가지고 있음 * Sub Type (하위 엔티티)

By Plato Jung
A2A 메모리 레이어: AI 에이전트를 위한 공유 두뇌 구축하기

A2A 메모리 레이어: AI 에이전트를 위한 공유 두뇌 구축하기

모든 것의 시작이 된 문제 우리를 계속 괴롭히던 것이 있었습니다: 왜 AI 에이전트는 대화가 끝나는 순간 모든 것을 잊어버릴까요? 한번 생각해보세요. 챗봇에게 전화보다 이메일을 선호한다고 말합니다. 다음 세션에서는요? 마치 처음 만난 것처럼 행동합니다. 한 상담원에게 주문 문제를 설명하고, 다른 상담원에게 연결되면, 갑자기 처음부터 다시 시작해야 합니다. 우리 모두 겪어본 일입니다.

By Sardor Madaminov
[시리즈 2편] 실무로 배우는 메시지 큐 - RabbitMQ

[시리즈 2편] 실무로 배우는 메시지 큐 - RabbitMQ

들어가며 [시리즈1]에서는 프로세스 내부 메시지 큐를 다뤘습니다. 이번엔 네트워크 메시지 큐인 RabbitMQ를 다룹니다. RabbitMQ 공식 문서나 기술 블로그는 많지만, 실무에서 어떻게 사용하는지에 대한 글은 의외로 적습니다. "Producer가 뭐고 Consumer가 뭔지는 알겠는데, 그래서 실제로는 어떻게 쓰는데?" 이번 글에서는 우리 MES 시스템에서 RabbitMQ를 어떻게 활용하고 있는지 실제 코드와 함께 공유합니다. 우리

By Jeonggil
[시리즈 1편] 실무로 배우는 메시지 큐 - Windows Message Loop

[시리즈 1편] 실무로 배우는 메시지 큐 - Windows Message Loop

들어가며 이 글은 "실무로 배우는 메시지 큐" 시리즈의 첫 번째 글입니다. 실무에서 발견한 문제를 해결하는 과정에서, IME 입력 문제와 해결 과정을 공유합니다. 메시지 큐는 RabbitMQ, Kafka 같은 네트워크 레벨만 있는 게 아닙니다. 우리가 매일 쓰는 Windows 애플리케이션도 메시지 큐 기반으로 동작합니다. * 시리즈1 (이 글): 프로세스 내부의 메시지 큐 - Windows

By Jeonggil