하반기 채용을 준비하면서 이력서, 포트폴리오, 깃허브 관리 등 해야할 일이 많아졌다.
그런데 기존에 했던 프로젝트를 보니 너무 시간에 쫓긴 나머지 보기만해도 어지러운 코드를 작성해서 리팩토링의 필요성을 느꼈다.
우선 리팩토링을 어떻게 해야하는지, 클린코드란 무엇인지 감이라도 잡기 위해서 찾아보던 중 무료 강의를 발견해서 가볍게 듣고 정리해보았다.
const t
→ const selectedText
const t = ""; // 유저가 선택한 문자열
// Bad
const numArray = [1, 2, 3] // 유저 일련번호 목록
// Good
const userIds = [1, 2, 3]
// Bad
if (comments.length > 140) {
throw new Error("exceed comment length")
}
// Good
const commentLimitCount = 140
if (comments.length > commentLimitCount) {
throw new Error("exceed comment length")
}
// Bad - 특정 index number가 왜 쓰였는지 이해하기 어려움
userIds[0].someValue;
// Good - 특정 index number가 왜 쓰였는지 명확히 알 수 있음
const masterUserIdx = 0;
userIds[masterUserIdx].someValue;
// ES6 문법
const [masterUser] = userIds;
masterUser.someValue
// Bad : BTC, ETH가 어떤 의미인지 바로 파악하기 어려움
if(someCode === "BTC") {...}
else if(someCode === "ETH") {...}
// Good
enum CoinCode {
BITCOIN = "BTC",
ETHEREUM = "ETH",
}
if (someCode === CoinCode.BITCOIN) {...}
→ 초급 개발자가 이해하기 어렵다!
실전에서 함수를 잘 만들 수 있는 단순하지만 쉬운 방법
let outerValue = 7;
const impure = (input: number) => {
return input + outerValue;
}
impure(3); // 10
outerValue = 100
impure(3); // 103
const pure = (input:number, add:number) => {
return input + add;
}
pure(3, 7); // 10
let outerValue = 7;
const impure = (input: number) {
if (input > outerValue) {
return input;
}
// 함수 내부 동작에 의해 외부변수 outerValue가 변경됨
outerValue++
return outerValue
}
// Bad
const checkPassword = (password: string) {
if (isValid) {
Session.init();
return true;
}
}
// Good
const checkPassword = (password: string) {
if (isValid) {
return true;
}
return false;
}
const isValid = checkPassword("myawesomepassword");
// 세션 초기화 부분을 checkPassword에서 분리함
if (isValid) {
Session.init();
}
순수함수라는 개념을 들어보기만 하고 사실 잘 알고 있지는 못했는데, 이번 강의를 통해서 좀 명확하게 이해한 것 같다.
변수명도 이미 최대한 의미를 부여하면서 작성하고 있었지만, 어떤 단어를 피해야 하는지를 알게 되었다.
하지만 이미 만든 코드를 뜯어 고치려고 해보니 여전히 많은 막막함을 느낄 수 있었다.
특히 주석 없이 작성한 코드에서 어떻게 주석을 달아야 하는 것인지를 잘 모르겠다.
우선 아무 설명 없이 코드만 넘겨줬을 때 남이 이해할 수 있어야 한다는 개념을 잘 기억해두고, 자세한 내용은 "클린코드" 책이나 유료 강의 등으로 더 찾아 배워야 할 것 같다.