단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다. (p.45)
.getHtml()
은 추상화 수준이 아주 높다.
getHtml안에서는 그 코드가 하려는 작업을 위해서 여러가지 역할을 하는 코드들이 있을 것이기 때문
String pagePathName = PathParser.render(pagepath)
는 추상화 수준이 중간
PathParse.render라는 함수가 아마도 'pagepath에 해당하는 것'을 렌더링하는 역할을 하는 것이기 때문
.append(”\n”)
는 추상화 수준이 아주 낮다.
이 함수는 더이상 쪼갤 것이 없기 때문
Switch문은 종류별로 어떤 일을 수행하는 것이기 때문에 길게 나올 수 밖에 없다.
다형성을 이용해 switch문을 추상화한다.
public Money calculatePay(Employee e)
throws InvalidEmplᄋyeeType {
switch (e.type) {
case COMMISSIONED:
return caleulateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
위 코드의 문제는
public abstract class Employee {
public abstract boolean isPayday();
public abstract Money calculatePay();
public abstract void deliverPay(Money pay);
}
public interface EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
public class EmployeeFactorylmpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
switch (r.type) {
case COMMISSIONED:
return new CommissionedEmployee(r);
case HOURLY:
return new HourlyEmployee(r);
case SALARIED:
ret니rn new SalariedEmployee(r);
default:
throw new InvalidEmp 'LoyeeType! r.type);
}
}
}
추상클래스 Employee 를 상속 받는 자식 클래스들은 각각 calculatePay, isPayday, deliverPay 메서드를 오버라이드 한다.
직원 유형에 따라 객체를 만들어 반환하고 그 객체로 메서드를 실행한다.
→ 메소드를 수정하지 않아도 되기 때문에 makeEmployee(EmployeeRecord r)
를 똑같이 사용하면서 다양한 결과를 얻을 수 있다. (다형성)
길고 서술적인 이름이, 짧고 어려운 이름과 길고 서술적인 주석보다 좋다.
boolean fileExists("MyFile")
InputStream fileOpen("MyFile")
void passwordAttemptFailedNtimes(int attempts)
Circle makeCircle( double x, double y, double radius)
→ Circle makeCircle( Point center, double radius)
writeField(outputStream, name)
→ outputStream.writeField(name)
writeField(name)
를 구현한다.. 객체를 만들어 writeField(name) 실행한다.render(boolean isSuite)
→ renderForSuite()
& renderForSingleTest()
assertEquals()
→ assertExpectedEqualsActual(expected, actual)
함수는 뭔가를 수행(명령)하거나 뭔가에 답(조회)하거나이다.
//나쁜 예
if (set("username", "myname"))
...
//좋은 예
if (attributeExists("username")) {
setAttribute("username", "myname");
...
}