begaonnuri
  • 소개
  • Book
    • 이펙티브 코틀린
      • 아이템 1. 가변성을 제한하라
      • 아이템 2. 변수의 스코프를 최소화하라
      • 아이템 3. 최대한 플랫폼 타입을 사용하지 말라
      • 아이템 4. inferred 타입으로 리턴하지 말라
      • 아이템 5. 예외를 활용해 코드에 제한을 걸어라
      • 아이템 6. 사용자 정의 오류보다는 표준 오류를 사용하라
      • 아이템 7. 결과 부족이 발생할 경우 null과 Failure를 사용하라
    • 클린아키텍처
      • 1장 설계와 아키텍처란?
      • 2장 두 가지 가치에 대한 이야기
      • 3장 패러다임 개요
      • 4장 구조적 프로그래밍
      • 5장 객체 지향 프로그래밍
      • 6장 함수형 프로그래밍
      • 7장 SRP: 단일 책임 원칙
      • 8장 OCP: 개방-폐쇄 원칙
      • 9장 LSP: 리스코프 치환 원칙
      • 10장 ISP: 인터페이스 분리 원칙
      • 11장 DIP: 의존성 역전 원칙
      • 12장 컴포넌트
      • 13장 컴포넌트 응집도
      • 14장 컴포넌트 결합
      • 25장 계층과 경계
Powered by GitBook
On this page
  • 사고 실험
  • 방향성 제어
  • 결론
  1. Book
  2. 클린아키텍처

8장 OCP: 개방-폐쇄 원칙

소프트웨어 개체(artifact)는 확장에는 열려 있어야 하고 변경에는닫혀 있어야 한다.

소프트웨어 아키텍처를 공부하는 가장 근본적인 이유이다.

대부분은 OCP가 클래스와 모듈을 설계할 때 도움되는 원칙이라고 알고있지만 아키텍처 컴포넌트 수준에서 OCP를 고려할 때 훨씬 중요한 의미를 가진다.

사고 실험

재무제표를 웹 페이지로 보여주는 시스템이 있다고 생각하자. 웹으로만 보던 보고서를 출력하는 요구사항이 추가되었을 때 기존 코드를 얼마나 수정해야 할까?

이상적인 변경량은 0이다. 다른 목적으로 변경되는 요소를 적절하게 분리하고(SRP), 의존성을 체계화함으로써(DIP) 변경량을 최소화할 수 있다.

SRP를 통해 책임을 분리했다면 두 책임 중 하나에서 변경이 발생하더라도 다른 하나는 변경되지 않도록 소스 코드 의존성도 확실히 조직화해야 한다.

A 컴포넌트에서 발생한 변경으로부터 B 컴포넌트를 보호하려면 반드신 A 컴포넌트가 B 컴포넌트에 의존해야한다.

비즈니스 규칙을 포함한 모듈은 OCP를 가장 잘 준수할 수 있는 곳에 위치해서 최고의 보호를 받아야한다. 저수준 컴포넌트에서 발생한 변경으로부터 고수준 컴포넌트를 보호해야 한다.

방향성 제어

의존성을 역전시키기 위해 인터페이스를 생성할 수 있다. 인터페이스를 통해 구현 클래스 내부에 대해 너무 많이 알지 못하도록 한다.

인터페이스가 없다면 추이 종속성(transitive dependency)를 가지게 된다. 추이 종속성을 가지게 되면 소프트웨어 엔티티는 '자신이 직접 사용하지 않는 요소에는 절대로 의존해서는 안된다'는 소프트웨어 원칙을 위반하게 된다.

결론

OCP의 목표는 시스템을 확장하기 쉬운 동시에 변경으로 인해 너무 많은 영향을 받지 않도록 하는 데 있다. 목표를 달성하기 위해 시스템을 컴포넌트 단위로 분리하고 저수준 컴포넌트에서 발생한 변경으로부터 고수준 컴포넌트를 보호할 수 있는 형태의 의존성 계층구조가 만들어지도록 해야 한다.

Previous7장 SRP: 단일 책임 원칙Next9장 LSP: 리스코프 치환 원칙

Last updated 3 years ago