SOLID μμΉ
π« Solid
κ²¬κ³ νκ³ λ¨λ¨ν.
π« The SOLID principles
κ²¬κ³ νκ³ λ¨λ¨ν κ°μ²΄ μ§ν₯ μ€κ³μ 5κ°μ§ μμΉ.
S : Single Responsibility Principle λ¨μΌμ± μμμΉ O : Open-Closed Principle κ°λ°©-νμμ μμΉ L : Liskov Substitution Principle 리μ€μ½ν μΉν μμΉ I : Interface Segregation Principle μΈν°νμ΄μ€ λΆλ¦¬ μμΉ D : Dependency Inversion Principle μμ‘΄κ΄κ³ μμ μμΉ
π« S : Single Responsibility Principle | λ¨μΌμ± μμμΉ
𫧠νλμ ν΄λμ€λ νλμ μ± μ(λͺ©μ )λ§μ κ°μ§λ€
Like Unity Component, κ° μ»΄ν¬λνΈλ νλμ κΈ°λ₯λ§ κ°μ§λ€.
νλ μ΄μ΄μ Audio
, Input
, Movement
κΈ°λ₯μ Player
λΌλ νλμ ν΄λμ€λ‘ ν©μ³μ λ§λ€μ§ μλλ€.
PlayerAudio
, PlayerInput
, PlayerMovement
κ°κ°μ ν΄λμ€λ‘ λΆλ¦¬νμ¬ λ¨μΌ μ±
μμ κ°μ§κ² νλ€.
ν΄λμ€κ° μ 곡νλ λͺ¨λ κΈ°λ₯μ μ΄ μ± μκ³Ό λΆν©νλ€.
𫧠ν΄λμ€λ κ·Έ μ± μμ μμ ν μΊ‘μνν΄μΌ νλ€
ν΄λμ€λ₯Ό μμ νλ μ΄μ λ λ¨ νλμ μ΄μ μ¬μΌνλ€.
ν΄λμ€λ₯Ό μμ ν λ λ€λ₯Έ ν΄λμ€μ μν₯μ μ£Όμ§ μλλ‘, ν΄λμ€μ μ±
μμ λΆλ¦¬ν΄μΌνλ€.
𫧠S : Memo
- ν¨μλ λ§μ°¬κ°μ§
- νλμ ν¨μλ νλμ μ± μ(λͺ©μ )λ§μ κ°μ§λ€.
- ν΄λμ€ λΉ μ½λ κ°μ
- ν΄λμ€λ₯Ό λλκΈ° λλ¬Έμ, ν ν΄λμ€μ κΈΈμ΄κ° 짧μμ§λ€.
- ν΄λμ€ μμ‘΄μ± κ°μ
- ν΄λμ€κ° μμ λμ΄λ λ€λ₯Έ ν΄λμ€μ μν₯μ μ£Όμ§ μλλ€.
=>
- Readability (κ°λ
μ±)
- 짧μ ν΄λμ€κ° μ½κΈ° μ½λ€.
- Extensibility (νμ₯μ±)
- μμ ν΄λμ€λ‘λΆν° μμμ΄ μ½λ€.
- Reusability (μ¬μ¬μ©μ±)
- λΆλΆμμ μ¬μ¬μ©ν μ μλλ‘ μκ³ λͺ¨λμμΌλ‘ μ€κ³
- μ μ§λ³΄μμ± ν₯μ
π« O : Open-Closed Principle | κ°λ°©-νμμ μμΉ
ν΄λμ€ λ΄λΆ μμ μμ΄ λμμ νμ₯ν μ μμ΄μΌ νλ€.
𫧠νμ₯μλ μ΄λ¬μκ³
- λͺ¨λμ λμμ νμ₯ν μ μλ€λ κ²μ μλ―Έ
- μꡬ μ¬νμ΄ λ³κ²½λ λ, μλ‘μ΄ λμμ μΆκ°ν΄ λͺ¨λμ νμ₯
- μ¦, λͺ¨λμ΄ νλ μΌμ λ³κ²½ν μ μμ
𫧠μμ μλ λ«νμμ΄μΌνλ€
- μ½λλ₯Ό μμ νμ§ μμλ λͺ¨λμ κΈ°λ₯μ νμ₯νκ±°λ λ³κ²½ κ°λ₯
- λͺ¨λμ λΌμ΄λΈλ¬λ¦¬ (ex:DLL) μ μμ μ΄ νμ μμ
𫧠O : Memo
AreaCalculator
μμ μΌκ°ν
, μ¬κ°ν
μ λμ΄λ₯Ό κ³μ°νλ μ½λλ₯Ό μ§μ λ£κ² λλ©΄,
λμ€μ μ€κ°ν
, μ‘κ°ν
μ μΆκ°ν λ AreaCalculator
ν΄λμ€λ₯Ό μ§μ μμ ν΄μΌνλ€.
λμ CalculateArea()
μΆμ λ©μλλ₯Ό κ°μ§ Shape
μΆμ ν΄λμ€λ₯Ό λ§λ€κ³ ,
μΌκ°ν
, μ¬κ°ν
, μ€κ°ν
λ±μ ν΄λμ€μμ μ΄λ₯Ό μμλ°μ ꡬννλ€.
μ΄λ κ² νλ©΄ AreaCalculator
ν΄λμ€λ Shape.CalculateArea()
λ₯Ό μ΄μ©ν΄ λμ΄λ₯Ό κ³μ°νλ―λ‘,
μλ‘μ΄ λνμ΄ μΆκ°λμ΄λ AreaCalculator
ν΄λμ€λ₯Ό μ§μ μμ ν νμκ° μλ€.
=> μ½λλ₯Ό μ§μ μμ νμ§ μκ³ λ μλ‘μ΄ κΈ°λ₯μ μΆκ°ν μ μλ€.
π« L : Liskov Substitution Principle | 리μ€μ½ν μΉν μμΉ
𫧠νμ ν΄λμ€λ κΈ°λ³Έ ν΄λμ€λ₯Ό λ체ν μ μμ΄μΌ νλ€
(νμ, μμ, νμ) <-> (κΈ°μ‘΄, λΆλͺ¨, μμ)
- νμ ν΄λμ€λ κΈ°μ‘΄ ν΄λμ€λ₯Ό λ체ν μ μμ΄μΌ νλ€.
- μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ λ°©ν₯μ±μ μ μ§ν΄μΌ νλ€.
- μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ κΈ°λ₯μ νμλ‘νμ§ μκ±°λ μ κ±°νλ κ²½μ°, μ΄λ μμΉ μλ° (λ°©ν₯μ±μ λ°λ₯΄μ§ μμΌλ―λ‘)
λΆλͺ¨ ν΄λμ€λ₯Ό μμ ν΄λμ€λ‘ λ°κΏλ λμΌνκ² λμν΄μΌ νλ€.
- νμ ν΄λμ€λ₯Ό κ°λ ₯νκ³ μ μ°νκ² λ§λλ μμΉ
- OOPμ μμμ μ¬μ©νλ©΄ νμ ν΄λμ€λ₯Ό ν΅ν΄ κΈ°λ₯μ μΆκ°ν μ μμ
- κ·Έλ¬λ, μ£Όμνμ§ μμΌλ©΄ λΆνμν 볡μ‘μ±μ΄ λ°μ
𫧠μμ보λ€λ ꡬμ±
= μμ보λ€λ μΈν°νμ΄μ€λ₯Ό ꡬννλλ‘
= is-a 보λ€λ has-a
- ν΄λμ€ κ³μΈ΅ ꡬ쑰λ₯Ό μ€μ νκΈ° μ μ ν΄λμ€ APIλ₯Ό κ³ λ €
- νμ€μ λΆλ₯κ° νμ ν΄λμ€ κ³μΈ΅ κ΅¬μ‘°λ‘ λ³νλλ κ²μ μλ
- Ex: Carμ Trainμ΄ λ³λμ μμ ν΄λμ€μμ μμλ°λ κ²μ΄ λ ν©λ¦¬μ
- X :
Vehicle
(GoFoward
,Reverse
,TurnRight
,TurnLeft
) ->Car
,Train
- κΈ°μ°¨λ κΈΈμ λ°λΌ μμ§μ΄κΈ° λλ¬Έμ
TurnRight
,TurnLeft
κ° νμνμ§ μμ
- κΈ°μ°¨λ κΈΈμ λ°λΌ μμ§μ΄κΈ° λλ¬Έμ
- O :
IMovable
(GoFoward
,Reverse
),ITurnable
(TurnRight
,TurnLeft
)RoadVehicle
(IMovable
,ITurnable
) ->Car
RailVehicle
(IMovable
) ->Train
- X :
𫧠L : Memo
μΆμνλ₯Ό λ¨μνκ² μ μ§
- νμ ν΄λμ€μλ κΈ°λ³Έ ν΄λμ€μ νΌλΈλ¦ λ©€λ² μ‘΄μ¬
- μλΈν΄λμ±ν λ κΈ°λ₯μ μ κ±°νλ κ²½μ° λ¦¬μ€μ½νμΉνμμΉ μλ°°
- λΆλͺ¨ ν΄λμ€μ λ°©ν₯μ±μ λ°λ₯΄μ§ μλ κ²μ΄λ―λ‘
π« I : Interface Segregation Principle | μΈν°νμ΄μ€ λΆλ¦¬ μμΉ
νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€ μ¬λ¬ κ°κ° λ²μ© μΈν°νμ΄μ€ νλλ³΄λ€ λ«λ€.
ν° νλμ μΈν°νμ΄μ€λ³΄λ€ μͺΌκ°μ§ μμ μ¬λ¬ κ°μ μΈν°νμ΄μ€κ° μ’λ€.
- ν΄λΌμ΄μΈνΈκ° μμ μ΄ μ΄μ©νμ§ μλ λ©μλμ μμ‘΄νμ§ μμμΌ νλ€λ μμΉ
- ν° λ©μ΄λ¦¬μ μΈν°νμ΄μ€λ€μ ꡬ체μ μ΄κ³ μμ λ¨μλ‘ λΆλ¦¬
- ν΄λΌμ΄μΈνΈλ€μ΄ κΌ νμν λ©μλλ€λ§ μ΄μ©ν μ μκ² μΈν°νμ΄μ€λ₯Ό λΆλ¦¬ν΄μΌ νλ€.
- μμ€ν λ΄λΆ μμ‘΄μ±μ μ½ννκ³ μ μ°μ±μ κ°ν
π« D : Dependency Inversion Principle | μμ‘΄κ΄κ³ μμ μμΉ
κ°μ²΄ κ°μ μνΈμμ©μ μΆμνμ μμ‘΄ν΄μΌμ§, ꡬ체νμ μμ‘΄νλ©΄ μλλ€.
μμ‘΄μ± μ£Όμ μ μ΄ μμΉμ λ°λ₯΄λ λ°©λ² μ€ νλ
- μννΈμ¨μ΄ λͺ¨λλ€μ λΆλ¦¬νλ νΉμ νμ
- μμ(High-level) λͺ¨λμ νμ(Low-level) λͺ¨λμ κ²μ μ§μ κ°μ Έμ€λ©΄ μλ¨
- λ λ€ μΆμνμ μμ‘΄ν΄μΌ ν¨
- μΆμνλ μΈλΆ μ¬νμ μμ‘΄ν΄μλ μλ¨.
- μΈλΆ μ¬νμ΄ μΆμνμ μμ‘΄ν΄μΌ ν¨.
- ν΄λμ€κ° λ€λ₯Έ ν΄λμ€μ κ΄κ³κ° μμΌλ©΄ μλ¨
- ν΄λμ€κ° λ€λ₯Έ ν΄λμ€μ μλ λ°©μμ λ§μ΄ μκ³ μμΌλ©΄ μλ¨
- μ’ μμ±(dependency) λλ κ²°ν©(coupling) λ°μ
- μ’ μμ±μ μ΄λ μ μ¬μ μΈ μν
- X :
Switch
κ°Door
,Light
,Fan
μ λͺ¨λ μ§μ μ μ΄ (μμ‘΄)- λ€λ₯Έ κΈ°κΈ°κ° μΆκ°λλ©΄
Switch
λ₯Ό μμ ν΄μΌ ν¨
- λ€λ₯Έ κΈ°κΈ°κ° μΆκ°λλ©΄
- O :
Swtich
κ°ISwitchable
μ μ μ΄Door
,Light
,Fan
μ κ°κ°ISwitchable
μ ꡬν