본 게시글은 [five lines of code]를 읽고 정리한 게시글입니다.
규칙 1. 모든 함수는 5줄 이하로 작성한다.
규칙 2. 하나의 함수 안에서는 호출과 전달 둘 중에 하나만 해야한다.
규칙 3. if문은 함수 시작에만 배치하자. 단, if, else if,else구조를 분할하면 안된다.
{}를 제외하고 5줄 이상이 되면 안된다.if의 일부 분기만 return 문을 가지고 있을 경우 메서드를 추출하는데 방해가 될 수 있다.if, else if,else구조를 분할하면 안된다.return p;p = newMethod();를 호출한다.static void minimum(int[][] arr){
int result = Integer.MAX_VALUE;
for(int x=0; x<arr.length; x++){
for(int y =0; y<arr.length; y++){
if(result>arr[x][y]){
result = arr[x][y];
}
}
}
return result;
}
static void minimum(int[][] arr){
int result = Integer.MAX_VALUE;
for(int x=0; x<arr.length; x++){
for(int y =0; y<arr.length; y++){
result = updateMin(result, arr, x,y,)
}
}
}
static int updateMin(int result, int[][] arr, int x, int y){
if(result>arr[x][y]){
result = arr[x][y];
}
return result;
}
함수 내에서 가능한 행위
객체에 있는 메서드를 호출
객체를 인자로 전달
⇒ 단, 둘 다 하면 안된다.
많은 메서드를 도입하고, 많은 매개변수를 전달하기 시작하면 책임이 고르지 않게 될 수 있음
public int average(int[] arr){
return sum(arr)/arr.length;
}
sum(arr)와 낮은 수준의 추상화 arr.length를 전부 사용함
함수 내부 행동들의 추상화 레벨을 의미함
높은 추상화
getHtml()
getFile()
중간 추상화
String pagePathName = Path.Parser.render(pagePath)
낮은 추상화
.append("\n")
함수 내부 행동들의 추상화 레벨이 섞여있다면, 소스를 읽을 때 코드를 읽는 사람이 해당 함수가 어느 범위까지 구현되었는지 헷갈린다.
추상화는 최대한 높은 수준을 지향하고, 중간은 지양하자.
public void reportPrimes(int n){
for(int i=2; i<n; i++){
if(isPrime(i)){
System.out.println(i);
}
}
}
public void reportPrimes(int n){
for(int i=2; i<n; i++){
reportIfPrime(i);
}
}
public void reportIfPrime(int n){
if(isPrime(n)){
System.out.println(n);
}
}