Tag: SOLID- S
객체 설계에 필요한 5가지 원칙으로써 유지보수가 쉽고, 유연하고, 확장이 쉬운 소프트웨어를 만들기 위한 수단
- S (Single Responsibility Principle) : 단일 책임 원칙
- O (Open/Close Principle) : 개방/폐쇄 원칙
- L (Liscov Substitution Principle) : 리스코브 치환 원칙
- I (Interface Segregation Principle) : 인터페이스 분리 원칙
- D (Dependency Inversion 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
}
}