Tag: SOLID-D
- SOLID를 벌써부터 완전히 이해하려고 하지말자.
- 개념만 파악하고, 계속해서 의식하면서 개발하자.
- 상위레벨 모듈은 하위레벨 모듈에 의존하면 안된다.
- 두 모듈은 추상화된 인터페이스(프로토콜)에 의존해야한다.
- 추상타입은 구체타입에 의존하지 않게 된다. 구체타입이 추상타입에 의존하게 된다.
- 하위레벨 모듈이 상위레벨 모듈을 참조하는 것은 되지만, 상위레벨 모듈이 하위레벨 모듈을 참조하는 것은 안하는게 좋다. 그런 경우는 제네릭이나 Associate를 사용
- 모듈간의 의존성을 낮추고 클래스간의 결합도를 낮추도록 한다.
protocol TimeTraveling {
func travelInTime(time: TimeInterval) -> String
}
final class DeLorean: TimeTraveling {
func travelInTime(time: TimeInterval) -> String {
return "Used Flux Capacitor and travelled in time by: \(time)s"
}
}
final class EmmettBrown {
private let timeMachine: TimeTraveling
// ⚠️ Emmet Brown은 `DeLorean`을 구체적인 클래스인 `DeLorean`이 아닌, `TimeTraveling` 장치로 받는다.
init(timeMachine: TimeTraveling) {
self.timeMachine = timeMachine
}
func travelInTime(time: TimeInterval) -> String {
return timeMachine.travelInTime(time: time)
}
}
let timeMachine = DeLorean()
let mastermind = EmmettBrown(timeMachine: timeMachine)
mastermind.travelInTime(time: -3600 * 8760)
class 맥북13인치 {
func 전원켜기() {}
}
class 개발자 {
let 노트북: 맥북13인치 = 맥북13인치()
func 개발시작() {
노트북.전원켜기()
}
}
// 변화하기 쉬운 모듈(클래스)에 의존
class 맥북13인치 {
func 전원켜기() {}
}
class 개발자 {
let 노트북: 맥북13인치
init(노트북: 맥북13인치) {
self.노트북 = 노트북
}
func 개발시작() {
노트북.전원켜기()
}
}
// 의존성 주입(DI)
protocol 노트북 {
func 전원켜기()
}
class 개발자 {
let 노트북: 노트북
init(맥북: 노트북) {
self.노트북 = 맥북
}
func 개발시작() {
노트북.전원켜기()
}
}
class 맥북13인치: 노트북 {
func 전원켜기() {}
}
class 맥북15인치: 노트북 {
func 전원켜기() {}
}
class 레노버: 노트북 {
func 전원켜기() {}
}
// 하위레벨 모듈들이 상위레벨 모듈(추상화된 프로토콜)을 의존하고 있고, 상위레벨 모듈은 변화가 거의 없는 모듈