
외부 코드를 사용할 때에 주의할 점 (144p)
- 외부 라이브러리 코드를 너무 많이 사용할 경우, 외부 라이브러리의 구현 내용이나 프로토콜 등이 변한다면 수정할 코드가 상당히 많아지게 된다.
- 외부 라이브러리 사용을 여기저기 남발하지 않으려면 다음과 같이 캡슐화해서 사용하는 것을 추천.
- 근데 또 외부 라이브러리를 사용할 때마다 캡슐화를 사용하라는 의미는 아니므로, 이러한 방법도 있다고 생각하면 될 듯하다.
import Sensor
class Sensors {
private var sensors: [String: Sensor] = [:]
func getById(_ id: String) -> Sensor? {
return sensors[id]
}
}
Adapter 패턴이란? (151p)
- 해외 여행을 여기저기 다니다보면 220V짜리 플러그를 어댑터를 통해서 110V짜리 플러그에 맞추어서 사용할 수 있는 것을 확인할 수 있다. Adapter 패턴이 바로 이 어댑터와 똑같은 역할을 한다.
- 즉, 기존 시스템에서 새로운 시스템을 사용하고자 할 때, adapter라는 것을 사용해 기존 시스템을 변형시키지 않으면서 새로운 시스템을 사용할 수 있게 하는 패턴이다.
- 다른 팀이 아직 API를 구성하지 않았을 경우, 일단 우리 쪽에서 자체적으로 설계한 후에 Adapter 패턴을 사용해 다른 팀의 API와 연결할 수 있다. 이렇게 하면 우리 쪽 코드와 다른 팀의 API의 코드를 깔끔하게 분리할 수 있고 우리의 코드를 우리 스스로 통제할 수 있다.
enum LoginError: Error {
case loginError
}
struct User {
let id: String
let name: String
}
protocol LoginProtocol {
func login(sendData: @escaping (Bool) -> ())
}
final class CurrentLoginService: LoginProtocol {
func login(sendData: @escaping (Bool) -> ()) {
let userInfo = UserInfo(email: "이메일", password: "패스워드")
submitUserInfo(userInfo: userInfo) { value in
sendData(value)
}
}
func submitUserInfo(userInfo: UserInfo, sendData: @escaping (Bool) -> ()) {
}
}
final class AppleLoginService {
func login() {
}
}
final class AppleLoginAdapter: LoginProtocol {
let appleLoginService = AppleLoginService()
func login(sendData: @escaping (Bool) -> ()) {
appleLoginService.login()
sendData(true)
}
}
let appleLoginAdapter = AppleLoginAdapter()
appleLoginAdapter.login { value in
if value {
print("애플 계정 로그인되었습니다.")
} else {
print("애플 계정 로그인 실패")
}
}