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

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

 

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

 

용어 정리

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

[Terraform 튜토리얼 1-6] 중복 없애다 망한 썰 – DRY 원칙, 정말 항상 맞을까?

[Terraform 튜토리얼 1-6] 중복 없애다 망한 썰 – DRY 원칙, 정말 항상 맞을까?

개발자라면 한 번쯤 들어봤을 말, "Don't Repeat Yourself", 줄여서 DRY 원칙. 이건 소프트웨어 개발에서 아주 중요한 원칙이에요. 중복을 줄이면 버그도 줄고, 유지 보수도 쉬워지고, 코드도 깔끔해지죠. 그런데… Terraform 같은 IaC 세계에서도 DRY가 무조건 좋을까요? 🤔 DRY가 뭔데? DRY 원칙의 핵심은 딱 하나: "같은 걸 반복해서 쓰지 마." * 상수 값, 로직, 설정

By Chansong
[Terraform 튜토리얼 1-5] 선언형 vs 명령형: Terraform은 왜 선언형인가?

[Terraform 튜토리얼 1-5] 선언형 vs 명령형: Terraform은 왜 선언형인가?

Terraform을 쓰다 보면 종종 듣게 되는 말이 하나 있어요: Terraform은 "선언형(Declarative)" 도구다. 그런데 이게 도대체 무슨 뜻일까요? "명령형(Imperative)"이랑은 뭐가 다르고, 왜 Terraform은 선언형일까요? 🧠 선언형과 명령형, 개념부터 정리 구분 선언형 (Declarative) 명령형 (Imperative) 핵심 개념 무엇이 되어야 하는지만 선언 어떻게 할지를 하나하나 명령 예시 “난 스테이크 먹을래” “고기

By Chansong
[Terraform 튜토리얼 1-4] 모듈이 정리가 안 될 땐, 응집도(Cohesion)를 의심하라

[Terraform 튜토리얼 1-4] 모듈이 정리가 안 될 땐, 응집도(Cohesion)를 의심하라

인프라를 코드로 관리할 때, 좋은 모듈을 만드는 핵심 개념 중 하나가 바로 응집도(Cohesion)입니다. 이 단어가 좀 낯설게 느껴질 수 있지만, 사실 우리는 매일 응집도가 높은 시스템 속에서 살고 있어요. ✅ 응집도란? 하나의 모듈이 하나의 책임 또는 기능에만 집중하는 정도 응집도가 높은 모듈은 말 그대로 한 가지 일에만 집중합니다. 그래서

By Chansong
[Terraform 튜토리얼 1-3] 내부는 감추고, 필요한 것만 보여줘 – 캡슐화란?

[Terraform 튜토리얼 1-3] 내부는 감추고, 필요한 것만 보여줘 – 캡슐화란?

Encapsulation, 캡슐화라고 하면 뭔가 개발자스럽고 어려워 보이죠? 객체지향 프로그래밍 할 때나 듣던 단어 같고요. 그런데 이 개념은, Terraform 같은 Infrastructure as Code(IaC)에서도 아주 중요합니다. 이번 글에서는 "캡슐화가 무엇이고", "왜 필요한지", 그리고 "Terraform에서는 어떻게 쓰이는지"를 쉽게 풀어보겠습니다. ✅ 캡슐화, 한 마디로 뭐야? “필요한 것만 보이게 하고, 나머지는 숨기는 것”

By Chansong