π Chapter 2: κ°μ²΄λ₯Ό νμ©ν ν μ€νΈ μ£Όλ κ°λ°
π κ°μ²΄ λ§β
- κ°μ²΄ μ§ν₯ μ€κ³λ κ°μ²΄ μμ²΄λ³΄λ€ κ°μ²΄ κ°μ μμ¬μν΅μ λ μ§μ€νλ€.
- κ°μ²΄λ λ©μμ§λ‘ μμ¬μν΅νλ€. μ¦, κ°μ²΄λ λ€λ₯Έ κ°μ²΄μ λ©μμ§λ₯Ό μ£Όκ³ λ°μΌλ©΄μ λ°μνλ€.
- κ°μ²΄μλ μμ μ΄ μ΄ν΄ν μ μλ λͺ¨λ μ νμ λ©μμ§λ₯Ό μ²λ¦¬νλ λ©μλκ° μμΌλ©°, λλΆλΆ λ€λ₯Έ κ°μ²΄μ μμ¬μν΅μ μ‘°μ¨νλ λ° μ¬μ©νλ λ΄λΆ μνλ₯Ό μΊ‘μννλ€.
- κ°μ²΄ ꡬμ±μ κ΄λ¦¬ν λͺ©μ μΌλ‘ μμ±νλ μ½λλ₯Ό κ°μ²΄λ§μ νμμ λν μ μΈμ (declarative) μ μλΌ νλ€. μμ€ν μ μ΄λ° μμΌλ‘ ꡬμΆνλ©΄ λ°©λ²μ΄ μλλΌ λͺ©μ μ μ§μ€ν μ μμ΄ μμ€ν μ νμλ₯Ό λ³κ²½νκΈ°κ° μ½λ€.
π κ°κ³Ό κ°μ²΄β
- μμ€ν μ μ€κ³ν λλ κ°κ³Ό κ°μ²΄λ₯Ό ꡬλΆλλ κ²μ΄ μ€μνλ€. κ°μ λ³νμ§ μλ μμ΄λ ν¬κΈ°λ₯Ό λνλ΄λ©°, κ°μ²΄λ μκ°μ΄ μ§λ¨μ λ°λΌ μνκ° λ³ν μ§λ λͺ¨λ₯΄μ§λ§ μλ³μκ° μλ κ³μ° μ μ°¨λ₯Ό λνλΈλ€.
- κ°μ μμ΄ κ³ μ λ λΆλ³ μΈμ€ν΄μ€λ€. κ°μ κ°λ³μ μΈ μλ³μκ° μμΌλ―λ‘ λ κ° μΈμ€ν΄μ€μ μνκ° κ°λ€λ©΄ μ¬μ€μ λμΌν μ μ΄λ€. λ°λΌμ λ κ°μ μλ³μλ₯Ό λΉκ΅νλ κ²μ μ μ νμ§ μλ€.
- κ°μ²΄λ λ³κ²½ κ°λ₯ν μνλ₯Ό μ΄μ©ν΄ μκ°μ μΆμ΄μ λ°λ₯Έ κ°μ²΄μ νμλ₯Ό λνλΈλ€. νμ μ΄ λκ°μ λ κ°μ²΄λ νμ¬ μνκ° μ νν λμΌνλλΌλ λ³κ°μ μλ³μλ₯Ό μ§λλ€. μ΄λ λ κ°μ²΄κ° ν₯ν μ΄λ€ λ©μμ§λ₯Ό μ λ¬λ°λλμ λ°λΌ μνκ° λ¬λΌμ§ μ μκΈ° λλ¬Έμ΄λ€.
π λ©μμ§λ₯Ό λ°λ₯΄λΌβ
- λ€λ₯Έ κ°μ²΄μ μ½κ² κ΄κ³λ₯Ό λ§Ίμ μ μκ² κ°μ²΄λ₯Ό μ€κ³νκΈ°λ§ νλ€λ©΄ κ³ μμ€μ μ μΈμ μ κ·Όλ²μ΄ μ£Όλ ννμ λ릴 μ μλ€.
- μμ¬μν΅ ν¨ν΄μ κ°μ²΄λ€μ΄ λ€λ₯Έ κ°μ²΄μ μνΈ μμ©νλ λ°©λ²μ κ³Όμ₯νλ κ°μ’ κ·μΉμΌλ‘ ꡬμ±λΌ μλ€. μλ° κ°μ μΈμ΄μμλ ν΄λμ€ λμ μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄ κ°μ²΄μ μν μ νμ νλ€.
- κ°μ²΄λ μν μ νλ μ΄μ ꡬνν κ²μ΄λ©°, μν μ κ΄λ ¨λ μ± μμ μ§ν©μ΄λ©°, μ± μμ μ΄λ€ κ³Όμ μ μννκ±°λ μ 보λ₯Ό μμμΌν μ무λ₯Ό λ§νλ€. νλ ₯μ κ°μ²΄λ μν μ μνΈ μμ©μ ν΄λΉνλ€.
π λ¬»μ§ λ§κ³ λ§νλΌβ
- κ°μ²΄λ₯Ό νΈμΆν λ μ΄μ κ°μ²΄κ° νλ μν μΈ‘λ©΄μμ ν΄λΉ κ°μ²΄κ° 무μμ μνλμ§ κΈ°μ νκ³ , νΈμΆλ κ°μ²΄κ° κ·Έλ¬ν λ°λ₯Ό μ΄λ»κ² μ€νν μ§ κ²°μ νκ² ν΄μΌ νλ€. μ΄κ²μ νν λ¬»μ§ λ§κ³ λ§νλΌ μ€νμΌμ΄λ λλ―Έν°μ λ²μΉμΌλ‘ μ λ €μ Έ μλ€. κ°μ²΄λ κ·Έκ²μ΄ λ΄λΆμ μΌλ‘ 보μ νκ³ μκ±°λ λ©μμ§λ₯Ό ν΅ν΄ ν보ν μ λ³΄λ§ κ°μ§κ³ μμ¬ κ²°μ μ λ΄λ €μΌ νλ€. κ°μ²΄λ λ€λ₯Έ κ°μ²΄λ₯Ό νμν΄ λκ°λ₯Ό μΌμ΄λκ² ν΄μλ μ λλ€.
- μ΄ μ€νμΌμ λ°λ₯΄μ§ μμΌλ©΄ μ΄μ°¨ μ 볡(κΈ°μ°¨ μΆ©λ, train wreck) μ½λλΌκ³ μλ €μ§ μ½λκ° λ§λ€μ΄μ§λ€.
// κΈ°μ°¨ μΆ©λ μ½λ μ
((EditSaveCustomizer) master.getModelisable()
.getDockablePanel()
.getCustomizer())
.getSaveItem().setEnabled(Boolean.FALSE.booleanValue());
- μλ γ λκ° λ€μκ³Ό κ°μ μ½λλ₯Ό μλ―Ένλ€λ μ¬μ€μ κΉ¨λ¬μλ€.
master.allowSavingOfCustomisations();
- μ΄λ κ² νλ©΄ λͺ¨λ ꡬν μΈλΆ μ¬νμ΄ λ©μλ νΈμΆ ν λ²μΌλ‘ μ€μ΄λ λ€.
master
λ₯Ό μ΄μ©νλ μͺ½μμλ λ©μλλ₯Ό μ°μ΄μ΄ νΈμΆν λ λ°νλλ κ°μ²΄μ νμ μ κ΄ν΄ λλ μ νμκ° μλ€. μμΈλ¬ μ€κ³ λ³κ²½μ΄ μ½λ κΈ°λ°μ ꡬμꡬμ μν₯μ λΌμΉλ μνλ μ€μλ€. - μ΄ μμΉ λλΆμ μ κ·Όμ λ©μλ μ°μ΄μ΄ νΈμΆλλλ‘ μμμ μΌλ‘ λ기보λ€λ κ°μ²΄ κ°μ μνΈ μμ©μ λͺ μμ μΌλ‘ λ§λ€κ³ κ±°κΈ°μ μ΄λ¦μ λΆμ¬νκ² λ λ€.
- 짧μ ννλ λ¨μν ꡬν λ°©μμ΄ μλ μ½λμ λͺ©μ μΌλ‘ ν¨μ¬ λ λͺ ννκ² λλ¬λΈλ€.
π κ·Έλλ κ°λμ λ¬Όμ΄λΌβ
- κ°κ³Ό 컬λ μ μΌλ‘λΆν° μ 보λ₯Ό κ°μ Έμ€κ±°λ ν©ν°λ¦¬λ₯Ό μ΄μ©ν΄ μ κ°μ²΄λ₯Ό μμ±ν λλ 묻λλ€.
- μλ₯Ό λ€μ΄ μ 체 μ’μμ λμμΌλ‘ μμ½μμ κ³ λ₯΄κ² λ°°λΆνκ³ λ§ μΆλ€λ©΄ λ€μκ³Ό κ°μ μ½λλ‘ μμν μ§λ λͺ¨λ₯Έλ€.
public class Train {
private final List<Carriage> carriages [...]
private int percentReservedBarrier = 70;
public void reserveSeats(ReservationRequest request) {
for(Carriage carriage: carriages) {
if (carriage.getSeats().getPercentReserved() < percentReservedBarrier) {
request.reserveSeatsIn(carriage);
return;
}
request.cannotFindSeats();
}
}
}
- μ¬κΈ°μ
Carriage
μ λ΄λΆ ꡬ쑰λ₯Ό λ ΈμΆν΄μλ μ λλλ°, μ΄λ κΈ°μ°¨ μμ λ€μν μ νμ κ°μ°¨κ° μκΈ° λλ¬Έλ§μ μλλ°, λμ μ€μ€λ‘ λ΅μ κ°λ νλ λ° λμμ΄ λλ μ 보λ₯Ό 묻기보λ€λ μ§μ λ΅νκ³ μ νλ μ§λ¬Έμ λμ ΈμΌ νλ€.
public void reserveSeats(ReservationRequest request) {
for(Carriage carriage: carriages) {
if(carriage.hasSeatsAvailableWithin(percentReservedBarrier)) {
request.reserveSeatsIn(carriage);
return;
}
}
request.cannotFindSeats();
}
- μ§μ λ©μλλ₯Ό μΆκ°νλ©΄ κ°μ₯ μ μ ν κ°μ²΄μ νμκ° μ리 μ‘μ νμμ μ΄ν΄νκΈ° μ¬μ΄ μ΄λ¦μ΄ μκΈ°κ³ ν μ€νΈνκΈ°κ° μ¬μμ§λ€.
π νλ ₯ κ°μ²΄μ λ¨μ ν μ€νΈβ
- μ΄λ»κ² κ°μ²΄μ λ΄λΆ μνλ₯Ό λλ¬λ΄μ§ μκ³ κ°μ²΄λ₯Ό νΈμΆν λ μ΄μ κ°μ²΄μ λ©μμ§λ₯Ό λ³΄λΌ μ μμκΉ?
- ν κ°μ§ λ°©λ²μ ν μ€νΈμ μ‘΄μ¬νλ λμ κ°μ²΄μ μ΄μμ λ€λ₯Έ λ체물, μ¦ λͺ© κ°μ²΄(mock object)λ‘ λ체νλ κ²μ΄λ€. κ·Έλ κ² νλ©΄ λ°μνλ μ΄λ²€νΈμ λν΄ λμ κ°μ²΄κ° κ°μ§ μ΄μκ³Ό μ΄λ»κ² μνΈ μμ©ν μ§ μ§μ ν μ μλ€. μ΄ κ°μ λͺ μΈλ₯Ό μμ ꡬ문μ΄λΌ νλ€. ν μ€νΈκ° μ§νλλ λμ λͺ© κ°μ²΄λ μμλ μμλλ‘ νΈμΆλλμ§ λ¨μ νλ€.
- ν μ€νΈλ₯Ό μ΄μ©νλ©΄ κ°μ²΄μ νμν 보쑰 μν μ νμ νλ λ° λμμ΄ λλ©°, μ΄λ¬ν 보쑰 μν μ μλ° μΈν°νμ΄μ€λ‘ μ μλΌ μκ³ μμ€ν μ λλ¨Έμ§ λΆλΆμ κ°λ°ν λ μ€μ ꡬνμ²λΌ λμνλ€. μ΄λ₯Ό μ°λ¦¬λ μΈν°νμ΄μ€ λ°κ²¬μ΄λΌκ³ νλ€.
π λͺ© κ°μ²΄λ₯Ό νμ©ν TDD μ§μβ
- μ΄ κ°μ μ νμ ν μ€νΈ μ£Όλ νλ‘κ·Έλλ°μ μ§μνλ €λ©΄ μ΄μνλ κ°μ²΄μ λͺ© μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , ν΄λΉ λͺ© μΈμ€ν΄μ€λ₯Ό μ΄λ»κ² νΈμΆνκ³ μνλ₯Ό κ²μ¬νλκ°μ κ΄ν μμ ꡬ문μ μ μν λ€μ, ν μ€νΈλ₯Ό ν λ μ€ν ννλ‘ λμν νμκ° μλ νμλ₯Ό ꡬνν΄μΌ νλ€.
- ν
μ€νΈμ ν΅μ¬ ꡬ쑰λ λ€μκ³Ό κ°λ€.
- νμν λͺ© κ°μ²΄ μμ±
- λμ κ°μ²΄λ₯Ό ν¬ν¨ν μ€μ κ°μ²΄ μμ±
- λμ κ°μ²΄μμ λͺ© κ°μ²΄κ° μ΄λ»κ² νΈμΆλ μ§ μμνλ λ°λ₯Ό κΈ°μ
- λμ κ°μ²΄μμ μ λ° λ©μλλ₯Ό νΈμΆ
- κ²°κ³Ό κ°μ΄ μ ν¨νκ³ μμλλ λ©μλ νΈμΆμ΄ λͺ¨λ μΌμ΄λ¬λμ§ νμΈ
- λ¨μ ν μ€νΈλ κ·Έκ³³μ μλ λͺ¨λ κ°μ²΄λ₯Ό μμ±νκ³ λμ κ°μ²΄μ ν΄λΉ κ°μ²΄μ νλ ₯μ μ¬μ΄μ μνΈ μμ©μ κ΄ν λ¨μ μ λ§λ€μ΄ λΈλ€.
- λͺ¨λ ν μ€νΈ μλλ₯Ό λͺ ννκ² ν΄μ ν μ€νΈλ₯Ό κ±°μΉ κΈ°λ₯κ³Ό 보쑰 μν μ λ΄λΉνλ κΈ°λ° κ΅¬μ‘°, κ°μ²΄ ꡬ쑰λ₯Ό μλ‘ κ΅¬λΆν΄μΌ νλ€.