계산기 숙제 하기 전 정리하고 가기
각 클래스는 단 하나의 책임만 가져야 한다. 클래스가 변경될 이유가 단 하나만 있어야 하며, 그 이유는 클래스의 단일 책임과 직접적으로 관련되어 있어야 한다. 객체 지향 프로그래밍의 중요한 원칙 중 하나.
코드의 유지보수성을 높이고 변경에 따른 영향을 최소화, 클래스의 재사용성을 높이는 데 도움이 된다. 이 원칙을 따르면 클래스의 역할과 책임이 명확해져 코드 가독성도 향상된다
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("유저를 찾을 수 없습니다.")
}
고수준 모듈이 저수준 모듈에 의존하는 의존성 관계를 역전시키는 것을 의미한다. 고수준 모듈과 저수준 모듈 모두 추상화에 의존하게 하고 구체적 구현에는 의존하지 않도록 한다. 객체 지향 설계의 중요한 원칙
코드의 유연성, 재사용성을 높여 유지보수가 편해진다
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!")