로버트 C. 마틴이 고안한 5가지 좋은 설계를 위한 원칙으로, 각각의 원칙 SRP, OCP, LSP, ISP, DIP의 앞글자를 따서 SOLID 법칙이라 불리웁니다. 그 5가지는 아래의 표와 같아요.
Principle | Full name | Description |
---|---|---|
SRP | The Single Responsibility Principle | A class should have one, and only one, reason to change. |
OCP | The Open Closed Principle | You should be able to extend a classes behavior, without modifying it. |
LSP | The Liskov Substitution Principle | Derived classes must be substitutable for their base classes. |
ISP | The Interface Segregation Principle | Make fine grained interfaces that are client specific. |
DIP | The Dependency Inversion Principle | Depend on abstractions, not on concretions. |
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
하나의 모듈은 하나의, 오직 하나의 액터에 대해서만 책임져야 합니다.
A module should be responsible to one, and only one, actor.
시스템에서 어떤 모듈이나 클래스를 사용하게 될 액터가 몇명인지를 확인할 것
즉, 단일 책임 원칙에서 책임은 액터에 대한 책임이에요.
Actor란?
메시지를 전달하는 주체..
같은 방식으로 변경되기를 원하는 사용자나 이해관계자들을 의미해요
급여 애플리케이션에서 위와 같이 Employee 클래스가 있다고 가정해봅시다.
그런데, 이들 세 가지 메소드가 서로 다른 세 명의 액터를 책임지기 때문에, SRP를 위반하는 사례예요.
메소드 | 기능정의 주체 | 목적 |
---|---|---|
calculatePay | 회계팀 | CFO 보고 |
reportHours | 인사팀 | COO 보고 |
save | DB관리자 (DBA) | CTO 보고 |
regularHours
초과근무를 제외한 업무시간을 계산하는 알고리즘을 개발하였음regularHours
는 calculatePay
와 reportHours
에서 사용됨그런데, CFO팀에서 regularHours
를 바꿨다면???
reportHours
에서 이용되는줄은 모르고 바꾼거라서 reportHours
에서 엉망으로 나타난다!!
You should be able to extend a classes behavior, without modifying it.
Derived classes must be substitutable for their base classes.
Make fine grained interfaces that are client specific
Depend on abstractions, not on concretions.