์ ๋ฒ ํฌ์คํ
์์๋ก ๋์๊ฐ๋ณด์.
ํ๋ก ํธ์๋ ์์๋ก ์ดํด๋ณด๋ SOLID์์น 1)๋จ์ผ ์ฑ
์ ์์น
์ด๋ฒ์๋ ๊ณ ์์ด์ ์ข ๋ฅ๋ฅผ ๋ค์ํ๊ฒ ํด๋ฌ๋ผ๋ ์๊ตฌ๊ฐ ๋ค์ด์๋ค.
๊ทธ๋ฅ ๊ณ ์์ด ์ธ์๋ ๋ฌ์์ ๋ธ๋ฃจ, ์ฝ๋ฆฌ์ ์ํค์ด, ๋ฒต๊ฐ ๊ณ ์์ด, ๋ ธ๋ฅด์จ์ด ์ฒ ์ด๋ ๊ฒ 4๊ฐ์ง ์ข ๋ฅ์ ๊ณ ์์ด๊ฐ ์ถ๊ฐ๋๋ฉด ์ข๊ฒ ์ด์. ๋ค๋ฅธ ์ข ๋ฅ ๊ณ ์์ด๋ ์์ง ๊ฒฐ์ ์ด ์๋์ ๋์ค์ ์ถ๊ฐ ๋ ์ ์์ ๊ฒ ๊ฐ์์.
๊ทธ๋ฆฌ๊ณ ๊ณ ์์ด๋ฅผ ๋๋ค์ผ๋ก ์์ฑํ๊ณ , ๋ถ๋ฌ๋ผ ์ ์๋ ๋ฒํผ์ ๋ง๋ค์ด์ฃผ์ธ์.
๊ณ ์์ด ์ด๋ฆ์ ์ ๋ ฅํ๊ณ ๊ณ ์์ด๋ฅผ ๋ถ๋ฅด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ํฉ๋๋ค.
- ์ผ๋ฐ ๊ณ ์์ด: ๋์๊ฒ ๋ค๊ฐ์จ๋ค,
- ๋ฌ์์ ๋ธ๋ฃจ: ์์ 2๋ฒ ๊ทธ๋ฆฌ๊ณ ๋์๊ฒ ์จ๋ค.,
- ์ฝ๋ฆฌ์ ์ํค์ด: ๋ฌผ๋๋ฌ๋ฏธ ๋ฐ๋ผ๋ง ๋ณธ๋ค.,
- ๋ฒต๊ฐ ๊ณ ์์ด: 2๋ฒ ์ด์ ๋ถ๋ฌ์ผ ๋์๊ฒ ์จ๋ค.,
- ๋ ธ๋ฅด์จ์ด ์ฒ: ๋ฐ์ค ์์ผ๋ก ๋ค์ด๊ฐ๋ค.
์ ๋ฒ์ฒ๋ผ ๋ค์ ์๊ตฌ์ฌํญ์ ๋ถ์ํด๋ณด์.
makeCat
๊ณ ์์ด๋ฅผ ๋๋ค์ผ๋ก ์์ฑํ๋ค.
๊ณ ์์ด๋ ์ด๋ฆ, ๋์ด, ์ข
๋ฅ(์์ ๋๋ง)๋ฅผ ๊ฐ๋๋ค.
catCall
input tag์ ์
๋ ฅ๋ฐ์ ์ด๋ฆ์ ๊ณ ์์ด๋ฅผ ๋ถ๋ฅธ๋ค.
input์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
Cat Class
Russian Blue, korean shorthair cat, Bengal cat, Norwegian forest cat์ ์ผ๋ฐ Cat Class๋ฅผ ์์๋ฐ์ ๋ง๋ ๋ค. ๊ฐ ๊ณ ์์ด์ ํน์ง์ ๊ฐ class method๋ก ๋ด๋ถ ๊ตฌํํ๋ค.
๐ catCall ๊ตฌํ์ ๋ํด ์๊ฐํด๋ณด์
1. switch๋ฌธ ์ฌ์ฉํ๊ธฐfunction catCall(type){ switch(type){ case "๋ฒต๊ฐ": '์ฌ๊ธฐ์ ํ๋์ ์์ฑ' case "๋ฌ์์ ๋ธ๋ฃจ": '์ฌ๊ธฐ์ ํ๋์ ์์ฑ' .... } }
- ํน์ method ํธ์ถ
function catCall(catClass){ catClass.come(); }
๐ SOLID์์น 2. ๊ฐ๋ฐฉ-ํ์ ์์น(OCP, Open-Closed Principle)
์ํํธ์จ์ด ๊ฐ์ฒด(ํด๋์ค, ๋ชจ๋, ํจ์ ๋ฑ๋ฑ)๋ ํ์ฅ์ ๋ํด ์ด๋ ค ์์ด์ผ ํ๊ณ , ์์ ์ ๋ํด์๋ ๋ซํ ์์ด์ผ ํ๋ค
- ์ฒซ๋ฒ์งธ catCall ํจ์์ ๊ฒฝ์ฐ, cat์ ์ข ๋ฅ๊ฐ 100๊ฐ๋ก ๋์ด๋๋ค๋ฉด switch๋ฌธ ์ฌ์ฉ์ด ์ด๋ ค์์ง ๊ฒ์ด๋ค. ์ค์๋ก ํ๋๋ผ๋ ๋นผ๋จน๋๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๊ฐ ๋ ๊ฒ์ด๋ค. ( ํ์ฅ์ ์ด๋ ค์์ง ์๋ค.)
- ์ฒซ๋ฒ์งธ catCall ํจ์์ ๊ฒฝ์ฐ, cat์ด ์ถ๊ฐ๋ ๋๋ง๋ค catCall์ ํจ์ ๋ํ ์์ ์ ํด์ฃผ์ด์ผ ํ๋ค. ( ์์ ์ ๋ซํ์์ง ์๋ค. )
- ๋๋ฒ์งธ catCallํจ์๋ catClass๋ฅผ cat ์ข ๋ฅ๊ฐ 100๊ฐ๊ฐ ๋์ด๋, ์์ ์ด ํ์์๋ค. ( ๊ฐ๋ฐฉ ํ์ ์์น์ ์งํจ ์ฝ๋๋ค. )
๐ SOLID์์น 3. ๋ฆฌ์ค์ฝํ ์นํ ์์น์ด๋ (Liskov Substitution Principle)
์์ ํ์ ์ ๊ฐ์ฒด๋ฅผ ํ์ ํ์ ์ ๊ฐ์ฒด๋ก ์นํํด๋ ๋์์ ๋ฌธ์ ๊ฐ ์์ด์ผ ํฉ๋๋ค.
- ๋ฌ์์ ๋ธ๋ฃจ๋ CatClass๋ฅผ ์์๋ฐ์ ๋ง๋ค์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ผ๋ฐ ๊ณ ์์ด๋ฅผ RussianBlueCat์ผ๋ก ์ ๋ถ ์นํํ๋๋ผ๋ ํ๋ก๊ทธ๋จ์ ๋ฌธ์ ์์ด ๋์๊ฐ์ผ ํ๋ค.
function main() {
new InfoToolTip();
new StateToolTip();
const makeCatClass = new makeCatButton();
const callCatFunc = callCat(makeCatClass);
new callCatBtn(callCatFunc);
makeCatClass.click();
}
function makeCat() {
const $parent = document.getElementById("playground");
const randomAge = getRandomNumber(1, 14);
const randomName = CAT_NAME_LIST[randomAge % 6];
const idx = getRandomNumber(0, 4);
const catType = [
Cat,
RussianBlue,
koreanShorthairCat,
BengalCat,
NorwegianForestCat,
];
return new catType[idx]($parent, {
name: `${randomName}${new Date().getTime()}`,
age: randomAge,
});
}
class RussianBlue extends Cat {
constructor($parent, data) {
super($parent, {
...data,
type: "๋ฌ์์ ๋ธ๋ฃจ",
});
this._dataController;
}
/*
* @override
*/
create() {
this._domController.createDom(
`<div class="russianBlueCat">๋ฌ์์ ๋ธ๋ฃจ</div>`
);
this._domController.setEvent("russianBlueCat");
}
/*
* @override
*/
call() {
console.log("์์ 2๋ฒ ๊ทธ๋ฆฌ๊ณ ๋์๊ฒ ์จ๋ค");
}
}
class makeCatButton {
#result;
#maxNum;
constructor() {
this.$el = document.getElementById("makeCatBtn");
this.#result = [];
this.#maxNum = 6;
this.#setEvent();
}
getCatBox() {
return this.#result.map((catClass) => {
return catClass.getName();
});
}
getCatClass(name) {
const catNameList = this.getCatBox();
const idx = catNameList.findIndex((catName) => catName === name);
return this.#result[idx];
}
#setEvent() {
this.$el.addEventListener("click", () => {
if (this.#result.length === this.#maxNum) {
alert("๊ณ ์์ด๋ฅผ ๋ ์ด์ ์ถ๊ฐํ ์ ์์ด์!!!");
} else {
this.#result.push(makeCat());
}
});
}
click() {
this.$el.click();
}
}
function callCat(makeCatClass) {
const $input = document.getElementById("catCallName");
return function () {
const name = $input.value;
if (name === "") return alert("์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์");
const nameList = makeCatClass.getCatBox();
if (!nameList.includes(name))
return alert("๊ณ ์์ด ์ด๋ฆ์ ๋ค์ ํ์ธํด์ฃผ์ธ์.");
const catClass = makeCatClass.getCatClass(name);
catClass?.call();
};
}
์ฝ๋ ๋ณด๋ฌ๊ฐ๊ธฐ > github