내일배움캠프 앱개발 iOS 트랙 본캠프 2주차
Today I Learned
단일책임원칙
Single Responsibility Principle
하나의 객체는 반드시 하나의 책임을 가진다
- 클래스의 수정이유는 단 하나여야한다.
- 하나의 클래스는 하나의 책임을 가여쟈한다.
- 하나의 책임이 여러개의 클래스에 나뉘어 있어서도 안된다.
protocol Animal {
func makeSound()
}
class Dog: Animal {
func makeSound() {
print("멍멍")
}
}
class Cat: Animal {
func makeSound() {
print("야옹")
}
}
class Zoo {
var animals: [Animal] = []
func makeAllSounds() {
animals.forEach {
$0.makeSound()
}
}
}
프로토콜이나 클래스의 상속을 사용해서 설계하는 예시.
Dog, Cat말고도 다른 동물을 추가할 때는
class Tiger: Animal {
}
이렇게 선언해서 안을 구현해주면 된다.
기존의 코드는 건드리지 않지만 새로운 클래스를 추가해서 함수를 사용할 수 있게 된다.
= 확장에 열려있지만 수정에는 닫혀 있음
= Open-Closed Principle (OCP)
ㄴ 기존 클래스
class Calculator {
func calculate(_ numbers: [Double], _ operatorType: String) -> Double {
var returnResult: Double = 0
switch operatorType {
case "+":
returnResult = numbers[0] + numbers[1]
case "-":
returnResult = numbers[0] - numbers[1]
case "x":
returnResult = numbers[0] * numbers[1]
case "÷":
returnResult = numbers[0] / numbers[1]
default:
break
}
return returnResult
}
func checkDouble(value: Double) -> Bool {
return value.truncatingRemainder(dividingBy: 1.0) == 0 ? true : false
}
}
ㄴ 수정 분할한 클래스
// MARK: - Class Calculator
class Calculator {
var add = AddOperation()
var sub = SubtractOperation()
var mul = MultiplyOperation()
var div = DivideOperation()
func calculate(_ numbers: [Double], _ operatorType: String) -> Double {
var returnResult: Double = 0
switch operatorType {
case "":
return 0
case "+":
returnResult = add.operate(numbers)
case "-":
returnResult = sub.operate(numbers)
case "x":
returnResult = mul.operate(numbers)
default:
break
}
return returnResult
}
}
// MARK: - AbstractOperation Override
class AbstractOperation {
func operate(_ numbers:[Double]) -> Double {
return numbers[0] + numbers[1]
}
}
class AddOperation: AbstractOperation {
override func operate(_ numbers: [Double]) -> Double {
return numbers[0] + numbers[1]
}
}
class SubtractOperation: AbstractOperation {
override func operate(_ numbers: [Double]) -> Double {
return numbers[0] - numbers[1]
}
}
class MultiplyOperation: AbstractOperation {
override func operate(_ numbers:[Double]) -> Double {
return numbers[0] * numbers[1]
}
}
class DivideOperation: AbstractOperation {
override func operate(_ numbers:[Double]) -> Double {
return numbers[0] / numbers[1]
}
}
기존 클래스는 Calculator 라는 클래스 안에서 모든 연산을 담당했다. 관련 없는 함수도 들어있었다.
수정한 클래스는 AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스로 나누어서 작성했다.
또한, AbstractOperation 라는 이름의 클래스를 만들어 사칙연산 클래스에게 상속시켜서 추상화를 하려고 해 봤다.
추상화...?
사실 추상화에 대한 개념을 제대로 찾지 못했다. 프로토콜과 관련이 있어 보이니 내일은 그 쪽을 좀 공부해보아야겠다.
'TIL' 카테고리의 다른 글
[TIL] 2023.12.04 | 키오스크(1/n) 열거형과 구조체의 사용법 차이, CaseIterable (0) | 2023.12.04 |
---|---|
[TIL] 2023.12.01 | 계산기(4/4) 클래스 추상화, 의존성주입, 의존성역전원칙 (0) | 2023.12.02 |
[TIL] 2023.11.29 | 계산기(2/n) 숫자 2개 이상을 계산할 수 있는 사칙연산 구현하기 (1) | 2023.11.29 |
[TIL] 2023.11.28 | [계산기 (1/n)]storyboard UIButton UILabel 사용, Swift 사칙연산 구현하기 (0) | 2023.11.28 |
[TIL] 2023.11.27 | 깃허브 온갖 에러를 보다 (0) | 2023.11.27 |