중간 수준의 소프트웨어(모듈 수준에서 작업) 구조에 적용됨 ⇒ 모듈과 컴포넌트 내부에서 사용되는 소프트웨어 구조를 정의
함수는 반드시 하나의 일만 해야한다.
⇒ 하나의 모듈은 하나의 액터에 대해서만 책임져야한다.
모듈 : 함수와 데이터 구조로 구성된 응집된
집합
SRP 위반 징후
우발적 중복 : 한 모듈 안의 메서드가 여러 액터를 책임짐
⇒ 서로 다른 액터가 의존하는 코드를 서로 분리해야한다.
병합 : 많은 사람이 서로 다른 목적으로 동일한 소스 파일을 변경 시도
⇒ 서로 다른 액터를 뒷받침하는 코드를 서로 분리(메서드를 각기 다른 클래스로 이동)
소프트웨어 개체(artifact)는
확장
에는 열려있어야하고,변경
에는 닫혀있어야한다.
⇒ 소프트웨어 개체의 행위는 확장할 수 있어야하나 개체를 변경해서는 안된다.
컴포넌트 단위로 시스템을 분리하고 저수준 컴포넌트에서 발생한 변경으로부터 고수준 컴포넌트를 보호할 수 있는 형태의 의존성 계층구조가 형성되도록 해야함
하위 개체에서 발생한 변경으로부터 상위 개체를 보호하는 일의 우선순위가 가장 높다.
상위 개체에서 발생한 변경으로부터도 하위 개체를 보호할 필요가 있다.
⇒ 인터페이스
등을 활용해 상위 개체 내부를 은닉하는 것으로 해결
인터페이스 : 추상화를 통해 사용자와 동작이 분리되어 인터페이스의 구현체가 변경되더라도 사용자는 동작의 변경 내용을 알 수가 없다. ⇒ 변경에 대한 의존성이 사라짐
하위 타입(subtype)에 관한 원칙, 상호 대체 가능한 구성요소를 이용해 소프트웨어 시스템을 만들 수 있으려면 구성요소는 반드시 서로 치환 가능해야한다.
⇒ 하위 타입은 언제나 상위 타입을 대체할 수 있어야한다.
소프트웨어 설계자는 사용하지 않은 것에 의존하지 않아야한다.
![]() | ![]() |
---|---|
그림2 | 그림3 |
그림2의 경우 user2가 사용하는 operation2를 변경하게되면 user1은 operation2와 operation3에도 의존하고 있어 user1의 변경사항이 없어도 user1을 다시 컴파일한 후 새로 배포하게 된다.
고수준
정책을 구현하는 코드는저수준
세부사항을 구현하는 코드에 절대로 의존해서는 안되며 세부사항은 정책에의존
해야한다.
의존성 역전 없이는 고수준의 모듈은 저수준의 모듈에 의존하는 구조로 작성되게 된다.
![]() | ![]() |
---|---|
그림4 | 그림5 |
WriteBlog
메서드가 있다고 가정했을때 네이버 블로그를 작성하기 위해서는 네이버 블로그를 파라미터로 받는 WriteBlog
메서드를 추가로 작성하게된다. 이후 플랫폼을 변경할 때마다 새로운 코드를 추가로 작성하게 될 것이다.Blog
라는 추상화된 클래스에 Writer
가 의존하도록 변경하고 Blog
를 상속받아 사이트를 구현하도록 했다. 이를 통해 사이트 변경에 의한 Writer
코드의 수정이 발생하지 않게 되었다.