1. 왜 추상화 레벨을 통일해야 하는가?
- 함수를 계층처럼 나누어서 사용하면 가독성이 높아진다
- 이러한 맥락에서 함수를 높은 레벨과 낮은 레벨로 구분해서 사용해야 한다는 원칙이 바로 추상화 레벨 통일(Single Level of Abstraction, SLA) 원칙이다
// Bad - 추상화 레벨 통일 이전
class CoffeeMachine {
fun makeCoffe() {
// 수백 개의 변수 선언
// 복잡한 로직 처리
// 낮은 수준의 최적화
}
}
// Better - 추상화 레벨 통일 이후
class CoffeeMachine {
fun makeCoffe() {
boilWater()
brewCoffee()
pourCoffee()
pourMilk()
}
}
2. 추상화 레벨을 통일을 위한 규칙
- 객체의 메서드를 호출하거나 객체를 인자로 전달할 수는 있지만, 둘을 함수 내부에서 섞어서 사용하면 안 된다
- 이를 어기면 낮은 수준의 호출과 높은 수준의 호출이 공존하게 되고, 메서드 이름 사이의 불일치로 이어져서 가독성이 떨어진다
- 따라서 함수 내에선 "호출" 또는 "전달" 중 한 가지만 이루어져야 한다
2. 예시
// Bad
function average(arr: number[]) {
// sum(arr) -> 전달, arr.length -> 호출
return sum(arr) / arr.length;
}
// Good
function average(arr: number[]) {
return sum(arr) / size(arr);
}
// Bad
function draw() {
let canvas = document.getElementById("GameCanvas") as HTMLCanvasElement;
let g = canvas.getContext("2d");
g.clearRect(0, 0, canvas.width, canvas.height); // g의 메서드를 호출
drawMap(g); // g가 인자로 전달
drawPlayer(g); // g가 인자로 전달
}
// Good
function draw() {
let g = createGraphics(); // 별도의 함수로 분리(함수의 책임 최소화) + 의미있는 함수명 + 함수 내부에서 "전달"만 하도록 수줭
drawMap(g);
drawPlayer(g);
}
이와 같이 추상화 레벨을 맞출 땐 필연적으로 함수명을 잘 지어야 한다. 아래는 좋은 함수 이름의 속성이다.
- 함수의 의도를 설명해야 함 (투명함)
- 함수가 하는 모든 것을 담아야 함 (완전함)
- 도메인에서 일하는 사람이 이해할 수 있어야 함 (이해가능함)
3. 참고
- 이팩티브 코틀린 (마르친 모스칼라 저)
- 파이브 라인스 오브 코드 (크리스천 클라우젠 저)
'etc' 카테고리의 다른 글
[메모] Kotlin Controller 통합 테스트 참고 자료 모음 (0) | 2022.09.27 |
---|---|
[메모] 서킷브레이커 공부용 자료 모음(한글) (0) | 2022.09.22 |
[정리] 못하지 않는 개발자 되기 (4) | 2022.08.29 |
[CLI] 터미널 기초 (0) | 2021.02.18 |
[PHP] PHP보안 - filtering, escaping (0) | 2021.02.01 |