“각 모듈의 응집도를 높이고, 결합도를 낮춤으로 확장성이 수용이 용이한 코드를 설계함으로 유지보수를 절감”
◼︎ SRP Single Responsibility Principle
객체는 단일 책임을 가진다
ㄴ 하나의 객체는 하나의 연관 Task를 처리하도록 설계한다.
//하나의 객체가 여러 역할을 가질 경우 개발자는 해당 객체의 역할과 동작 파악이 어려워짐.
DataManager
func readDataFromDisk() ...
func writeDataToDisk() ...
func getDataFromServer() ...
func setDataToServer() ...
---- 분리 ----
//객체의 단일 책임을 부여한다면 협업, 유지보수 비용에 이점을 가져옴.
DiskDataManager
func readDataFromDisk() ...
func writeDataToDisk() ...
NetworkDataManager
func getDataFromServer() ...
func setDataToServer() ...
◼︎ OCP Open Closed Principle
확장성 있는 코드 설계
ㄴ 요구사항이 변경되어도 기존 코드의 변경없이 대응 가능하도록 설계
//신규 기능이 추가될 경우 코드의 불안정성과 유지보수가 비효율적임
GraphicRender
func drawRectangle() ...
func drawTriangle() ...
func drawCircle() ...
func drawLine() ...
//도형의 정보를 외부에서 주입할 수 있게 만듬
func drawPolygon(Polygon)
Polygon (origin(x,y), size(w,h), cornerRadius)
◼︎ LSP Liskov Substitution Principle
인터페이스를 통해서 설계되어야 한다
ㄴ 인터페이스를 통해 설계되어 하위 모듈이 변환 되어도 영향 없이 동작 가능
◼︎ ISP Interface Segregation Principle
인터페이스를 통해서 설계할 수 있도록 public으로 노출되는 부분은 interface로 추상되어서 분리
interface로 추상화 해서 분리
확장성 향상
◼︎ DIP Dependency Inversion Principle
구현된 모듈이 추상화된 모듈에 의존하되, 반대는 성립이 안 되도록 구현
추상화된 모듈에만 의존되도록 구현하여 결합도를 낮춤
**- - - Original - - -**
TVRemote
func power
func channel
func volume
RadioRemote
func power
func channel
func volume
PodCastRemote
func power
func channel
func volume
**- - - LSP - - -
ISP + DIP**
func changeController(Remote)
Imp.RemoteInterface > remote
**- - - ISP - - - (Protocol)**
RemoteInterface
func power
func channel
func volume
TVRemote
Imp.RemoteInterface
RadioRemote
Imp.RemoteInterface
PodCastRemote
Imp.RemoteInterface
**- - - DIP - - -**
RemoteInterface
func power
func channel
func volume
func changeController(Remote)
Imp.RemoteInterface > remote
“인터페이스로 추상화 함으로써 기존 코드의 변경없이 모듈 구현”
“각자의 노하우를 정형화함”
◼︎ Creational Patterns
코드의 재사용과 확장성을 위한 객체 생성 패턴
객체 생성을 추상화하여, 코드의 재사용과 효율성을 증가시키는 패턴
Builder, Factor