'작게' 그리고 '더 작게!'
들여쓰기의 수준은 1단, 2단을 넘어서면 안된다.
함수는 한 가지를 해야 한다. 그 한가지를 잘 해야 한다. 그 한가지만 해야 한다.
'한 가지'만 하는지 판단하는 방법 : 추상화 수준이 하나인 단계만 수행하나? 의미 있는 이름을 다른 함수를 추출할 수 있나?
getHtml() // 추상화 수준 높음
String pagePathName = PathParser.render(pagepath); // 추상화 수준 중간
.append("\n") // 추상화 수준 낮음
switch문은 많은 문제점을 야기할 수 있으며, 최대한 피해야함.
함수 길이가 길며, 한 가지 작업만 수행하지 않으며, SRP를 위반하고(코드를 변경할 이유가 여럿), OCP를 위반(새 직원 유형을 추가할 가능성)한다.
가장 큰 문제는 동일한 형태의 함수가 무한정 존재할 수 있음.
employee의 유형에 따른 calculatePay함수가 있는데, 직원 유형에 따라 달라지는 모든 메소드들에 일일이 switch문을 사용해야함.
switch문을 추상 팩토리로 숨겨, switch문을 한번만 실행하게끔 한다.
attributeExists 와 setAttribute로 분리
예외를 사용했을 때, 코드가 여러 단계로 중첩
try/catch 블록을 별도의 함수로 뽑아내라(한 가지의 일이다)
중복 코드의 경우, 코드의 길이가 늘어나고 수정을 할 때 중복되는 모든 곳에서 수정 작업을 해줘야한다. 이를 부모 클래스로 몰아서 중복을 없앤다. -> 구조적 프로그래밍, AOP(Asepct Oriented Programming), COP(Component Oriented Programming)
AOP:프로그래머가 횡단 관심사를 애스펙트라는 독립적인 모듈로 표현할 수 있게 함으로써 문제를 해결
COP: 컴포넌트를 조립해서 하나의 새로운 응용 프로그램을 만드는 소프트웨어 개발방법론
주석은 언제나 실패를 의미한다.
주석이 아닌 코드로 그 의도를 밝혀라
// 직원에게 복지 혜택을 받을 자격이 있는지 검사한다.
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
if (employee.isEligibleForFullBenefits())