λμμΈν¨ν΄μ νλ‘κ·Έλλ°μ νλ€λ³΄λ©΄ λꡬλ ν λ²μ―€μ κ·Έ μ€μμ±μ λ£κ² λλ€.
κ·Έλ°λ° Reactμ ν¨μν μ»΄ν¬λνΈλ‘ μμ
νλκ² μ΅μνλ€λ©΄ λμμΈ ν¨ν΄μ μ€μμ±μ λ€μ΄λ΄€μ΄λ, μ΄λ»κ² μ μ©ν΄μΌ νλμ§, μ κΌ λ°°μμΌ νλμ§
μλ¬Έμ΄ λ€ μ μλ€.
λμμΈ ν¨ν΄ μ€ κ°μ₯ μ λͺ ν GOFμ λμμΈ ν¨ν΄μ μ무λλ Class κΈ°λ°μΌλ‘ μ€λͺ μ΄ λμ΄μκ³ , μ€λͺ μ μ°Ύμλ΄λ 볡μ‘ν λΏλλ¬ Reactλ₯Ό μ¬μ©νλ€λ³΄λ©΄ λ³΄ν΅ ν¨μλ‘ λͺ¨λ κ²μ μ²λ¦¬νλ€λ³΄λ μ무λλ μλΏμ§κ° μλλ€.
κ·Έλ¬λ λμμΈ ν¨ν΄μ OOPλ§μ μν κ²μ΄ μλ λ¬Έμ ν΄κ²°μ μν λ€μν μμ΄λμ΄ λΌλ μ κ·Όλ²μΌλ‘ 곡λΆνλκ² μ΄μΈλ¦΄ κ² κ°λ€.
π λμμΈ ν¨ν΄μ΄λ
"νλ‘κ·Έλλ°"μ νλ€κ° λ§μ£Όνλ μ¬λ¬ λ¬Έμ λ₯Ό λ³΄λ€ "νλͺ νκ²" ν΄κ²°νκΈ° μν μ¬λ¬κ°μ§ μ κ·Όλ²μ λ§νλ€.
μ΄ μ리μ¦μμλ GOFμ 23κ°μ§ λμμΈ ν¨ν΄μ νλ‘ νΈμλ μμ λ₯Ό ν΅ν΄ μ΄ν΄λ³Ό κ²μ΄λ€.
π νλͺ νκ² ν΄κ²°νκΈ°
- μΆκ° κΈ°λ₯ ꡬνμ΄ μ½λ€
- λλ²κΉ μ΄ μ½λ€
- μμ μ¬ν λ°μμ΄ μ½λ€.
νλ§ κ²μμ λ§λ€κΊΌμΌ.
νλ©΄ κ°μ΄λ°μ κ³ μμ΄κ° μκ³ , λ§μ°μ€λ₯Ό μ€λ²νλ©΄ κ³ μμ΄μ μ λ³΄κ° λ΄μΌλ©΄ μ’κ² μ΄.
κ³ μμ΄μ μ 보λ 'μ΄λ¦, λμ΄'μΌ.
κ³ μμ΄λ λ¨ΉκΈ°, κ±·κΈ°, μΌμ΄λκΈ°, μ μκΈ°, μ»κΈ°, λ¬Ό λ§μκΈ°(6κ°μ§) νλμ ν μ μκ³ , 5μ΄λ§λ€ λλ€μΌλ‘ νλμ μ€νν κΊΌμΌ.
κ³ μμ΄λ₯Ό ν΄λ¦νλ©΄ λ¬΄μ¨ νλμ νκ³ μλμ§ λ§νμ μΌλ‘ μλ €μ€.
Main
: λμ΄μ μ΄λ¦μ λλ€μΌλ‘ κ°λ κ³ μμ΄λ₯Ό λ§λ λ€.
Cat
: νλ©΄μ κ³ μμ΄λ₯Ό κ·Έλ¦°λ€.
: κ³ μμ΄λ μμ±λ λ λμ΄μ μ΄λ¦μ κ°λλ€.
: μ΄ 6κ°μ§ νλμ ν μ μλ€.
: 5μ΄λ§λ€ κ³ μμ΄μ μνλ₯Ό λ°κΎΌλ€.
infoToolTip
: νλ©΄μ μ 보창μ λ§λ λ€.
: κ³ μμ΄μ μ 보λ₯Ό 보μ¬μ€λ€.
stateToolTip
: νλ©΄μ λ§νμ μ λ§λ λ€.
: κ³ μμ΄μ μνλ₯Ό 보μ¬μ€λ€.
π SOLIDμμΉ 1. Single Responsibility(λ¨μΌ μ± μ μμΉ)
: 1κ°μ§ μ± μμ κ°λ ν¨μλ ν΄λμ€λ₯Ό μμ±ν κ²
κ³ μμ΄ μ 보λ₯Ό μ 보창μ μΆλ ₯μ νλ κ²μ κ³ μμ΄κ° νλ μΌμ΄ μλλ€.
λ¨μΌ μ± μ μμΉμ μ½κ² λ§ν΄ 'μ΄λ¦κ°μ νλ μ½λ'λ₯Ό λ§λλ κ²μ΄λ€.
π νλ‘ νΈμλμμ λ¨μΌ μ± μ μμΉ
νλ‘ νΈμμ νλ μΌμ λλ 보μ
λ¨μΌ μ± μ μμΉμ μ μ©νλ€λ©΄ ν΄λλ₯Ό μ΄λ»κ² λλκ³ , νμΌμ μ΄λ»κ² λλλκ² μ’μκΉ? ( λ΅μ μμΌλ κ°μ΄ κ³ λ―Όν΄λ³΄μ. μ’μ λ°©λ²μ΄ μκ°λλ€λ©΄ λκΈλ‘ 곡μ ν΄λ μ’μμπ )
- DOM create, update ( UI λ³κ²½ )
- νλ©΄ ꡬμ±( html )
- μ¬μ©μμ μνΈμμ©( eventListener )
- νλ©΄μ μ΄λ»κ² 그릴κΉ( css )
- API νΈμΆ ( data κ°μ Έμ€κΈ° )
- μλ²μ λ°μ΄ν° μμ²
- νλ‘ ν°μμ μ°κΈ° μ½κ² data convert
- λ°μ΄ν° κ΄λ¦¬νκΈ° ( Logic )
- μλ² μ 보μ λ°λΌ 그리λ λ°©μμ΄ λ¬λΌμ§λ κ²½μ°
- μ¬μ©μ interactionμ΄ dataμ μν₯μ λ―ΈμΉλ κ²½μ°
- .......
const CAT_NAME_LIST = ["λμΉ", "νλ", "μ¬λ¦", "λλΉ", "λ΄μ΄", "μ¬λ"];
const CAT_ACT = ["eat", "walk", "wake", "sleep", "shower", "drink"];
const CAT_RANDOM_TIMER = 5000;
function getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
function trigger(eventType, data) {
const event = new CustomEvent(eventType, { detail: data });
document.dispatchEvent(event);
}
function addEventListener(eventType, listener) {
document.addEventListener(eventType, listener);
}
function main() {
const $parent = document.getElementById("playground");
const randomAge = getRandomNumber(1, 14);
const randomName = CAT_NAME_LIST[randomAge % 6];
new Cat($parent, {
name: randomName,
age: randomAge,
});
new InfoToolTip();
new StateToolTip();
}
class Cat {
constructor($parent, data) {
const idx = getRandomNumber(1, 100) % 6;
const dataController = new CatData({ ...data, state: CAT_ACT[idx] });
this._domController = new CatDom($parent, dataController);
}
}
class CatData {
constructor({ name, age, state }) {
this.name = name;
this.age = age;
this.state = state;
setInterval(this.randomAct.bind(this), CAT_RANDOM_TIMER);
}
getProfile() {
return {
name: this.name,
age: this.age,
};
}
getState() {
return this.state;
}
randomAct() {
const state = getRandomNumber(1, 100) % 6;
const actName = CAT_ACT[state];
this[actName]();
}
eat() {
this.state = "eat";
}
walk() {
this.state = "walk";
}
wake() {
this.state = "wake";
}
sleep() {
this.state = "sleep";
}
shower() {
this.state = "shower";
}
drink() {
this.state = "drink";
}
}
class CatDom {
constructor($parent, dataController) {
this.$parent = $parent;
this.dataController = dataController;
this.createDom();
this.setEvent();
}
createDom() {
this.$parent.innerHTML += `<div class="cat">κ³ μμ΄</div>`;
}
setEvent() {
const $targetEl = Array.from(this.$parent.getElementsByClassName("cat"));
$targetEl.forEach(($el) => {
if (!$el) return;
$el.addEventListener("click", () => {
this.click();
});
$el.addEventListener("mouseover", () => {
this.hover();
});
$el.addEventListener("mouseleave", () => {
this.leave();
});
});
}
click() {
const state = this.dataController.getState();
trigger("onCatClick", { state });
}
hover() {
const info = this.dataController.getProfile();
trigger("onCatHover", { info });
}
leave() {
trigger("onCartLeave");
}
}
class InfoToolTip {
constructor() {
this.$el = document.getElementById("info");
this.setEvent();
}
setEvent() {
addEventListener("onCatHover", (e) => {
const { info } = e.detail;
const { name, age } = info;
this.$el.classList.remove("hide");
this.$el.innerHTML = `μ΄λ¦: ${name}, λμ΄: ${age}`;
});
addEventListener("onCartLeave", (e) => {
this.$el.classList.add("hide");
});
}
}
class StateToolTip {
constructor() {
this.$el = document.getElementById("state");
this.setEvent();
}
setEvent() {
addEventListener("onCatClick", (e) => {
const { state } = e.detail;
this.$el.classList.remove("hide");
this.$el.innerHTML = `κ³ μμ΄κ° ${state}νκ³ μμ΅λλ€.`;
setTimeout(() => {
this.$el.classList.add("hide");
}, 700);
});
}
}
μ€λμ SOLIDν¨ν΄ μ€ μ²«λ²μ§Έ μμΉ, λ¨μΌ μ±
μ μμΉμ λ°°μ°κ³ μμλ₯Ό λ§λ€μ΄λ³΄μλ€. μ΅μ’
μ½λλ λ€μ githubμμ νμΈν μ μλ€.
μμΌλ‘λ μꡬμ¬νμ μΆκ°νκ³ , λμμΈ ν¨ν΄μ μ μ©ν΄ 보며 μ½λλ₯Ό μ μ λ€λ¬μ΄ 보λλ‘ νμ.
μ½λ 보λ¬κ°κΈ° > github