Ch12. 창발성
켄트 벡이 제시한 단순한 설계규칙 4가지
1 모든 테스트를 실행한다.
2. 중복을 없앤다.
3. 프로그래머 의도를 표현한다.
4. 클래스와 메서드 수를 최소로 줄인다.
- 결합도가 높으면 테스트 케이스 작성이 어렵다. 낮은 결합도와 높은 응집력이라는 목표를 저절로 달성한다.
- 좋은 이름을 선택한다.
- 함수, 클래스 크기를 가능한 줄인다.
- 표준명칭을 사용한다.
- 단위 테스트 케이스를 작성한다.
Template method 패턴? 고차원 중복을 제거할 목적으로 자주 사용하는 기법.
디자인 패턴 중 하나로, 행위(Behavioral) 패턴에 속한다.
알고리즘의 구조를 정의하면서도 특정 단계의 구현을 서브클래스에 위임하는 방식으로 작동한다.
기본적인 처리 흐름(템플릿)을 정의하고, 그 중 일부를 자식 클래스에서 구현할 수 있도록 한다.
핵심 개념
- 알고리즘의 뼈대를 부모 클래스에서 정의.
- 알고리즘의 일부 단계는 추상 메서드로 정의하여 서브클래스에서 구현하도록 강제.
- 특정 단계를 **오버라이딩(재정의)**할 수도 있음.
- 코드의 재사용성과 확장성을 높이는 데 유용.
구조
- 추상 클래스 (Abstract Class): 알고리즘의 템플릿과 기본 구현을 정의
- 구체 클래스 (Concrete Class): 추상 클래스에서 정의된 일부 단계를 구체적으로 구현
장점
- 알고리즘의 공통 부분을 한 곳에서 관리 → 중복 코드 제거.
- 알고리즘의 세부 사항을 서브클래스에서 수정 가능 → 유연성.
- 변경사항이 있어도 부모 클래스와 서브클래스 간의 의존성 최소화.
단점
- 서브클래스가 많아질수록 관리가 복잡.
- 상속을 기반으로 하기 때문에 런타임에 동적으로 변경하기 어려움.
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 게임 실행
}
}
'프로그래밍&IT > 학습, 책' 카테고리의 다른 글
[클린 아키텍처] 1) 설계와 아키텍처, 개발 패러다임 (구조적, 객체지향, 함수형) (1) | 2025.01.26 |
---|---|
[클린 코드] 7. 동시성, 개선, 휴리스틱 (0) | 2025.01.19 |
[클린 코드] 5. 시스템 (0) | 2025.01.13 |
[클린 코드] 5. 오류처리, 경계, 단위테스트 (0) | 2025.01.12 |
[클린 코드] 4. 객체와 자료구조 (0) | 2025.01.09 |