클래스
단일 책임 원칙(SRP) 지키기
- 하나의 클래스는 하나의 책임만 갖도록 설계한다. 
- 클래스도 작아야 가독성과 유지보수 측면에 이점이 있다. 
// as-is
class Store {                 // Store 클래스가 많은 역할을 혼자 수행한다.
    func cummunicateUser() { }
    func manageProducts() { }
    func manageMoney() { }
}// to-be
class CounterManager {
    func communicateUser() { }
}
class ProductManager {
    func manageProducts() { }
}
class Owner {
    func manageMoney() { }
}
class Store {
    let counterManager: CounterManager
    let productManager: ProductManater
    let owner: Owner
    func sellProduct() {
        counterManager.communicateUser()
        // code
    }
    // code...
}응집도를 높이자.
- 응집도는 클래스의 변수와 메서드가 얼마나 유기적으로 엮여있는지를 나타내는 지표이다. - 응집도가 높을수록 클래스의 메서드는 인스턴스 변수를 많이 사용한다. 
- 응집도가 낮을수록 클래스의 메서드는 인ㅅ턴스 변수를 적게 사용하거나 사용하지 않는다. 
 
// as-is
class LowCohension {
    var a: Int
    var b: Int
    var c: Int
    func processA() {
        print(self.a)
    }
    func processB() {
        print(self.b)
    }
    func processC() {
        print(self.c)
    }
}// to-be
class HighCohension {
    var abc: ABC
    func processA() {
        print(self.abc.processA())
    }
    func procesB() {
        print(self.abc.processB())
    func procesC() {
        print(self.abc.processC())
}// 실제 코드, element인스턴스가 3개의 메서드에서 모두 사용되고 있다.
class Stack { 
    var elements = [Int]()
    func size() -> Int {
        return elements.count
    }
    func push(_ element: Int) {
        elements.append(element)
    }
    func pop() -> Int? {
        guard !elements.isEmpty else { return nil }
        return elements.removeLast()
    }
}변경하기 쉽게 만들자 (open closed)
- 다형성과 연결되는 부분이다. 
- 새 기능을 수정하거나 기존 기능을 변경할 때, 코드의 변경으 최소화하는 것이 중요하다. 
- 일반적으로 클래스(객체)는 구현과 추상으로 나뉜다. - 구현(Concrete) : 실제 동작하는 구체적 코드 
- 추상 (Abstract) : 구체적인 기능을 개념화한 코드 
 
- 변경하기 쉽게 설계하기 위해서, 추상화를 통해 구체 클래스에 의존하지 않고, 추상 클래스에 의존하도록 코드를 작성하는 것이 중요하다. - // as-is class Developer { func coding() { print("코딩을 합니다") } } class Designer { func design() { print("디자인을 합니다") } } class Analyst { func analyze() { print("분석을 합니다") } } class Company { var employees = [Employee] func makeWokr() { for employee in employess { switch employee { case .developer: employee.coding() case .designer: employee.disign() case .analyst: employee.analyze() } } } }- // to-be protocol Employee { func work() } class Company { var employees = [Employee] func makeWork() { for employee in employees { employee.work() } } } class Developer: Employee { func work() { print("coding") } } class Designer: Employee { func work() { print("design") } }
Last updated