우아한테크코스 5기 프론트엔드 미션 리팩터링 1주차 6번
📋 문제 6번
https://github.com/woowacourse-precourse/javascript-onboarding/blob/main/docs/PROBLEM6.md
⚙️ 기능 목록
1. 입력된 닉네임들을 체크 시작
2. 예외처리
- 닉네임은 한글만 가능
3. 닉네임 검사 기능
4. 닉네임의 이메일 저장 기능
5. 사용된 닉네임의 문자들 저장 기능
6. 닉네임의 문자들이 중복되는 것들이 있는지 확인 기능
7. 닉네임에 맞는 이메일 가져오는 기능
8. 이메일 정렬 기능
⬅️이전 풀이
😥 미흡했던 점
- 함수가 한 가지 일만 하지 않음.
- 메서드 10줄 넘음
- let과 const 적절히 사용하지 않음.
- 불필요한 중복체크 (두글자씩만 체크하면 된다.)
📌 고려사항
- 클래스 사용
- 메서드 10줄 제한
- 한가지 기능만 수행
- depth 최대 2
- 예외처리 클래스 추가
- switch 문 사용 (저장 case, 중복 체크 case)
- 메소드 내에서 오름차순 정렬하는 것조차 또 하나의 기능으로 봐서 추가로 메소드를 만들어주었다.
- 중간중간 const nickName = data[1] 과 같이 불필요한 변수 선언이 있지만, 이 데이터가 무엇을 나타내는 것인지 확실하게 해주기 위해 일부러 추가하였다. 가독성을 고려하지 않는다면, 추가하지 않아도 된다.
Exception 클래스의 필요가 확실하지는 않다.
문제의 요구사항은 같은 글자가 연속적으로 포함 되는 닉네임의 이메일 목록을 return 하는 것이지만,
닉네임은 한글만 가능하다고 하였다.
그래서 우선 허용되는 닉네임들을 가진 데이터들로 검열해주고
이후 검사를 해주었다.
닉네임이 한글만 들어온다는 말이 있었다면 굳이 예외처리를 해주지 않았지만, 애매한 요구사항이라 예외처리를 추가로 해주었다.
사실 위의 요구사항만 생각한다면, 닉네임이 한글이 아니여도 중복되는 닉네임을 사용한다면,
이메일을 출력해주는게 맞는 것 같다.
📜 리팩터링
class Exception {
except(forms) {
const acceptData = forms.filter((form) => {
return this.isKorean(form[1]);
});
return acceptData;
}
isKorean(nickName) {
const sample = /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/;
let check = true;
nickName.split("").forEach((letter) => {
if (!sample.test(letter)) check = false;
});
return check;
}
}
class System {
constructor() {
this.forms = [];
this.info = {};
this.usedNickName = {};
}
inspect(forms) {
this.forms = forms;
this.storeData();
let refuseData = this.forms.filter((form) => {
const nickName = form[1];
return this.checkNickName(nickName);
});
return this.getEmail(refuseData);
}
storeData() {
this.forms.forEach((data) => {
const [email, nickName] = data;
this.info[nickName] = email;
this.storeUsedLetter(nickName);
});
}
storeUsedLetter(nickName) {
for (let i = 0; i < nickName.length - 1; i++) {
this.checkLetter("store", nickName[i], nickName[i + 1]);
}
}
checkNickName(nickName) {
for (let i = 0; i < nickName.length - 1; i++) {
if (this.checkLetter("duplicate", nickName[i], nickName[i + 1]))
return true;
}
return false;
}
checkLetter(order, frontLetter, backLetter) {
const letter = frontLetter + backLetter;
switch (order) {
case "store":
if (this.usedNickName[letter]) this.usedNickName[letter] += 1;
else this.usedNickName[letter] = 1;
case "duplicate":
if (this.usedNickName[letter] > 1) return true;
return false;
}
}
getEmail(refuseData) {
const emails = refuseData.map((data) => {
const nickName = data[1];
return this.info[nickName];
});
const sortedEmail = this.sortEmail(emails);
return this.deleteDupicate(sortedEmail);
}
sortEmail(email) {
return email.sort();
}
deleteDupicate(emails) {
return [...new Set(emails)];
}
}
function problem6(forms) {
const exception = new Exception();
const vaildForms = exception.except(forms);
const system = new System();
return system.inspect(vaildForms);
}
module.exports = problem6;
반응형
'성장기록 > 우아한테크코스' 카테고리의 다른 글
우아한테크코스 5기 프론트엔드 미션 리팩터링 2주차 야구 게임 (0) | 2022.11.30 |
---|---|
우아한테크코스 5기 프론트엔드 미션 리팩터링 1주차 7번 (0) | 2022.11.28 |
우아한테크코스 5기 프론트엔드 미션 리팩터링 1주차 5번 (0) | 2022.11.28 |
우아한테크코스 5기 프론트엔드 미션 리팩터링 1주차 4번 (0) | 2022.11.27 |
우아한테크코스 5기 프론트엔드 미션 리팩터링 1주차 3번 (0) | 2022.11.27 |