자바스크립트의 Switch 문 – 어떻게 리팩토링합니까?
C, C++, and Java
와 같은 다른 전통적인 언어에서 주로 사용됩니다.왜 Switch 문인가?
switch 문은 다른 조건에 따라 다른 작업을 실행합니다. 물론 위의 문제를
if-else
래더로 해결할 수 있지만 프로그램이 너무 서투르게 됩니다. 또한 if-else
래더는 확인할 최대값이 3 conditions
인 경우에만 권장됩니다.Javascript
스위치 문이 있지만 python
관심이 있다면 부가 정보로 python doesn’t have the switch statement but it achieves the same with the dictionary mapping
.dictionary mapping
는 파이썬에서 영감을 받아 자바스크립트에서 객체 생성과 유사하기 때문에 switch 문을 여러 객체로 대체할 수 있는데 이는 나쁜 생각이 아닙니다. 이렇게 하면 코드simple and maintainable
가 장기적으로 유지됩니다.코딩 경력에서 직면했을 가장 많이 발생하는 예를 살펴 보겠습니다.
실시예 1
일요일과 같은 문자열로 오늘 요일을 반환하는 코드를 작성하십시오.
switch 문을 사용하여
let day = new Date().getDay();
switch (day) {
case 0:
day = "Sunday";
break;
case 1:
day = "Monday";
break;
case 2:
day = "Tuesday";
break;
case 3:
day = "Wednesday";
break;
case 4:
day = "Thursday";
break;
case 5:
day = "Friday";
break;
case 6:
day = "Saturday";
}
console.log(day); // for 30/01/2022 it will return Sunday
console.log에서 출력 확인
스위치 없이, 즉 리팩토링된 코드
const day = new Date().getDay();
const dayMapper = {
0: "Sunday",
1: "Monday",
2: "Tuesday",
3: "Wednesday",
4: "Thursday",
5: "Friday",
6: "Saturday"
};
if (dayMapper.hasOwnProperty(day)) {
console.log(dayMapper[day]); // Sunday
} else {
console.log("Something went wrong");
}
console.log에서 출력 확인
이것은 가장 기본적인 예입니다. 하나 더 일반적이지만 복잡한 예를 보겠습니다.
UseCase: 페이지에 대해
GA event
를 보내야 한다고 가정합니다. 예를 들어 홈 페이지의 경우 이벤트 레이블을 페이지 이름 + 현재 레이아웃 이름으로 보낼 것입니다.catch는 페이지 이름이 DOM의 데이터 속성에서 오는 것입니다.
예를 들어 더 설명하겠습니다 -
데이터 속성에서 찾은 페이지 이름에 대해 다음(
Page name_Layout name
)을 반환해야 합니다.homePage -> Home_index
productPage -> Product_pdp
blogPage -> Blog_blog
실시예 2
data 속성에 저장된 페이지 이름이 있는
HTML
가 다음과 같이 작성되었다고 가정합니다.HTML for homepage:
<div id="my-div" data-page-name="homepage"></div>
switch 문을 사용하여
let pageName = document.querySelector('#my-div').dataset.pageName;
let page;
let layout;
let ans;
switch (pageName) {
case "homepage":
page = "Home";
layout = "index";
break;
case "productpage":
page = "Product";
layout = "pdp";
break;
case "blogpage":
page = "Blog";
layout = "blog";
break;
}
ans = page + '_' + layout;
console.log(ans);
console.log에서 출력 확인
스위치 없이, 즉 리팩토링된 코드
let pageName = document.querySelector('#my-div').dataset.pageName;
let dataPageMapper = {
homepage: 'Home',
productpage: 'Product',
blogpage: 'Blog'
};
let pageLayoutMapper = {
home: 'index',
product: 'pdp',
blog: 'blog'
};
let page = dataPageMapper.hasOwnProperty(pageName) && dataPageMapper[pageName];
let layout = pageLayoutMapper[page.toLowerCase()];
let ans = page + '_' + layout;
console.log(ans);
console.log에서 출력 확인
결론
위의 방법은 더 깨끗한 방법입니다. 앞으로 더 많은 페이지를 사용할 수 있게 된다면 매퍼 개체에 항목을 만들기만 하면 됩니다.
그러나
switch statement
를 사용하면 명령문이 긴 사다리가 될 것이며 break 명령문을 추가하는 것을 잊으면 유명한 스위치 함정에 빠지게 됩니다.코드에서 스위치를 처리하는 방법과 같은 생각을 알려주십시오.
내 기사가 마음에 들면 할 수 있습니다 buy me a coffee
내 웹 사이트에서 내 다른 기사도 확인하십시오 https://weekendtutorial.com
편집하다
Example 1
에서 -배열도 객체이기 때문에 코드를 더 최적화할 수 있습니다.
const dayNum = new Date().getDay();
const days = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
];
console.log(days[dayNum]); // Sunday
Example 2
에서 -우리는 다음과 같은 클럽 개체를 가질 수 있습니다.
let pageName = document.querySelector('#my-div').dataset.pageName;
let dataPageMapper = {
homepage: {
page: 'Home',
layout: 'index'
},
productpage: {
page: 'Product',
layout: 'pdp'
},
blogpage: {
page: 'Blog',
layout: 'blog'
}
};
let pageObj = dataPageMapper.hasOwnProperty(pageName) && dataPageMapper[pageName];
let ans = pageObj.page + '_' + pageObject.layout;
console.log(ans);
위도 괜찮지만, 물체를 곤두박질 치는 것이 가장 실현 가능하지 않은 경우의 가능성을 고려하여 실제 예를 취했습니다.
물론, 객체가 다른 파일이나 장소에서 온 경우, 우리는 그것들을 클럽으로 묶어서 다른 객체를 생성할 수 있지만 그것은 또 다른 문제, 즉 다른 문제를 야기할 것입니다.
code duplicacy
피해야 합니다.
Reference
이 문제에 관하여(자바스크립트의 Switch 문 – 어떻게 리팩토링합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ajayv1/switch-statements-in-javascript-how-to-refactor-5gl8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)