상세 컨텐츠

본문 제목

[디자인패턴의 아름다움] 3장. 설계 원칙 : 단일책임원칙, 개방폐쇄 원칙

CS구멍/디자인패턴

by :Eundms 2024. 4. 20. 10:43

본문

단일책임원칙

클래스와 모듈은 하나의 책임 또는 기능만을 가지고 있어야 한다

클래스에 단일 책임이 있는지 판단하기

일단 작성하고, 코드가 복잡해짐에 따라 거대해진 클래스를 여러 개의 세분화된 클래스로 나누자

1. 클래스에 코드, 함수 또는 속성이 너무 많아 코드의 가독성과 유지 보수성에 영향을 미치는 경우 클래스 분할을 고려하자

2. 클래스가 너무 과하게 다른 클래스에 의존한다면, 높은 응집도와 낮은 결합도의 코드 설계 사상에 부합하지 않으므로 클래스 분할을 고려하자

3. 클래스에 private 메서드가 너무 많은 경우 새로운 클래스로 분리하고 더 많은 클래스에서 사용할 수 있도록 public 메서도로 설정하여 코드의 재사용성을 향상시키자

4. 클래스의 이름을 비즈니스적으로 정확하게 지정하기 어렵거나 Manager, Context처럼 일반적인 단어가 아니면 클래스의 이름을 정의하기 어려울 경우, 클래스 책임 정의가 충분히 명확하지 않음을 의미한다

5. UserInfo 클래스의 많은 메서드가 주소를 위해서만 구현된 앞의 예시처럼 클래스의 많은 메서드가 여러 속성 중 일부에서만 작동하는 경우 이러한 속성과 해당 메서드를 분할하는 것을 고려하자

 

클래스 분할로 인해 코드의 유지 보수성이 극히 낮아질 수 있다 

 

개방 폐쇄 원칙

확장할 때는 개방, 수정할 때는 폐쇄

해당 모듈들이 어떻게 사용될지, 어떤 요구 사항이 있을지 이해하는 것이 필수적

단기간 내에 진행할 수 있는 확장, 코드 구조 변경에 미치는 영향이 비교적 큰 확장, 구현 비용이 많이 들지 않는 확장에 대해 확장 포인트를 준비하자

 

방법1)

public class ApplicationContext {
    private AlertRule alertRule;
    private Notification notification;
    private Alert alert;
    
    public void initalizeBeans() {
    	alertRule = new AlertRule(/*매개변수 생략*/); // 초기화 코드 생략
        notification = new Notification(/* 매개변수 생략*/); // 초기화 코드 생략
        alert = new Alert();
        alert.addAlertHandler(new TpsAlerthandler(alertRule, notification));
        alert.addAlertHandler(new ErrorAlertHandler(alertRule, notification));
		// api 핸들러 등록
    }
    
    public Alert getAlert() { return alert; }
    
    private static final ApplicationContext instance = new ApplicationContext();
    private ApplicationContext() {
    	initalizeBeans();
    }
    
    public static ApplicationContext getInstance() {
    	return instance;
    }
}

public class Demo {
	public static void main(String[] args) {
    	ApiStatInfo apiStatInfo = new ApiStatInfo();
        // ... apiStatInfo 데이터 값 설정 코드 생략 ..
        ApplicationContext.getInstance().getAlert().check(apiStatInfo);
    }
}
public class ApiStatInfo {
    private String api;
    private long requestCount;
    private long errorCount;
    private long duration;
    private long timeoutCount; // 변경1 : timeoutCount 속성 추가 
}

public abstract class AlertHandler {// 코드 변경 없음 }
public class TpsAlertHandler extends AlertHandler {//코드 변경 없음 }
public class ErrorHandler extends AlertHandler {// 코드 변경 없음 }

// 변경2 : TimeoutAlertHandler 클래스 추가 
public class TimeoutAlertHandler extends AlertHandler {//코드 생략}

 

방법2)

추상 인터페이스를 상속받은 클래스를 주입받아서 동일한 이름이지만 다른 동작을 하도록 한다 

 

 

'CS구멍 > 디자인패턴' 카테고리의 다른 글

[디자인패턴] 팩터리패턴  (0) 2024.05.05
[디자인패턴] 싱글턴 패턴  (0) 2024.05.01

관련글 더보기

댓글 영역