본문 바로가기

프로그래밍&IT/학습, 책

[클린 코드] 6. 창발성

 

Ch12. 창발성

켄트 벡이 제시한 단순한 설계규칙 4가지

1  모든 테스트를 실행한다.

2. 중복을 없앤다.

3. 프로그래머 의도를 표현한다.

4. 클래스와 메서드 수를 최소로 줄인다.

 

  • 결합도가 높으면 테스트 케이스 작성이 어렵다. 낮은 결합도와 높은 응집력이라는  목표를 저절로 달성한다.
  • 좋은 이름을 선택한다.
  • 함수, 클래스 크기를 가능한 줄인다.
  • 표준명칭을 사용한다.
  • 단위 테스트 케이스를 작성한다.

 

Template method 패턴? 고차원 중복을 제거할 목적으로 자주 사용하는 기법.

디자인 패턴 중 하나로, 행위(Behavioral) 패턴에 속한다.

알고리즘의 구조를 정의하면서도 특정 단계의 구현을 서브클래스에 위임하는 방식으로 작동한다.

기본적인 처리 흐름(템플릿)을 정의하고, 그 중 일부를 자식 클래스에서 구현할 수 있도록 한다.

 

핵심 개념

  1. 알고리즘의 뼈대를 부모 클래스에서 정의.
  2. 알고리즘의 일부 단계는 추상 메서드로 정의하여 서브클래스에서 구현하도록 강제.
  3. 특정 단계를 **오버라이딩(재정의)**할 수도 있음.
  4. 코드의 재사용성확장성을 높이는 데 유용.

구조

  • 추상 클래스 (Abstract Class): 알고리즘의 템플릿과 기본 구현을 정의
  • 구체 클래스 (Concrete Class): 추상 클래스에서 정의된 일부 단계를 구체적으로 구현

장점

  1. 알고리즘의 공통 부분을 한 곳에서 관리 → 중복 코드 제거.
  2. 알고리즘의 세부 사항을 서브클래스에서 수정 가능 → 유연성.
  3. 변경사항이 있어도 부모 클래스와 서브클래스 간의 의존성 최소화.

단점

  1. 서브클래스가 많아질수록 관리가 복잡.
  2. 상속을 기반으로 하기 때문에 런타임에 동적으로 변경하기 어려움.
using System;

abstract class Game
{
    // Template Method
    public void Play()
    {
        Initialize();
        StartPlay();
        EndPlay();
    }

    // Abstract methods to be implemented by subclasses
    protected abstract void Initialize();
    protected abstract void StartPlay();
    protected abstract void EndPlay();
}

class Football : Game
{
    protected override void Initialize()
    {
        Console.WriteLine("Football Game Initialized! Start playing.");
    }

    protected override void StartPlay()
    {
        Console.WriteLine("Football Game Started. Enjoy the game!");
    }

    protected override void EndPlay()
    {
        Console.WriteLine("Football Game Finished!");
    }
}

class Basketball : Game
{
    protected override void Initialize()
    {
        Console.WriteLine("Basketball Game Initialized! Start playing.");
    }

    protected override void StartPlay()
    {
        Console.WriteLine("Basketball Game Started. Enjoy the game!");
    }

    protected override void EndPlay()
    {
        Console.WriteLine("Basketball Game Finished!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Game football = new Football();
        football.Play(); // Football 게임 실행

        Console.WriteLine();

        Game basketball = new Basketball();
        basketball.Play(); // Basketball 게임 실행
    }
}