OCP (Open Closed Principle)
Open and Closed
"Open for extension But, Closed for modification"
νμ₯μ λν΄μλ μ΄λ €μκ³ λ³κ²½μ λν΄μλ λ«νμμ΄μΌ νλ€.
μ¬κΈ°μμ "Open for extendsion" μ΄λ μλ‘μ΄ νμ μ μΆκ°ν¨μΌλ‘μ¨ μλ‘μ΄ κΈ°λ₯μ μΆκ°ν μ μλ€λ κ²μ μλ―Ένλ€.
κ·Έ λ€μ "Closed for modification" μ΄λ μ΄λ¬ν νμ₯μ΄ μΌμ΄λ λ μμ λ λ²¨μ΄ μν₯μ λ°μ§ λ§μμΌ νλ€λ κ²μ μλ―Ένλ€.
μ΄λ¬ν λ°©μμ μ μ€μνλ€λ©΄, μ΄λ€ λͺ¨λμ νμλ₯Ό μμ€μ½λμ λ³κ²½ μμ΄ μ½κ² λ³κ²½ν μ μλ€.
OCP Example
OCPλ₯Ό μ§ν€κΈ° μν΄μλ μΆμνμ μμ (Inversion)μ΄ νμνλ€.
insert abstract interface between copy and device
cause the inverted dependencies
Reader, Writerκ° μΆκ°λλ€κ³ Copy ν΄λμ€μ λ³κ²½μ΄ μΌμ΄λ κΉ?
λλ°μ΄μ€(Reader, Writer)κ° μΆκ°λλ©΄ ν΄λΉ λμλΉμ€λ₯Ό λ΄λΉνλ ν΄λμ€λ₯Ό μΆκ°νμ§λ§, copy λ‘μ§μ μμ μ μΌμ΄λμ§ μλλ€.
OCPκ° κ°λ₯ν κ²μΈκ°?
OCPλ₯Ό μ€μνλ©΄ λ³κ²½μ μλ²½νκ² μ κ±°ν μ μλκ°?
μ΄λ‘ μ μΌλ‘λ κ°λ₯νλ€.
νμ§λ§, μ€μ©μ μ΄μ§ μλ€.
2κ°μ§ λ¬Έμ μ
main partition
λ©μΈ ννΈμ κ²½μ° if-elseκ° μμ μ μλ€. μ€νλ§κ³Ό κ°μ΄ DI 컨ν μ΄λκ° μ‘΄μ¬νλ κ²½μ° λμ ν΄μ£ΌλκΉ λ°°μ νκ² λλ€.
Crystal ball problem (λ§λ²μ μμ κ΅¬μ¬ λ¬Έμ )
λλ λͺ¨λ₯΄λ κ²μ΄ λ§κΈ° λλ¬Έμ 미리 μΈν°νμ΄μ€λ₯Ό λ€ μ€λΉνλ λ°©μμ μ¬μ€μ λΆκ°λ₯νλ€.
νμ₯μ νμν λͺ¨λ κ²μ μΈν°νμ΄μ€ν νλ€λ©΄ κ΅μ₯ν 볡μ‘ν΄μ§ κ²μ΄λ€.
A Smelly Design
λΉμ©(Expense) λͺ©λ‘μ λ°νμΌλ‘ 리ν¬νΈλ₯Ό μΆλ ₯νλ λ©μλ
κ° λΉμ©μ μ’ λ₯μ κΈμ‘μ μΆλ ₯νλ©°, μμ¬ λΉμ©(BREAKFAST, DINNER)μ λ³λλ‘ μ§κ³
리ν¬νΈ νλ¨μ μμ¬ λΉμ© μ΄μ‘κ³Ό μ 체 λΉμ© μ΄μ‘μ μΆλ ₯
μ μ½λμ λ¬Έμ μ μ 무μμΌκΉ?
SRP μλ°
λ©μλ λ΄λΆμμ λΉμ¦λμ€ κ·μΉ, λ©μμ§ μμ±, ν¬λ§·ν κ³Ό κ°μ νλμ μ± μλ§μ κ°μ§κ³ μλ μνκ° μλ
OCP μλ°
λΉμ¦λμ€ κ·μΉμ νμ₯νλ €λ©΄ μμ μ΄ νμν μν
λν, λ©μμ§ μμ± λ° ν¬λ§·ν μ νμ₯νλ €λ©΄ μμ μ΄ νμν μν
Rigidity / Fragility / Immobility Problem
μ μ½λμμμ λ¬Έμ μ λ€μ λν΄μ λΆμν΄λ³΄μ.
κ²½μ§μ±(Rigidity)
μμ€ν μμ νλμ λ³κ²½μ΄ λͺ¨λ λ³κ²½μ μ λ°ν κ²½μ° κ²½μ§μ±μ΄ λλ€κ³ νλ€.
μμ¬ νμ (meal type)μ LUNCH, SNACK κ³Ό κ°μ νμ μ μΆκ°νλ€λ μꡬμ¬νμ λμνλ €λ©΄ μ΄λ»κ² ν΄μΌνλκ°?
Even though the design change is small, the impact is huge. So the system resist change. It's rigid.
μ€κ³ λ³κ²½μ μ¬μν΄ λ³΄μ΄μ§λ§, κ·Έ μν₯μ λ§€μ° ν½λλ€. κ·Έλμ μμ€ν μ λ³νμ μ νν©λλ€. μ΄κ²μ΄ κ²½μ§λ μνμ λλ€.
μ·¨μ½μ±(Fragility)
μμ€ν μμ νλμ λ³κ²½μΌλ‘ μΈν΄ μ 체μ μΌλ‘ μ·¨μ½ν λΆλΆμ΄ λ§μ΄ μκΈ°λ κ²μ λ§νλ€.
switchλ¬Έμ΄λ 쑰건문μΌλ‘ λλ κ²½μ°, λ³κ²½μ κ°ν λ λλ½λλ κ²μ΄ μλμ§, μλͺ» λ³κ²½ν κ²μ μλμ§ μ΄λ»κ² 체ν¬νμ§?
μ¦, Fan-out Problemμ κ°μ§κ³ μμΌλ©° Fragilityνλ€. λͺ¨λ Design smell μ€ Fragilityκ° κ°μ₯ λ¨Όμ μ κ±°ν΄μΌν λμμ΄λ€.
λΆλμ±(Immobility)
μμ€ν μ μ¬μ¬μ©μ±μ΄ λ¨μ΄μ§κ³ , μ½λμ λ³κ²½μ΄ μ΄λ €μ΄ κ²μ λ§νλ€.
κΈ°μ μ© μ루μ μ λ§μΆ°μ§ μμ€ν μ λλΆλΆμ κΈ°λ₯μ΄ νμνμ§ μλ μμ λΉμ¦λμ€ μμμΌλ‘ λΆλ¦¬ν μ μμκΉ?
The Lie
κ³ κ°μ΄ μ ν κ³ λ €νμ§ μμ μλ‘μ΄ κΈ°λ₯μ μꡬνλ©΄ λμ± μ΄ μλ€. λ§μΌ 미리 μκΈ°ν΄μ€¬λ€λ©΄ μΆμνλ₯Ό μ μ©νμ κ²μ΄λ€.
β κ·Έλ λ€λ©΄, OCPλ₯Ό μ€μνκΈ° μν΄μλ λ―Έλμ μ΄λ€ μΌ, μ΄λ€ νμ₯μ΄ νμνμ§ λ―Έλ¦¬ λ€ μμμΌ νλ€λ λ§μΈκ°?
μ°λ¦¬κ° μ무리 μ μ€λΉνκ³ μμΈ‘ν΄λ, κ³ κ°μ μ€λΉνμ§ λͺ»ν κ²μ λν κΈ°λ₯ μΆκ°/λ³κ²½μ μꡬνλ€.
β μ΄ κ²μ ν΄κ²°νκΈ° μν΄μ λ§λ²μ μμ ꡬμ¬(Crystal ball)μ΄ νμνκ±° μλκ°?
μ΄κ²μ΄ OCPμ λν λΉλ°μ΄λ€. μ°λ¦¬κ° λ―Έλλ₯Ό μμΈ‘ν μ μμ λλ§ ν΄λΉ κΈ°λ₯μ 보νΈν μ μλ€.
Two Solutions
μ°λ¦¬λ λ―Έλλ₯Ό μμΈ‘νμ§ λͺ»νλλ° μ΄λ»κ² OCPλ₯Ό μ§ν¬ μ μμκΉ?
Big Design Up Front(BDUF)
κ³Όλν μ€κ³λ₯Ό νλ κ²μ΄λ€. μ½λλ₯Ό ν μ€μ μμ±νκΈ° μ , μ€κ³λ₯Ό κ΅μ₯ν λ§μ΄ νλ λ°©λ²μ΄λ€.
ν΄κ²° λ°©λ²
κ³ κ°κ³Ό λ¬Έμ μμμ κ³ μ°°νλ©°, μꡬμ¬νμ μμΈ‘νμ¬ λλ©μΈ λͺ¨λΈμ λ§λ λ€.
OCPκ° κ°λ₯νλλ‘ λλ©μΈ λͺ¨λΈμ μΆμνλ₯Ό μ μ©νλ€.
λͺ¨λ κ²μ λν μ²μ¬μ§μ μ»μ λ κΉμ§ λ°λ³΅νλ€.
λ¬Έμ
νμμΉ μλ μΆμνλ‘ λλ°°λ λ§€μ° ν¬κ³ , 무κ²κ³ 볡μ‘ν μ€κ³κ° λμ΄λ²λ¦΄ μ μλ€.
μΆμνλ μ μ©νκ³ κ°λ ₯ν λ§νΌ λΉμ©λ ν¬λ€.
λ§μ κ³ κ°μ μ°λ¦¬κ° μΆμν ν΄λ Ό κ²μ λν λ³κ²½μ μμ²νμ§ μλλ€. μ¦, ν¨μ¨μ μΈ λ°©μμ΄ μλλ€!
Agile Design - μμ λ²
μ€μ©μ μ΄κ³ λ°μμ νλ λ°©λ²μΌλ‘ κ°μ₯ μ’μ μμλ²μ μμ λ²(λ©νν¬)μ΄λ€.
μμ λ²
μ΅λν 빨리 κ³ κ°μ μꡬμ¬νμ λμ΄λΌ μ μλ κ°μ₯ λ¨μν μΌμ νλ€.
κ·Έλ λ€λ©΄ κ³ κ°μ κ·Έ κ²°κ³Όλ¬Όμ λν΄ μꡬμ¬ν λ³κ²½μ μμνλ€.
λ°λΌμ, μ΄λ€ λ³κ²½μ΄ μꡬλλμ§ μκ²λλ€.
μ΄ λ΄μ©μΌλ‘ μ μ μλ κ²μ λ³νμ λν κ°μ₯ μ’μ μμΈ‘μ λ³νλ₯Ό κ²½ννλ κ²μ΄λΌλ κ²μ΄λ€.
λ¬Όλ‘ μ°λ¦¬λ BDUFμ Agile λ κ·Ήλ¨ μ¬μ΄μ μ΄μκ°λ€. BDUFλ νΌν΄μΌ νμ§λ§ No DUFλ νΌν΄μΌ νλ€! μμ€ν μ λν΄μ μ¬κ³ νκ³ Decoupled λͺ¨λΈμ μ¬μ μ μ€κ³νλ κ²μ λ§€μ° κ°μΉμλ μΌμ΄λ€.
μ 리 λ° ν΅μ¬
μ°λ¦¬λ μλ²½ν λ―Έλλ₯Ό μμΈ‘ν μ μλ€. 리ν©ν λ§μ ν΅ν΄μ μΆμννλ©° OCPλ₯Ό μ€μνλλ‘ νμ.
λ무 κΉμ μ€κ³κ° μλ, μ μ ν μμ€ν λͺ¨λΈμ λν μ¬μ μ€κ³λ₯Ό μ§ννμ.
Last updated
Was this helpful?