Skip to content

Latest commit

 

History

History
96 lines (80 loc) · 3.38 KB

211209SOLID-S.md

File metadata and controls

96 lines (80 loc) · 3.38 KB

TIL 211209

Tag: SOLID- S

🔥학습 내용

SOLID 원칙이란?

객체 설계에 필요한 5가지 원칙으로써 유지보수가 쉽고, 유연하고, 확장이 쉬운 소프트웨어를 만들기 위한 수단

  • S (Single Responsibility Principle) : 단일 책임 원칙
  • O (Open/Close Principle) : 개방/폐쇄 원칙
  • L (Liscov Substitution Principle) : 리스코브 치환 원칙
  • I (Interface Segregation Principle) : 인터페이스 분리 원칙
  • D (Dependency Inversion Principle) : 의존성 역전 원칙

이 다섯가지 원칙을 적용한다면

  • 쉽게 변경이 가능한 유연한 코드를 가지게 된다. 이것은 재사용과 유지 보수가 쉬워지게 해준다.
  • 그렇게 개발된 소프트웨어는 안정되고, 탄탄하며 확장성이 뛰어날 것. (쉽게 새로운 기능을 추가할 수 있다.)
  • 디자인 패턴의 사용과 함께, 응집력이 높고 결합도가 낮은 소프트웨어를 만들 수 있다.

Single Responsibility Principle (단일 책임 원칙)

  • 클래스는 단 하나의 이유로만 변경 가능해야한다.
  • 클래스는 한가지의 책임만 가지고 있어야한다.

책임이란?

  • 객체에 의해 정의되는 응집도 있는 행위의 집합
  • 객체가 '무엇을 알고 있는가'와 '무엇을 할 수 있는가'
  • 하는 것
    • 인스턴스를 생성하거나 계산을 수행하는 등 스스로 하는 것
    • 다른 인스턴스의 행동을 유발하는 것
    • 다른 인스턴스의 활동을 제어하고 조절하는 것
  • 아는 것
    • 사적인 정보에 관해 아는 것
    • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
class LoginUser {
    func login() {
        let data = authenticareUserViaAPI()
        let user = decodeUser(data: data)
        saveToDB(array: array)
    }
    
    private func authenticareUserViaAPI() -> Data {
        // Call server to authenticate and return user's info
    }
    
    private func decodeUser(data: Data) -> User {
        // Decode data (Codable protocol) into User object
    }
    
    private func saveUserInfoOnDatabase(user: User) {
        // Save User info onto database
    }
}
  • 위 클래스는 인증, 디코딩, 저장의 3가지 책임을 가지고 있음.
  • 단일 책임 원칙을 충족하기 위해서는 이 책임을 각각의 작은 클래스로 분리해야 함.
class LoginUser {
    let oAuthHandler: OAuthHandler
    let decodeHandler: DecodeHandler
    let databaseHandler: DataBaseHandler
    
    init(oAuthHandler: OAuthHandler, decodeHandler: DecodeHandler, databaseHandler: DataBaseHandler) {
        self.oAuthHandler = oAuthHandler
        self.decodeHandler = decodeHandler
        self.databaseHandler = databaseHandler
    }
    
    func login() {
        let data = oAuthHandler.authenticareUserViaAPI()
        let user = decodeHandler.decodeUser(data: data)
        databaseHandler.saveUserInfoOnDatabase(user: user)
    }
}

class OAuthHandler {
    func authenticareUserViaAPI() -> Data {
        // Call server to authenticate and return user's info
    }
}

class DecodeHandler {
    func decodeUser(data: Data) -> User {
        // Decode data (Codable protocol) into User object
    }
}

class DataBaseHandler {
    func saveUserInfoOnDatabase(user: User) {
        // Save User info onto database
    }
}