[DAY-10] VanillaJS를 통한 JS 기본 역량 강화(2)
😉 헷갈렸던 & 몰랐던 부분들만 정리하는 나만의 TIL
😯 모든 강의 내용은 적지 않아요!
오늘의 소감은?
버튼 그룹 전 까지는 분명히 잘 따라갔습니다.
하지만,, 저는 ...props문법을 보자마자 머리가 하얗게 변했어요.
조금 더 혼자 공부하고, 해당 내용을 더하도록 하겠습니다.
밀린 선택강의 우선 듣고..!
[1] 명령형 & 선언형 프로그래밍
명령형 프로그래밍은 간단히 말해 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것입니다.
어떻게 구현하는가를 자세하게 기술하는 것에 관점이 가 있습니다.
선언형 프로그래밍은 간단히 말해 ‘무엇’이 나타나야 하는지를 묘사하는 것 입니다.
대표적인 선언형 프로그래밍 방식에는 HTML, SQL이 있습니다.
[1-1] 예시 1
해당 예시 코드를 보면 명령형과 선언형의 차이를 한눈에 볼 수 있습니다.
// 명령형 프로그래밍
function double1(arr) {
let results = [];
for (let i = 0; i < arr.length; i++) {
// 어떻게 처리해야하는지에 대해 묘사
results.push(arr[i] * 2);
}
return results;
}
// 선언형 프로그래밍
function double2(arr) {
return arr.map((num) => num * 2); // 무엇을 원하는지를 묘사
}
r1 = double1([1, 2, 3]);
r2 = double2([1, 2, 3]);
console.log(r1, r2);
확실히 선언형 프로그래밍이 더 간결하고 가독성이 좋습니다.
따라서 우리는 선언형 프로그래밍을 지향해야 합니다.
또한 명령형은 유지보수에 굉장히 좋지 않습니다.
// 명령형 프로그래밍
function double1(arr) {
let results = [];
for (let i = 0; i < arr.length; i++) {
if (typeof arr[i] === "number") {
results.push(arr[i] * 2);
}
}
return results;
}
// 선언형 프로그래밍
function double2(arr) {
return arr.filter((param) => typeof param === "number").map((num) => num * 2);
}
r1 = double1([1, 2, 3, 5, "a", null]);
r2 = double2([1, 2, 3, 5, "a", null]);
console.log(r1, r2);
명령형의 경우 새로운 조건이 늘어날수록, 무한정 코드의 줄이 늘어날 수 있습니다.
반면에 선언형 프로그래밍은 조금 더 명확하게 어떤 결과물이 도출되어야 하는지 알 수 있습니다.
[1-2] 예시 2
** 코드의 일부만 첨부합니다.
버튼 하나 추가하면 또 그에 비례해서 늘어나는 코드의 양..! 이런 식으로 프로그래밍을 하다가는 코드가 몇만줄이 되어도 모자랄 것 같네요.
이것이 바로 명령형 프로그래밍입니다..!
//-------------------- 명령형 프로그래밍
const $button1 = document.createElement("button");
$button1.textContent = "Button1";
const $button2 = document.createElement("button");
$button2.textContent = "Button2";
const $button3 = document.createElement("button");
$button3.textContent = "Button3";
const $app = document.querySelector("#app");
$app.appendChild($button1);
$app.appendChild($button2);
$app.appendChild($button3);
$button1.addEventListener("click", () => {
if ($button1.style.textDecoration === "line-through") {
$button1.style.textDecoration = "none";
} else {
$button1.style.textDecoration = "line-through";
}
});
// ... addEventListener ...
반면에 선언형 프로그래밍은 참 간결합니다.
어떤 기능이나 파라미터가 늘어나도, 유연하게 코드를 변경하고 추가할 수 있습니다.
// -------------------- 선언형 프로그래밍
function ToggleButton({ $target, text, onClick }) {
const $button = document.createElement("button");
$target.appendChild($button);
this.state = {
clickCount: 0,
toggled: false,
};
this.setState = (nextState) => {
this.state = nextState;
this.render();
};
this.render = () => {
$button.textContent = text;
$button.style.textDecoration = this.state.toggled ? "line-through" : "none";
};
$button.addEventListener("click", () => {
this.setState({
clickCount: this.state.clickCount + 1,
toggled: !this.state.toggled,
});
if (onClick) {
onClick(this.state.clickCount);
}
});
this.render();
}
const $app = document.querySelector("#app");
new ToggleButton({
$target: $app,
text: "Button1",
});
// ...
ButtonGroup
추가는 조금 더 고민해봐야겠아요.
일단 ...
문법부터 헷갈리네요 ㅠㅠ
댓글남기기