함수를 만드는 첫째 규칙, '작게!'. 둘째 규칙, '더 작게!'
if문 / else 문 / while 문 등에 들어가는 블록은 한 줄이어야 한다.
대게 거기서 함수를 호출한다. 그러면 바깥을 감싸는 함수가 작아지며, 블록 안에서 호출하는 함수 이름을 적절히 짓는다면 코드를 이해하기도 쉬워진다.
이 말은 중첩 구조가 생길만큼 함수가 커져서는 안 된다는 뜻이다.
함수에 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다. 그래야 함수가 읽고 이해하기 쉬워진다.
함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.
여기서 한 가지의 기준이 무엇인가?
지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다.
함수가 '한 가지'만 하는지 판단하는 방법은 하나 더 있다.
단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.
함수가 확실히 '한 가지' 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다.
한 함수 내에 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈린다.
특정 표현이 근본 개념인지 세부사항인지 구분하기 어려운 탓이며, 이 둘이 뒤섞기 시작하면, 사람들이 함수에 세부사항을 점점 더 추가한다.
코드는 위에서 아래로 이야기처럼 읽혀야 좋다.
위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한 번에 한 단계씩 낮아진다.
다르게 표현하면, 일련의 TO 문단을 읽듯이 프로그램이 읽혀야 한다는 의미이다.
추상화 수준이 하나인 함수를 구현하기란 쉽지 않다. 그렇지만 매우 중요한 규칙이다. 핵심은 짧으면서도 '한 가지'만 하는 함수이다.
Clean Code를 읽으며, 추상화 수준?에 대해 언급이 나온다.
이에 대해 좀 더 알아보기로 하기 위해 잠시 책을 덮었다.
추상화는 객체지향 프로그래밍의 특징 중 하나(추상화, 상속, 다형성, 캡슐화)이다.
이는 현실 세계의 복잡한 개념을 단순화하여 소프트웨어 시스템에 반영하는 과정이다.
핵심적인 속성이나 동작에만 집중하고, 불필요한 세부 사항은 감추는 것을 의미한다.
이 추상화는 복잡한 시스템을 단순화하고, 코드의 재사용성과 유연성을 높이는 데 중요한 OOP의 특징이며, 개발자는 시스템의 핵심 기능에 집중할 수 있고 시스템의 유지보수와 확장이 더 쉬워진다.
추상화 수준이란 코드의 각 부분이 얼마나 구체적이거나 추상적인지를 나타내는 척도이다.
높은 추상화 수준
코드가 시스템의 큰 그림이나 전체적인 개념을 다루는 경우이다.
시스템의 주요 개념, 데이터 흐름, 비즈니스 로직 등이 포함되며 예를 들어 다음과 같다.
사용자로부터 입력을 받아 처리한 후 결과를 반환한다.
낮은 추상화 수준
코드가 세부적인 구현, 특정 기능이나 알고리즘의 작동 방식을 설명하는 경우이다.
구체적인 변수 조작, 데이터 구조, 알고리즘 구현 등이 포함된다. 예를 들어 다음과 같다.
리스트의 각 요소를 순회하면서 해당 요소를 제곱한 후, 결과를 새로운 리스트에 저장한다.