단일 책임 원칙(Single Responsibility Principle, SRP), 의존성 역전 원칙(Dependency Inversion Principle, DIP)

임혜정·2024년 6월 4일
0

계산기 숙제 하기 전 정리하고 가기

단일 책임 원칙(Single Responsibility Principle, SRP)

각 클래스는 단 하나의 책임만 가져야 한다. 클래스가 변경될 이유가 단 하나만 있어야 하며, 그 이유는 클래스의 단일 책임과 직접적으로 관련되어 있어야 한다. 객체 지향 프로그래밍의 중요한 원칙 중 하나.

왜 필요하지?

코드의 유지보수성을 높이고 변경에 따른 영향을 최소화, 클래스의 재사용성을 높이는 데 도움이 된다. 이 원칙을 따르면 클래스의 역할과 책임이 명확해져 코드 가독성도 향상된다

사용 예제

import Foundation


// 유저 정보를 담는 역할만 한다
class User {
    let name: String
    let email: String
    
    init(name: String, email: String) {
        self.name = name
        self.email = email
    }
}

// 얘는 유저 관리 담당이고
class UserManager {
    private var users: [User] = []
    
    func addUser(_ user: User) {
        users.append(user)
        print("\(user.name)유저가 추가되었습니다")
    }
    func listUsers() -> [User] {
        return users
    }
}
// 얘는 유효성 검사 역할
class UserValidator {
    func validateName(_ name: String) -> Bool {
        return !name.isEmpty
    }
    func validateEmail(_ email: String) -> Bool {
        return email.contains("@")
    }
}

let userValidator = UserValidator()

//
let userName = "hjeong"
let userEmail = "hjeong@hjeong.com"

if userValidator.validateName(userName), userValidator.validateEmail(userEmail) {
    let user = User(name: userName, email: userEmail)
    let userManager = UserManager()
    userManager.addUser(user)
    
    for user in userManager.listUsers() {
        print("\(user.name) - \(user.email)")
    }
} else {
    print("유저를 찾을 수 없습니다.")
}

이런식으로 클래스를 분리해서 단일 책임만 가지도록 설계할 수 있다. 그러면 변경이 필요할 때 다른 클래스에 미치는 영향이 적어지고 역할이 명확해진다.

의존성 역전 원칙(Dependency Inversion Principle, DIP)

고수준 모듈이 저수준 모듈에 의존하는 의존성 관계를 역전시키는 것을 의미한다. 고수준 모듈과 저수준 모듈 모두 추상화에 의존하게 하고 구체적 구현에는 의존하지 않도록 한다. 객체 지향 설계의 중요한 원칙

  1. 고수준 모듈이 저수준 모듈에 의존해서는 안되고 둘 다 추상화에 의존해야 한다
  2. 추상화는 세부 사항에 의존하지 않는다. 세부 사항이 추상화에 의존해야 한다

왜 필요하지?

코드의 유연성, 재사용성을 높여 유지보수가 편해진다

사용 예제

import Foundation

// 알림을 보내는 기능을 정의하는 프로토콜
protocol NotificationSender {
    func send(message: String)
}

// 이메일로 알림 보내는 역할
class EmailNotificationSender: NotificationSender {
    func send(message: String) {
        print("Sending email with message: \(message)")
    }
}

// SMS로 알림 보내는 역할
class SMSNotificationSender: NotificationSender {
    func send(message: String) {
        print("Sending SMS with message: \(message)")
    }
}

// 고수준 모듈: 알림을 관리하는 클래스
class NotificationManager {
    private let sender: NotificationSender

    init(sender: NotificationSender) {
        self.sender = sender
    }

    func sendNotification(message: String) {
        sender.send(message: message)
    }
}

// 사용 
let emailSender = EmailNotificationSender()
let smsSender = SMSNotificationSender()

let notificationManagerEmail = NotificationManager(sender: emailSender)
notificationManagerEmail.sendNotification(message: "Hello via Email!")

let notificationManagerSMS = NotificationManager(sender: smsSender)
notificationManagerSMS.sendNotification(message: "Hello via SMS!")
profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️

0개의 댓글