클린 코드 8장 - 경계

French Marigold·2023년 12월 16일
0

클린코드

목록 보기
8/13

외부 코드를 사용할 때에 주의할 점 (144p)

  • 외부 라이브러리 코드를 너무 많이 사용할 경우, 외부 라이브러리의 구현 내용이나 프로토콜 등이 변한다면 수정할 코드가 상당히 많아지게 된다.
  • 외부 라이브러리 사용을 여기저기 남발하지 않으려면 다음과 같이 캡슐화해서 사용하는 것을 추천.
  • 근데 또 외부 라이브러리를 사용할 때마다 캡슐화를 사용하라는 의미는 아니므로, 이러한 방법도 있다고 생각하면 될 듯하다.
import Sensor // 예를 들어 Sensor라는 외부 라이브러리를 사용한다고 가정했을 때,

// Sensor라는 캡슐화 객체를 만들어서 이 내부에서 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
}

// 1. 기존에 처리하던 방식의 Login을 프로토콜로 구현하여 처리하고 있었고
protocol LoginProtocol {
    func login(sendData: @escaping (Bool) -> ())
}

// 2. 현재 로그인 처리방식인 CurrentLoginService가 LoginProtocol을 채택한 형태로 로그인을 진행하고 있었음.
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) -> ()) {
        // 서버에 사용자 정보를 보내서
        // 사용자 정보가 존재할 경우 true, 존재하지 않을 경우 false
    }
}

// 3. 그런데 가만보니 애플이 사용하는 로그인 방식이 더 멋져보임. 애플 로그인 방식이 더 쿨해보임.
final class AppleLoginService {
    func login() {
        // 애플 로그인 내부 구현
    }
}

// 4. 그래서 애플이 사용하는 로그인 방식을 가져오기 위해 adapter 패턴을 사용하기로 함.
final class AppleLoginAdapter: LoginProtocol {
    
    let appleLoginService = AppleLoginService()
    
    func login(sendData: @escaping (Bool) -> ()) {
        appleLoginService.login()
        sendData(true)
    }
}

// 5. AppleLoginAdapter를 이용해서 **내가 사용하는 로그인 코드를 이용해 애플 로그인 방식을 구현할 수 있음!! ⭐️⭐️**
let appleLoginAdapter = AppleLoginAdapter()
appleLoginAdapter.login { value in
    if value {
        // 로그인이 성공할 경우 처리
        print("애플 계정 로그인되었습니다.")
    } else {
        // 로그인이 실패할 경우 처리
        print("애플 계정 로그인 실패")
    }
}
profile
꽃말 == 반드시 오고야 말 행복

0개의 댓글