TDD, RxSwift, MVVMμ μ΄μ©ν΄μ κ°λ¨ν μ± κ°λ°μ ν΄λ³΄κ² μ΅λλ€.
TDD(Test Driven Development)λ₯Ό νλ€κ³ νλ κ²μ κΈ°λ³Έμ μΌλ‘ λ‘μ§ μ½λλ₯Ό μμ±νκΈ° μ μ ν μ€νΈ μ½λλ₯Ό λ¨Όμ μμ±νλ€λ κ²μ μλ―Έν©λλ€. κ·Έλ°λ° λ‘μ§ μ½λλ₯Ό μμ±νκΈ° μ μ ν μ€νΈ μ½λλ₯Ό μμ±νλ€λ κ²μ 무μμ μλ―Έν κΉμ? λ¬΄μ¨ μ΄μ μ΄ μμκΉμ?
μλ₯Ό λ€μ΄ add λΌλ λ§μ μ νλ ν¨μλ₯Ό μμ±νλ€κ³ κ°μ ν΄ λ΄ μλ€. TDDλ₯Ό νλ€κ³ νμΌλ, λ¨Όμ addμ λν ν μ€νΈ μ½λλ₯Ό μμ±ν©μλ€.
μ½λλ₯Ό ν μ€νΈνλ€λ κ²μ 무μμ μλ―Έν κΉμ? ν΄λΉ μ½λκ° μνλ λλ‘ μλνλμ§ νμΈνλ€λ κ²μ λλ€. κ·Έλ¬λ©΄ ν΄λΉ μ½λκ° μνλ λλ‘ μλνλμ§ μ΄λ»κ² νμΈν μ μμκΉμ?
μ¬κΈ°μμλ addλ₯Ό μμ±νλ€κ³ νμΌλ, addμ λν΄ "μ λ ₯μ΄ a, b μΌλ, μΆλ ₯μ΄ a + b μΈ κ°μ΄λ©΄ μ λλ‘ μλνλ€"κ³ ν μ μμ κ²λλ€. κ·Έλμ addμ λν ν μ€νΈ μ½λλ μλμ κ°μ ννλ‘ μμ±ν μ μμ κ²λλ€.
if(3 == add(a: 1,b: 2)) {
print("μ±κ³΅")
}
else {
print("μ€ν¨")
}
XCTAssertλ₯Ό μ΄μ©ν΄μ μ½λλ₯Ό μ’ λ κ°λ¨νκ² νμνλ©΄, μλμ κ°μ΄ μμ±ν μ μμ κ²λλ€.
XCTAssert(3 == add(a: 1,b: 2))
μ΄ μ½λλ₯Ό μ€ν μν€λ©΄, addλΌλ ν¨μκ° μμΌλ λΉμ°ν μλ¬κ° λκ² λ©λλ€. μ΄μ add ν¨μλ₯Ό μλμ κ°μ΄ μμ±ν©λλ€.
func add(a:Int, b:Int) -> Int {
return a + b
}
κ·Έλ¦¬κ³ ν μ€νΈλ₯Ό μ€νμν€λ©΄ μ μμ μΌλ‘ ν μ€νΈκ° ν΅κ³Όλ©λλ€.
κ·ΈλΌ μ¬κΈ°μ, μμ ν μ€νΈ μ½λλ₯Ό μμ±νκΈ° μ μ μ μνλ "μ λ ₯μ΄ a, bμΌλ, μΆλ ₯μ΄ a + bμΈ κ°μ΄λ©΄ μ λλ‘ μλνλ€"λ 무μμ μλ―Έν κΉμ?
μ΄κ²μ λ‘μ§ μ½λκ° μ΄λ»κ² λμν΄μΌ νλμ§λ₯Ό μ μν λ¬Έμ₯μ΄ λ©λλ€. (μ¦, ν¨μμ λν μ€ν(Specification)μ΄μ£ ) κ·Έλ¦¬κ³ XCTAssert(3 == add(1,2)) λ μ€νμ μ½λλ‘ κΈ°μ ν κ²μ λλ€.
μ¦, TDDμμλ ν μ€νΈ μ½λλ₯Ό λ¨Όμ μμ±νλ€λ μμ±ν λ‘μ§ μ½λμ λν μ€νμ λ¨Όμ μ½λλ‘ μ μνλ€λ κ²μ μλ―Έν©λλ€. κ·Έλ¬λ©΄ μ€νμ μ½λλ‘ λ¨Όμ μ μνκ³ λ‘μ§ μ½λλ₯Ό μμ±νκ² λλ©΄ μ΄λ€ μ΄μ μ΄ μμκΉμ?
νμ¬λ‘μλ μλ₯Ό λ μ½λλ λ무 κ°λ¨ν΄μ λ³λ‘ μ΄μ μ΄ μμ΅λλ€. μ€νμ μ½λλ‘ μ μν΄μΌ νλ, μ€νλ € λ νΌκ³€ν΄ 보μ΄κΈ°λ§ ν©λλ€. νμ§λ§ λ‘μ§ μ½λμ μμ΄ λ§κ³ , 볡μ‘νλ€λ©΄ μ΄λ€ μΌμ΄ μ΄λ»κ² λ κΉμ?
μλ₯Ό λ€μ΄ ν¨μ strangeAdd λΌλ ν¨μλ₯Ό μμ±νλ€κ³ κ°μ ν©μλ€. stringAddλ a, bλΌλ λκ°μ νλΌλ―Έν°λ₯Ό λ°λλ°, aκ° 3μ΄ μλκ³ 7μ΄ μλλ©°, μ§μκ° μλ λλ a + bμΈ κ°μ 리ν΄νκ³ , aκ° μ§μμΌ λλ a * bμΈ κ°μ 리ν΄νλ€κ³ ν©μλ€. κ·Έλ¦¬κ³ aκ° 3μ λ°°μμΌ λλ 3 + a * b μΈ κ°μ 리ν΄νλ€κ³ νκ³ , aκ° 7μ λ°°μμ΄λ©΄μ, bκ° 8μ λ°°μμ΄λ©΄ 7 * a + 8 * b μΈ κ°μ 리ν΄νλ€κ³ ν©μλ€. κ·Έλ¦¬κ³ μμ μ‘°κ±΄μ΄ λͺ¨λ ν΄λΉλμ§ μμΌλ©΄, a + b + 5 μΈ κ°μ 리ν΄νλ€κ³ ν©μλ€.
μΈλ¨ TDDκ° μλ λ°©μμΌλ‘ μ½λλ₯Ό μμ±ν΄λ΄ μλ€.
func stringAdd(a:Int, b:Int) -> Int {
if(0 != a % 2 && 3 != a && 7 != a) {
return a + b
}
else if(0 == a % 2) {
return a * b
}
else if(0 == a % 3) {
return 3 + a * b
}
else if(0 == a % 7 && 0 == b % 8) {
return 7 * a + 8 * b
}
return a + b + 5
}
```