과제 체크포인트
기본과제
- 코드가 Prettier를 통해 일관된 포맷팅이 적용되어 있는가?
- 적절한 줄바꿈과 주석을 사용하여 코드의 논리적 단위를 명확히 구분했는가?
- 변수명과 함수명이 그 역할을 명확히 나타내며, 일관된 네이밍 규칙을 따르는가?
- 매직 넘버와 문자열을 의미 있는 상수로 추출했는가?
- 중복 코드를 제거하고 재사용 가능한 형태로 리팩토링했는가?
- 함수가 단일 책임 원칙을 따르며, 한 가지 작업만 수행하는가?
- 조건문과 반복문이 간결하고 명확한가? 복잡한 조건을 함수로 추출했는가?
- 코드의 배치가 의존성과 실행 흐름에 따라 논리적으로 구성되어 있는가?
- 연관된 코드를 의미 있는 함수나 모듈로 그룹화했는가?
- ES6+ 문법을 활용하여 코드를 더 간결하고 명확하게 작성했는가?
- 전역 상태와 부수 효과(side effects)를 최소화했는가?
- 에러 처리와 예외 상황을 명확히 고려하고 처리했는가?
- 코드 자체가 자기 문서화되어 있어, 주석 없이도 의도를 파악할 수 있는가?
- 비즈니스 로직과 UI 로직이 적절히 분리되어 있는가?
- 코드의 각 부분이 테스트 가능하도록 구조화되어 있는가?
- 성능 개선을 위해 불필요한 연산이나 렌더링을 제거했는가?
- 새로운 기능 추가나 변경이 기존 코드에 미치는 영향을 최소화했는가?
- 코드 리뷰를 통해 다른 개발자들의 피드백을 반영하고 개선했는가?
- (핵심!) 리팩토링 시 기존 기능을 그대로 유지하면서 점진적으로 개선했는가?
심화과제
- 변경한 구조와 코드가 기존의 코드보다 가독성이 높고 이해하기 쉬운가?
- 변경한 구조와 코드가 기존의 코드보다 기능을 수정하거나 확장하기에 용이한가?
- 변경한 구조와 코드가 기존의 코드보다 테스트를 하기에 더 용이한가?
- 변경한 구조와 코드가 기존의 모든 기능은 그대로 유지했는가?
- (핵심!) 변경한 구조와 코드를 새로운 한번에 새로만들지 않고 점진적으로 개선했는가?
과제 셀프회고
과제를 하면서 내가 제일 신경 쓴 부분은 무엇인가요?
- 최대한 가독성 있는 함수 단위로 쪼개보려 했습니다.
과제를 다시 해보면 더 잘 할 수 있었겠다 아쉬운 점이 있다면 무엇인가요?
- 보너스, 구매 수량 등으로 분기되는 포인트들을 선언형으로 리팩토링 해보고싶습니다.
- 차근차근 최대한 역할 별로 기능을 분리하고 모듈화에 신경쓰고 싶습니다.
리뷰 받고 싶은 내용이나 궁금한 것에 대한 질문 편하게 남겨주세요 :)
-
주어진 시간 동안 기존 기능을 유지하며 함수를 쪼개보려 노력했습니다. 다만 함수를 분리하는 단위에 대해 의문이 생깁니다. 너무 잘게 쪼개다보면 재사용될 여지가 없는 함수가 발생하고, 큰 단위로 쪼개봐도 재사용이 불가능한 기능을 합니다. 이럴 때 어떤 기준으로 나눠야하는지와 제 코드 내에서 적절히 분리된 함수, 더 분리하는게 바람직한 함수에 대한 피드백을 얻고싶습니다.
-
함수 분리에서 드는 의문 같은 리스트를 순회하는 함수에서 반환 타입이 두개일 떄, 한 함수에서 한번 순회하여 두 타입의 값을 반환하는 것이 좋을까요? 두 함수로 나눠 두번 순회하는 것이 좋을까요?
var doRenderBonusPoints = function () {
// ...
if (hasKeyboard && hasMouse) {
finalPoints = finalPoints + 50;
pointsDetail.push('키보드+마우스 세트 +50p');
}
if (hasKeyboard && hasMouse && hasMonitorArm) {
finalPoints = finalPoints + 100;
pointsDetail.push('풀세트 구매 +100p');
}
if (itemCnt >= 30) {
finalPoints = finalPoints + 100;
pointsDetail.push('대량구매(30개+) +100p');
} else {
if (itemCnt >= 20) {
finalPoints = finalPoints + 50;
pointsDetail.push('대량구매(20개+) +50p');
} else {
if (itemCnt >= 10) {
finalPoints = finalPoints + 20;
pointsDetail.push('대량구매(10개+) +20p');
}
}
}
//...
// finalPoints와 pointsDetail 둘 다 쓰임.
};
-
함수의 독립성을 유지하기 위해 param으로 값을 받고싶지만, 외부 변수, 함수를 참조하는게 편한 경우가 있을 떄, 어떤 기준으로 합리적인지 판단할 수 있을까요?
-
최대한 가독성 있는 함수 단위는 어떤 정도의 분리가 이뤄져야할까요? 하나하나의 기능을 모두 함수로 나누면, 그것도 오히려 가독성을 해치는 행위가 아닐까하는 생각이 듭니다.
과제 피드백
안녕하세요 용훈님! 4주차 과제 잘 진행해주셨네요 ㅎㅎ 다만 심화과제까지 할 여유는 없었군요 ㅠㅠ
주어진 시간 동안 기존 기능을 유지하며 함수를 쪼개보려 노력했습니다. 다만 함수를 분리하는 단위에 대해 의문이 생깁니다. 너무 잘게 쪼개다보면 재사용될 여지가 없는 함수가 발생하고, 큰 단위로 쪼개봐도 재사용이 불가능한 기능을 합니다. 이럴 때 어떤 기준으로 나눠야하는지와 제 코드 내에서 적절히 분리된 함수, 더 분리하는게 바람직한 함수에 대한 피드백을 얻고싶습니다.
함수를 꼭 재사용 때문에 분리하는건 아니라고 생각해요. 저는 재사용보단 "역할"과 "목적"이 더 중요하다고 생각한답니다! 자세한 내용은 https://junilhwang.github.io/TIL/clean-code/%EC%A1%B0%EA%B0%81%EB%AA%A8%EC%9D%8C/%EC%B6%94%EC%83%81%ED%99%94%EB%A5%BC-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0/ 이 글을 참고해주세요!
같은 리스트를 순회하는 함수에서 반환 타입이 두개일 떄, 한 함수에서 한번 순회하여 두 타입의 값을 반환하는 것이 좋을까요? 두 함수로 나눠 두번 순회하는 것이 좋을까요?
이에 대한 답변은 멘토링 때 했던걸로 기억해요 ㅎㅎ 멘토링 노트를 참고해주세요!
함수의 독립성을 유지하기 위해 param으로 값을 받고싶지만, 외부 변수, 함수를 참조하는게 편한 경우가 있을 떄, 어떤 기준으로 합리적인지 판단할 수 있을까요?
음.. 구체적인 예시가 있으면 좋을 것 같은데요, 문장만 봤을 땐 "어떤 상황이 편한걸까?"에 대한 의문이 있어요! 보통 훅으로 사용할 때, 훅 내부의 함수가 말씀해주신 모습이긴 합니다 ㅎㅎ
최대한 가독성 있는 함수 단위는 어떤 정도의 분리가 이뤄져야할까요? 하나하나의 기능을 모두 함수로 나누면, 그것도 오히려 가독성을 해치는 행위가 아닐까하는 생각이 듭니다.
가독성이 좋다는게 뭘까? 에 대한 고민부터 해보시면 좋답니다! 저는 가독성이 개인 편차가 있다고 생각해요. 저처럼 맨날맨날 다른 사람의 코드를 보는 사람은, 어떤 코드를 보든 이제 고만고만하게 느껴져요. 내 기준에서 읽기 어려운게 아니라 다른사람이 보면 읽기 어려운 것 같은데? 처럼 판단하는거죠 ㅎㅎ
가령, 함수가 너무 깊게 만들어지면 작성자가 아니면 이해하기 어려운게 맞아요. 하지만 이 코드를 익숙하게 보는 팀원들이라면 이야기가 다르죠. 오히려 깊이있게 추상화된게 코드를 공유하는 사람들끼리는 이해하기 수월할 수도 있답니다.
뭐랄까.. 우리는 리액트를 쓰면서 useState 라는 함수를 볼 때 이게 어떤 일을 하는지 이해하고 있죠. 하지만 useState 내부가 정확히 어떻게 동작하는지는 이해하는게 굉장히 어려울 수 있어요.
추상화를 잘 해놓은거죠.
가독성이 좋다는 것. 추상화가 잘 되어있다는 것은 이처럼 input에 대한 output을 예측할 수 있는가에 따라 다르다고 생각해요.
사실 명확하게 "여기까지 분리해야돼!" 라고 이야기 하기 어려운 부분인거죠 ㅎㅎ 다만 함수를 "합성"하는 방식으로 만들다보면 깊이를 얕게 유지할 수 있답니다!
마찬가지로 https://junilhwang.github.io/TIL/clean-code/%EC%A1%B0%EA%B0%81%EB%AA%A8%EC%9D%8C/%EC%B6%94%EC%83%81%ED%99%94%EB%A5%BC-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0/ 이 글의 내용을 참고해보시면 좋을 것 같아요!
level2의 함수를 level3에서 조합하여 사용하는거죠.