원칙 프로그래밍 가이드 라인
SLAP(Single Layer of Abstraction Principle)
추상화 수준의 통일
코드수준을 맞춘다.
코드에서 추상화 수준을 분리할 때는 상하 2계층이 아니라 기능 복잡도에 따라서 여러계층으로 분리된다. 각각의 계층에서 자신의 계슻에 속하는 요소에 대해 추상화 수준을 일치시킨다. 추상화수준을 일치시킨 코드는 훌륭한 책과 같다. 훌륭한책은 구성이 면밀하다. 세션에 대한 분활이나 레이아웃에 세심한 배려가 녹아들어 있다. 최고수준이 목차가 되고 최저수준이 본문의 내용이 된다.
아래 코드는 예제 코드 이다.
public boolean isValid(User user) {
return isUnique(user.username) && containsSpecialCharacters(user.password);
}
public boolean isUnique(String str) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for(int i=0; i<str.length(); i++) {
char currChar = str.charAt(i);
if(map.get(currChar) == null){
map.put(currChar, 1);
} else {
return false;
}
}
return true;
}
public boolean containsSpecialCharacter(String s) {
return (s == null) ? false : s.matches("[^A-Za-z0-9 ]");
}
코드에 요약성과 열람성을 가져다준다.
코드가 수준이 일치된 함수로 분활되어 있으면 요약성과 열람성을 동시에 충족한다. 같은 추상도를 처리하는 식으로 코드가 통일되어 있으면 코드는 막힘없이 흐르고 이해하기 쉽다.
합수를 구조화 하자.
추상화 수준을 일치시킨 작은 단계의 함수로 변환하자. 함수를 구조화하면 각 함수는 자신보다 한단계 낮은 수준의 함수를 호출하는 처리가 중심이 된다. 이처럼 다른 함수를 호출하는 코드로 구성된 함수를 composed method 라고 한다. composed method는 최대한 작은 단위로 쪼갠다. 처리가 한라인일지언정 함수로 만들어도 된다.
SLAP의 적용 범위
SLAP는 함수 뿐만 아니라 모듈등에도 적용이 된다. 높은 수준의 개념은 추상 클레스에서 낮은 수준의 개념은 상속클래스에서 갖게 하는 방법을 취할수도 있다.
SLAP의 순서
SLAP의 작업은 글을 쓸 때의 순서를 참고해 볼 수 있다. 글을 쓸때 ‘내용을 쓰는 것’ 과 ‘내용을 이해하기 쉽게 전하기 위한 구성을 생각하는 것’을 별개로 작업하는 데 있다. 이런 작업 구분은 코드를 작성할때도 마찬가지이다.
코드와 책의 유사성
책의 각구성 요소가 코드에서 어디에 해당하며, 훌륭한 코드를 만들려면 어떻게 해야 될지 고찰해본다
-
서문
서문에서는 책의 요지가 제시되며 거시적인 관점에서 책이 어떤 위치에 자리매김헀는지가 설명된다. 이는 코드에서 파일 첫머리의 주석에 해당한다. 주석에는 코드에 기술한 내용을 설명하고 해당 코드가 어느 프로젝트에 속하는지 명기한다.
-
목차
목차는 코드에서 함수의 일람에 해당한다. 그렇기 때문에 코드 첫머리에 함수 일람을 나열해야 한다는 주장도 있는데 요즘 IDE에서 잘 지원을해주고 있다.(인텔리제이의 Structure 와 이클립스에서 Outline 에서 볼수있다.)
-
섹션
책은 대개 여러 개의 섹션으로 구분된다. 코드에선 패키지명으로 섹션을 구분할수도 있겠다
-
장
책의 장은 자기 완결된 한 덩어리의 내용에 적절한 제목을 붙인 것이다. 이는 코드에 함수에 해당한다.
-
단락
책의 단락은 코드의 블록에 해당한다. 책의 단락처럼 논리적인 묶음을 공백 구분으로 표현한다.
-
문장
책의 각 문장은 코드 하나하나의 구문에 해당한다. 책의 문장이 그렇듯이, 읽기 쉽게 하기 위해 하나의 문장은 가능한 짧고 하나의 사항만 작성하자.
-
상호 참조 및 색인
책의 상호 참조나 색인에 해당하는 것을 코드에서 작성할 필요는 없다 IDE나 편집기의 컨너뛰기 기능, 검색기능이 담당하는 영역이다.