์ฝ์ ๋ ์ง : 2024.08.26
์ง์์ด : ๋ก๋ฒํธ C. ๋งํด
์ถํ์ฌ : ์ธ์ฌ์ดํธ
โ๏ธ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
์๋๋ฅผ ๋ถ๋ช ํ ํํํ๋ ํจ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
1. ์๊ฒ ๋ง๋ค์ด๋ผ
- ๊ธธ์ด๊ฐ ์งง์์๋ก ์ข๋ค.
2. ํ ๊ฐ์ง ์ผ๋ง ํด๋ผ
- ์๋ฏธ ์๋ ์ด๋ฆ์ผ๋ก ๋ค๋ฅธ ํจ์๋ฅผ ์ถ์ถํ ์ ์๋ค๋ฉด ๊ทธ ํจ์๋ ์ฌ๋ฌ ์์ ์ ํ๋ ์ ์ด๋ค.
3. ํ๋์ ํจ์ ๋ด์ ์ถ์ํ ์์ค์ ๋์ผํ๊ฒ ๋ง๋ค์ด๋ผ
- ์ฝ๋๋ ์์์ ์๋๋ก ์ด์ผ๊ธฐ์ฒ๋ผ ์ฝํ์ผ ํ๋ค.
- ์์์ ์๋๋ก ์ฝ์ ๋ ์ถ์ํ ์์ค์ด ํ ๋ฒ์ ํ ๋จ๊ณ์ฉ ๋ฎ์์ง๋ฉด ์ฝ๊ธฐ ์ฌ์์ง๋ค.
4. Switch ๋ฌธ์ ์ถ์ ํฉํ ๋ฆฌ์ ์จ๊ฒจ๋ผ
- ๊ฐ case ์กฐ๊ฑด์ ๋ํ ๊ตฌํ์ ์บก์ํํ๊ณ , ์ด๋ฅผ ์ถ์ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ์ ํํ ์ ์๋๋ก ํ๋ค.
5. ์์ ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํด๋ผ
- ๊ธธ๊ณ ์์ ์ ์ธ ์ด๋ฆ์ด ์งง๊ณ ์ด๋ ค์ด ์ด๋ฆ๋ณด๋ค ์ข๋ค.
- ์์ ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์ ๋จธ๋ฆฟ์์์๋ ์ค๊ณ๊ฐ ๋๋ ทํด์ง๋ฏ๋ก ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ฌ์์ง๋ค.
6. ์ด์์ ์ธ ํจ์ ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ 2๊ฐ ์ดํ [์ฐธ๊ณ ]
- ๋งค๊ฐ๋ณ์๋ก ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ง ๋ง์.
- ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์์ฒด๊ฐ ํจ์๊ฐ ํ ๊ฐ์ง ์ด์์ ์ญํ ์ ํ๊ณ ์๋ค๋ ๋ป์ด๋ค.
- boolean ๊ธฐ๋ฐ์ผ๋ก ํจ์๊ฐ ์คํ๋๋ ์ฝ๋๊ฐ ๋๋๋ค๋ฉด ํจ์๋ฅผ ๋ถ๋ฆฌํ์.
- ๋งค๊ฐ๋ณ์๊ฐ 2~3๊ฐ ํ์ํ๋ค๋ฉด ํด๋์ค ๋ณ์๋ก ์ ์ธํด ๊ฐ๋ ์ ๋ฌถ๋๋ค.
Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Pointer center, double radius);
- ๋งค๊ฐ๋ณ์๊ฐ 1๊ฐ์ธ ํจ์๋ ํจ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋์ฌ-๋ช
์ฌ ์์ ์ด๋ฃจ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.
- write(name) โก๏ธ writeField(name)
- ํจ์ ์ด๋ฆ์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ๋ฃ์ผ๋ฉด ๋งค๊ฐ๋ณ์ ์์๋ฅผ ๊ธฐ์ตํ์ง ์์๋ ๋ผ์ ์ดํดํ๊ธฐ ์ฝ๋ค.
- assertEquals(expected, actual) โก๏ธ assertExpectedEqualsActual(expected, actual)
7. ๋ถ์ ํจ๊ณผ๋ฅผ ์กฐ์ฌํด๋ผ
- ์์ธก ๊ฐ๋ฅํ๊ณ , ์ธ๋ถ ์ํ์ ์์กดํ์ง ์๋๋ก ํ๊ธฐ ์ํด ๋ค์์ ์กฐ์ฌํ์. [์ฐธ๊ณ 1] [์ฐธ๊ณ 2]
- ํจ์๋ก ๋์ด์จ ๋งค๊ฐ๋ณ์๋ฅผ ์์ ํ์ง ์๋๋ค.
- ํจ์ ๋ด๋ถ์์ ์ ์ญ ๋ณ์๋ฅผ ์์ ํ์ง ์๋๋ค.
// Bad
const addItemToCart = (cart, item) => {
cart.push({ item, date: Date.now() });
};
// Good
const addItemToCart = (cart, item) => {
return [...cart, { item, date : Date.now() }];
};
- ํน์ ์ํฉ์์๋ง ํธ์ถํ๊ฒ ๋์ง ์๋๋ก ํ ๊ฐ์ง ์ผ๋ง ์ํํ๊ฒ ํ๋ค.
- ์๋ฅผ ๋ค์ด checkPassword()๋ผ๋ ํจ์๊ฐ ์๋ค๋ฉด, ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ๊ณ true/false๋ฅผ ๋ฐํํ ๊ฒ์ ๊ธฐ๋ํ๋ค.
- ์ด์ธ์ ๋น๋ฐ๋ฒํธ๊ฐ ์ ํจํ ๊ฒฝ์ฐ ์ธ์ ์ ์ด๊ธฐํํ๋ ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด, ์ด๋ฆ๋ง ๋ณด๊ณ ํธ์ถํ์ ๋ ์ธ์ ์ด๊ธฐํ์ ๋ํ ๋ถ์ ํจ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
8. ๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํ๋ผ
- ํจ์๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ๋ณด๋ฅผ ๋ฐํํ๊ฑฐ๋ ๋ ์ค ํ๋๋ง ํด์ผ ํ๋ค.
9. ์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
- ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๋ฉด ํธ์ถ์๋ ์ค๋ฅ ์ฝ๋๋ฅผ ๊ณง๋ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
- ์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ์๋ ์ฝ๋์์ ๋ถ๋ฆฌ๋ ์ ์๋ค.
- ๊ทธ๋ฌ๋ try/catch ๋ธ๋ก์ ์ ์ ๋์๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ค์๋๋ค. ๋ณ๋์ ํจ์๋ก ์ถ์ถํ๋ฉด ๊ฐ๋ ์ฑ์ด ์ฌ๋ผ๊ฐ๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ๋ ํ ๊ฐ์ง ์์ ๋ง ํด์ผ ํ๋ค.
// Bad โ
if (deletePage(page) == E_OK) {
if (registry.deleteReference(page.name) == E_OK) {
if (configKeys.deleteKey(page.name.makeKey()) == E_OK) {
logger.log("page deleted");
} else {
logger.log("configKey not deleted");
}
} else {
logger.log("deleteReference from registry failed");
}
} else {
logger.log("delete failed");
return E_ERROR;
}
// Good โ
try {
deletePageAndAllReferences(page);
}
catch (Exception e) {
logError(e)
}
private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page);
registry.deleteReference(page.name);
configKey.deleteKey(page.name.makeKey());
}
private void logError(Exception e) {
logger.log(e.getMessage());
}
โ๏ธ ์ค๋ ์ฝ์ ์๊ฐ
'์ง์ง ๋ชฉํ๋ ์์คํ ์ด๋ผ๋ ์ด์ผ๊ธฐ๋ฅผ ํ์ด๋๊ฐ๋ ๋ฐ ์๋ค'๋ ๋ง์ด ํฌ๊ฒ ์๋ฟ์๋ค.
์์์ ์๋๋ก ์ด์ผ๊ธฐ์ฒ๋ผ ์ฝํ๋ฉด์, ํ ๊ฐ์ง ์ผ์ ์ ํด๋ด๋ ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๋ํ, ๋น์ฅ ํจ์๋ฅผ ๋ค ๋ถ๋ฆฌํด๋ด์ง ๋ชปํ๋๋ผ๋, ์ด๋ฆ์ ์๋ฏธ์๊ฒ ์ง๊ณ ํจ์์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ๋ง๋๋ ค๊ณ ํ๋ค๋ณด๋ฉด ๊ฐ๋ ์ฑ์ ์ ์ ๋ก ์ฌ๋ผ๊ฐ๋ค๋ ์ ์ ์ดํดํ๊ฒ ๋์๋ค.
โ๏ธ ๊ถ๊ธํ ๋ด์ฉ & ์ ์ดํด๋์ง ์๋ ๋ด์ฉ
SRP(Single Responsibility Principle)
- "ํ ๊ฐ์ง ์ด์ ๋ก๋ง ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค."
- ํด๋์ค๋ ๋ชจ๋์ ๋จ ํ๋์ ๋ณ๊ฒฝ ์ด์ ๋ง์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ฆ, ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ์ด์ ๋ ๋ฑ ํ๋์ฌ์ผ ํ๋ค.
- ์ฑ ์์ '์ ๋ณ๊ฒฝ๋๋๊ฐ'์ ๋ฐ๋ผ ๊ตฌ๋ถ๋์ด์ผ ํ๋ฉฐ, ๋ณ๊ฒฝ๋๋ ์ด์ ๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ํด๋์ค๊ฐ ์ฌ๋ฌ ๊ฐ์ ์ฑ ์์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๋จํ๋ค.
OCP(Open-Closed Principle)
- "์ํํธ์จ์ด์ ํ์ฅ์๋ ์ด๋ ค ์๊ณ , ์์ ์๋ ํ์์ ์ด์ด์ผ ํ๋ค."
- ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ๋์์ ์ถ๊ฐํ ๋์๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฅํ ์ ์์ด์ผ ํ๋ค. ๋ชจ๋์ด๋ ํด๋์ค๋ ์๋ก์ด ์๊ตฌ์ฌํญ์ด๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋์ ๋์ํ์ฌ ํ์ฅ ๊ฐ๋ฅํด์ผ ํ๋ค.
- OCP๋ ์ฃผ๋ก ๋คํ์ฑ์ ํ์ฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค. ์ฆ, ์ธํฐํ์ด์ค์ ์ถ์ํ๋ฅผ ํตํด ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋๋ก ์ค๊ณ๋์ด์ผ ํ๋ค.
์ถ์ ํฉํ ๋ฆฌ
- ๊ฐ์ฒด ์์ฑ์ ๊ด๋ จ๋ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ์ฌ ์ฌ๋ฌ ์ข ๋ฅ์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ก ํ๋ ๋์์ธ ํจํด. ๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ๊ด๋ จ๋ ์ฌ๋ฌ ์ข ๋ฅ์ ๊ฐ์ฒด๋ค์ ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
- ์ธ์ ์ฌ์ฉํ ๊น?
- ์ฌ๋ฌ ์ข ๋ฅ์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ ๋
- ๊ฐ์ฒด์ ์์ฑ๊ณผ ์กฐ๋ฆฝ์ด ์๋ก ๊ด๋ จ๋์ด ์์ ๋
- ๊ตฌ์ฑ ์์
- AbstractFactory : ๊ฐ์ฒด ์์ฑ์ ๊ด๋ จ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ์ฌ๋ฌ ์ข ๋ฅ์ "์์ฑ ๋ฉ์๋"๋ฅผ ์ ๊ณตํ๋ค.
- ConcreteFactory : AbstractFactory๋ฅผ ๊ตฌํํ ํด๋์ค. ํน์ ํ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฑ ์์ด ์๋ค.
- AbstractProduct : ์์ฑ๋๋ ๊ฐ์ฒด๋ค์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค. ์ฌ๋ฌ ์ข ๋ฅ์ ์ ํ์ ๋ํ ๊ณตํต์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
- ConcreteProduct : AbstractProduct๋ฅผ ๊ตฌํํ ํด๋์ค. ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด์ ์์ฑ๊ณผ ๊ตฌํ์ ๋ด๋นํ๋ค.
- Client : ์ถ์ ํฉํ ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋. ํด๋ผ์ด์ธํธ๋ ๊ตฌ์ฒด์ ์ธ ํฉํ ๋ฆฌ์ ์ ํ ํด๋์ค๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค.
๋ช ๋ น / ์กฐํ ๋ถ๋ฆฌ(Command Query Separation, CQS)
- ํจ์๋ ๋ช ๋ น(command) ๋๋ ์กฐํ(query) ์ค ํ๋๋ง ์ํํด์ผ ํ๋ค๋ ์์น.
- command๋ ์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ ์ํํ๊ณ , query๋ ์์คํ ์ ์ํ๋ฅผ ์ฝ๊ณ ๋ฐํํ๋ ์์ ์ ์ํํ๋ค.
- ํจ์์ ์๋๊ฐ ๋ช ํํด์ง๋ฏ๋ก ๊ฐ๋ ์ฑ์ ์ฌ๋ผ๊ฐ์ง๋ง, ์์ ๊ท๋ชจ์ ํ๋ก๊ทธ๋จ์์๋ ์ค๋ฒ ์์ง๋์ด๋ง์ด ๋ ์ ์๋ค.
- CQS(Command Query Separation) vs CQRS(Command Query Responsibility Segregation)
- CQS๋ ํจ์ ๋ ๋ฒจ์์ ์ ์ฉํ๋ ์์น์ด๊ณ , CQRS๋ ์์คํ ์ฐจ์์์ ๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํ๋ ์ํคํ ์ฒ๋ฅผ ์๋ฏธํ๋ค.
- ๋ ๋ค ์์ ๊ท๋ชจ์ ํ๋ก๊ทธ๋จ, ์์คํ ์์ ์ค๋ฒ์์ง๋์ด๋ง์ด ๋ ์ ์๋ค.
AOP(Aspect Oriented Programming)
- ์ฝ๋์ ํก๋จ ๊ด์ฌ์ฌ(cross-cutting concerns)๋ฅผ ๋ชจ๋ํํ๊ณ ๋ถ๋ฆฌํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์ ์ค ํ๋์ด๋ค.
- ํก๋จ ๊ด์ฌ์ฌ๋ ์ฌ๋ฌ ๋ชจ๋์ด๋ ํด๋์ค์ ์ํฅ์ ๋ฏธ์น๋ ๊ณตํต์ ์ธ ๋ถ๋ถ(e.g. ๋ก๊น , ๋ณด์, ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฑ)์ ๋งํ๋ค.
- Spring์์๋ AOP, AspectJ ๋ฑ์ AOP ํ๋ ์์ํฌ๊ฐ ์๊ณ , NestJS์์๋ Interceptor, Custom Decorator ๋ฑ์ด ์๋ค.
- ํด๋ฆฐ ์ฝ๋ ์ฑ ์์๋ ์ค๋ณต์ ์์ ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์ธ๊ธ๋์๋ค.
COP(Component Oriented Programming)
- ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ฑํ๋ ์ฃผ์ ๋จ์๋ฅผ "์ปดํฌ๋ํธ"๋ก ๋ณด๊ณ , ์ด๋ฌํ ์ปดํฌ๋ํธ๋ค์ ์กฐ๋ฆฝํ์ฌ ์ ์ฒด ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด๋ค.
- ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ๋ ์ ์๋ ๋จ์์ด๋ค.
โ๏ธ ์ฐธ๊ณ
๐ ์ถ์ ํฉํ ๋ฆฌ(Abstract Factory) ํจํด - ์๋ฒฝ ๋ง์คํฐํ๊ธฐ
๋ช ๋ น-์กฐํ-๋ถ๋ฆฌ(CQS)- ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ ๋์์ธ ํจํด
'์ฑ ๋ฆฌ๋ทฐ > ํด๋ฆฐ์ฝ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํด๋ฆฐ์ฝ๋] 6. ๊ฐ์ฒด์ ์๋ฃ ๊ตฌ์กฐ (0) | 2024.09.04 |
---|---|
[ํด๋ฆฐ์ฝ๋] 5. ํ์ ๋ง์ถ๊ธฐ (0) | 2024.08.29 |
[ํด๋ฆฐ์ฝ๋] 4. ์ฃผ์ (0) | 2024.08.27 |
[ํด๋ฆฐ์ฝ๋] 2. ์๋ฏธ ์๋ ์ด๋ฆ (0) | 2024.08.19 |
[ํด๋ฆฐ์ฝ๋] 1. ๊นจ๋ํ ์ฝ๋ (0) | 2024.08.14 |