# An overview of design pattern - SOLID, GRASP
๋จผ์ ๋์์ธ ํจํด์ ๊ณต๋ถํ๊ธฐ ์ ์ Design Principle์ธ SOLID์ GRASP์ ๋ํด์ ์์๋ณด์
# Design Smells
design smell์ด๋ ๋์ ๋์์ธ์ ๋ํ๋ด๋ ์ฆ์๊ฐ์ ๊ฒ์ด๋ค.
์๋ 4๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
Rigidity(๊ฒฝ์ง์ฑ)
์์คํ ์ด ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ต๋ค. ํ๋์ ๋ณ๊ฒฝ์ ์ํด์ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ณ๊ฒฝ ํด์ผํ ๋ ๊ฒฝ์ง์ฑ์ด ๋๋ค. ๊ฒฝ์ง์ฑ์ด ๋๋ค๋ฉด non-criticalํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๊ด๋ฆฌ์๋ ๊ฐ๋ฐ์์๊ฒ ์์ ์ ์์ฒญํ๊ธฐ๊ฐ ๋๋ ค์์ง๋ค.Fragility(์ทจ์ฝ์ฑ)
์ทจ์ฝ์ฑ์ด ๋๋ค๋ฉด ์์คํ ์ ์ด๋ค ๋ถ๋ถ์ ์์ ํ์๋๋ฐ ๊ด๋ จ์ด ์๋ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ค๋ค. ์์ ์ฌํญ์ด ๊ด๋ จ๋์ง ์์ ๋ถ๋ถ์๋ ์ํฅ์ ๋ผ์น๊ธฐ ๋๋ฌธ์ ๊ด๋ฆฌํ๋ ๋น์ฉ์ด ์ปค์ง๋ฉฐ ์์คํ ์ credibility ๋ํ ์๋๋ค.Immobility(๋ถ๋์ฑ)
๋ถ๋์ฑ์ด ๋๋ค๋ฉด ์ฌ์ฌ์ฉํ๊ธฐ ์ํด์ ์์คํ ์ ๋ถ๋ฆฌํด์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ด๋ ต๋ค. ์ฃผ๋ก ๊ฐ๋ฐ์๊ฐ ์ด์ ์ ๊ตฌํ๋์๋ ๋ชจ๋๊ณผ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ๋ชจ๋์ ๋ง๋ค๋ ค๊ณ ํ ๋ ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ๋ค.Viscosity(์ ์ฐฉ์ฑ)
์ ์ฐฉ์ฑ์ ๋์์ธ ์ ์ฐฉ์ฑ๊ณผ ํ๊ฒฝ ์ ์ฐฉ์ฑ์ผ๋ก ๋๋ ์ ์๋ค.์์คํ ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ํต์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๋ฉด ๋์์ธ ์ ์ฐฉ์ฑ์ด ๋๋ค๊ณ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์์ ์ด ํ์ํ ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ ํ ์ ์์ ๊ฒ์ด๋ค. ์ด๋ค ๊ฒ์ ๋์์ธ์ ์ ์งํ๋ ๊ฒ์ด๊ณ ์ด๋ค ๊ฒ์ ๊ทธ๋ ์ง ๋ชปํ ๊ฒ์ด๋ค(ํต์ ์ถ๊ฐ).
ํ๊ฒฝ ์ ์ฐฉ์ฑ์ ๊ฐ๋ฐํ๊ฒฝ์ด ๋๋ฆฌ๊ณ ํจ์จ์ ์ด์ง ๋ชปํ ๋ ๋ํ๋๋ค. ์๋ฅผ๋ค๋ฉด ์ปดํ์ผ ์๊ฐ์ด ๋งค์ฐ ๊ธธ๋ค๋ฉด ํฐ ๊ท๋ชจ์ ์์ ์ด ํ์ํ๋๋ผ๋ ๊ฐ๋ฐ์๋ recompile ์๊ฐ์ด ๊ธธ๊ธฐ ๋๋ฌธ์ ์์ ๊ท๋ชจ์ ์์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ค๊ณ ํ ๊ฒ์ด๋ค.
์์ design smell์ ๊ณง ๋์ ๋์์ธ์ ์๋ฏธํ๋ค.(์คํ๊ฒํฐ ์ฝ๋)
# Robert C. Martin's Software design principles(SOLID)
Robejt C. Martin์ 5๊ฐ์ง Software design principles์ ์ ์ํ์๊ณ ์๊ธ์๋ฅผ ๋ฐ์ SOLID๋ผ๊ณ ๋ถ๋ฅธ๋ค.
# Single Responsibility Principle(SRP)
A class should have one, and only one, reason to change
ํด๋์ค๋ ์ค์ง ํ๋์ ์ด์ ๋ก ์์ ์ด ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
# Example
SRP๋ฅผ ์๋ฐํ๋ ์์ ๋ก ์๋ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ๋ณด์
Register ํด๋์ค๊ฐ Student ํด๋์ค์ dependency๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ชจ์ต์ด๋ค. ๋ง์ฝ ์ฌ๊ธฐ์ ์ด๋ค ํด๋์ค๊ฐ Student๋ฅผ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ฌ์ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ๊ตฌํ ํ ์ ์๋ค.
ํ์ง๋ง Register ํด๋์ค๋ ์ด๋ ํ ๋ณ๊ฒฝ๋ ์ผ์ด๋์ผํ์ง ์์ง๋ง Student ํด๋์ค๊ฐ ๋ฐ๋์ด์ Register ํด๋์ค๊ฐ ์ํฅ์ ๋ฐ๋๋ค. ์ ๋ ฌ์ ์ํ ๋ณ๊ฒฝ์ด ๊ด๋ จ์๋ Reigster ํด๋์ค์ ์ํฅ์ ๋ผ์ณค๊ธฐ ๋๋ฌธ์ SRP๋ฅผ ์๋ฐํ๋ค.
์์ ๊ทธ๋ฆผ์ SRP ์๋ฐ์ ํด๊ฒฐํ๊ธฐ ์ํ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ด๋ค. ๊ฐ๊ฐ์ ์ ๋ ฌ ๋ฐฉ์์ ๊ฐ์ง ํด๋์ค๋ฅผ ์๋ก ์์ฑํ๊ณ Client๋ ์๋ก ์๊ธด ํด๋์ค๋ฅผ ํธ์ถํ๋ค.
# ๊ด๋ จ ์ธก์ ํญ๋ชฉ
SRP๋ ๊ฐ์ ๋ชฉ์ ์ผ๋ก responsibility๋ฅผ ๊ฐ์ง๋ cohesion๊ณผ ๊ด๋ จ์ด ๊น๋ค.
# Open Closed Principle(OCP)
Software entities (classes, modules, functions, etc) should be open for extension but closed for modification
์์ ์ ํ์ฅ์๋ ์ด๋ ค์๊ณ ์ฃผ๋ณ์ ๋ณํ์๋ ๋ซํ ์์ด์ผ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
# Example
void incAll(Employee[] emps) {
for (int i=0; i<emps.size(); i++) {
if(emps[i].empType == FACULTY)
incFacultySalary((FACULTY)emps[i])
else if(emps[i].empType == STAFF)
incStaffSalary((STAFF)emps[i])
else if(emps[i].empType == SECRETARY)
incSecretarySalary((SECRETARY)emps[i])
}
}
์์ ์์ ๋ ์๋ ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
Rigid - ์๋ก์ด employee type์ด ๊ณ์ ์๊ตฌ๋๋ค.
Fragile - ๋ง์ if/lese ๊ตฌ๋ฌธ๊ณผ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ต๋ค
์ด์ ์ ์ค๋ช ํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ด๋ค.
incAll() ํจ์๋ฅผ ํตํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋ณผ ์ ์๋ค.
# Liskov Substitution Principle(LSP)
subtypes must be substitutable for their base types
base ํด๋์ค์์ ํ์๋ ํด๋์ค๋ base ํด๋์ค๋ฅผ ๋์ฒดํด์ ์ฌ์ฉํ ์ ์์ด์ผํ๋ค.
# Example
์๋๋ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Date ํด๋์ค์ด๋ค.
java.util.Date date = new java.util.Date();
int dateValue = date.getDate(); // Okay
date = new java.sql.Time(10,10,10);
dataValue = date.getDate(); // throws IllegalArgumentException
# Inheritance Vs. Composition
์์ ์์ ์ ๋ง์ฝ List์ Implemenation์ ์ฌ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด inheritance๋ณด๋ค object composition์ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
์์์ Queue ํด๋์ค๊ฐ List ํด๋์ค๋ฅผ inheritance ํ๋ค๋ฉด LSP๋ฅผ ์๋ฐํ๊ฒ ๋๋ค.
# Interface Segregation Principle(ISP)
Clients should not be forced to depend on methods they do not use
์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กดํ๋ฉด ์๋๋ค.
Roast Application์ getName(), getSSN() ๋ฉ์๋๋ง์ ์ฌ์ฉํ๊ณ Account Application์ getInvoice(), postPayment() ๋ฉ์๋๋ง์ ์ฌ์ฉํ๋ค.
์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ ์ฒ๋ผ ํด๋์ค์ ๋ง๋ interface๋ฅผ ๋ง๋ค์ด์ ์ ๊ณตํ๋ฉด ISP ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
# Dependency Inversion Principle(DIP)
high-level modules should not depend on low-level modules. Both should depend on abstractions
์์ (high level module)๋ณด๋ค ๋ณํ๊ธฐ ์ฌ์ด ๋ชจ๋(low level modeul)์ ์์กดํด์๋ ์๋๋ค.
# Inversion?
Program ํด๋์ค๋ Module ํด๋์ค์ dependency๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ Module ํด๋์ค๋ Function ํด๋์ค์ ์์กดํ๊ณ ์๋ค.
Module ํด๋์ค๋ฅผ ์ธํฐํ์ด์ค ํด๋์ค๋ก ๋ณ๊ฒฝ์ ํ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ด๋ค. ์ด์ ๊ทธ๋ฆผ๊ณผ ๋ค๋ฅด๊ฒ depenedency๊ฐ inversion ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
DIP๋ dependency๋ฅผ inversion ํ๋ ๊ฒ ๋ฟ ์๋๋ผ ownership ๋ํ inversion ํ๋ค.