💡 이 장에서 다루는 내용
- 깔끔한 추상화 계층을 통해 문제를 하위 문제로 세분화하는 방법
- 추상화 계층이 코드 품질의 요소를 달성하는 데 어떻게 도움이 되는지
- API 및 구현 세부 사항
- 함수, 클래스 및 인터페이스를 사용해 코드를 추상화 계층으로 나누는 방법
📑 널값 및 의사코드 규약
◼ 널 값의 Conflict
- 값이 제공되지 않거나 함수가 원하는 결과를 반환할 수 없는 경우가 자주 발생하기 때문에 '값이 없다' 또는 '부재한다'는 개념은 유용하다.
- 값이 널일 수 있거나 널이면 안되는 경우가 항상 명백한 것은 아니라서 문제가 발생한다. 개발자들은 변수에 액세스 전 널값 확인을 자주 잊어버린다.
이 책에서의 의사코드는 널 안전성이 있다고 가정한다. 데이터 유형 이름 끝에 '?'가 붙어 있으면 널값을 가질 수 있다는 의미이다.이 때엔 널값 여부를 확인하지 않고서는 사용할 수 없도록 컴파일러가 강제한다.
📑 2.2 왜 추상화 계층을 만드는가?
◼ 추상화 계층(layer of abstraction)
- 서버에 메시지를 보낼 때, 다른 개발자가 이미 작성한 하위 문제에 대한 해결책을 재사용할 수 있다. 간결한 추상화 계층은 상위 문제를 해결하기 위해 몇 가지 개념만 알면 된다는 것을 의미한다.
◼ 추상화 계층 및 코드 품질의 핵심 요소
- 가독성
- 모듈화
- 재사용성 및 일반화성
- 테스트 용이성
📑 2.3 코드의 계층
◼ 대부분의 프로그래밍 언어는 코드를 다른 단위로 나누기 위해 아래 요소를 자유롭게 사용할 수 있다.
- 함수
- 클래스(or 구조체 or 믹스인)
- 인터페이스
- 패키지,네임스페이스,모듈
◼ API 및 구현 세부 사항
- 코드를 호출할 때 볼 수 있는 내용
- 퍼블릭 클래스,인터페이스 및 함수(메서드)
- 이름, 입력 매개변수 및 반환 유형이 표현하고자 하는 개념
- 코드 호출 시 코드를 올바르게 사용하기 위해 알아야 하는 추가 정보(예:호출 순서)
- 코드를 호출할 때 볼 수 없는 내용
- 구현 세부 사항 (어떤 코드를 호출하는 쪽에서 그 코드에 대해 알고 있는 사항을 공개 API라고 할 수 있다. API로 공개되지 않은 내용은 구현 세부 사항이다.)
◼ 함수
- 어떤 로직은 새로운 함수로 구현하면 대부분 유익하다.
- 각 함수에 포함된 코드가 하나의 잘 써진 짧은 문장처럼 읽히면 이상적이다.
- 문장을 만들기 어렵거나 너무 어색하면 함수가 너무 길다는 것을 의미하고 더 작은 함수로 나누는 것이 유익하다.
- 함수를 작게 만들고 수행하는 작업을 명확하게 하면 가독성,재사용성이 높아진다.
◼ 클래스
클래스는 응집력(한 클래스 내의 모든 요소들이 얼마나 잘 속해 있는지)이 있어야 하고. 한가지 일에만 관심을 가져야 한다. 클래스를 작성할 때에는 아래 요소를 고려해아한다.
- 코드 가독성 : 단일 클래스에 담겨있는 개념이 많을 수록 해당 클래스 가독성은 저하된다.
- 코드 모듈화 : 클래스 및 인터페이스 사용.
- 코드 재사용성 및 일반화 : 두 하위 문제에 대한 해결책은 분리하자.
- 테스트 용이성 및 적절한 테스트 : 로직을 여러 클래스로 나누면 테스트하기 쉬워진다.
◼ 인터페이스
- 계층사이를 뚜렷이 구분하고 구현 세부 사항이 계층 사이에 유출되지 않도록 하기 위해 사용할 수 있는 접근법은 어떤 함수를 외부로 노출할 것인지를 인터페이스를 통해 결정하는 것이다.
- 하나의 추상화 계층에 대해 두 가지 이상의 다른 방식으로 구현을 하거나 향후 다르게 구현할 것으로 예상되는 경우 인터페이스를 정의하는 것이 좋다.
- 주어진 하위 문제에 대해 둘 이상의 서로 다른 구체적인 구현이 가능하고 이들 구현 클래스 사이에 전환이 필요할 때는 추상화 계층을 나타내는 인터페이스를 정의하는 것이 가장 좋다. 이를 통해 코드를 더욱 모듈화할 수 있고 재설정도 훨씬 쉽게 할 수 있다.
◼ 층이 너무 얇아질 때
코드를 별개의 계층으로 세분화하면 장점이 많지만 다음과 같은 추가 비용이 발생한다.
- 클래스 정의,의존성 임포트 시 반복적 코드 사용으로 코드 양이 늘어난다.
- 로직의 이해를 위해 파일이나 클래스를 따라갈 때 더 많은 노력이 필요하다.
- 인터페이스 뒤에 계층을 숨기게 되면 로직이해,디버깅에 어려움이 따를 수 있다.
=> 자신이 만든 계층이 코드의 가독성을 높이고, 재사용할 수 있고, 일반화할 수 있으며, 모듈화되고, 테스트를 용이하게 하는지를 스스로 판단하고 신중하게 생각해 보아야 한다.
◼ 마이크로서비스는 어떤가?
- 마이크로 서비스 아키텍처 : 시스템이 여러 개의 소규모 프로그램으로 분할어 특정 작업만 전문적으로 수행한다. 이런 소규모 프로그램은 API를 통해 원격으로 호출할 수 있는 전용 서비스로 배포된다.
마이크로서비스는 시스템을 분리하여 모듈화할 수 있는 매우 좋은 방법이지만, 서비스를 구현하기 위해 여러 하위문제를 해결해야 한다. 그러므로 올바른 추상화 및 코드 계층을 만드는 것은 여전히 중요하다.
📔 요약
- 코드를 깨끗하고 뚜렷한 추상화 계층으로 세분화하면 가독성, 모듈화, 재사용, 일반화 및 테스트 용이성이 향상된다.
- 함수, 클래스 및 인터페이스를 사용하여 코들르 추상화 계층으로 나눌 수 있다.
- 코드를 추상화 계층으로 분류하는 방법을 결정하려면 해결 중인 문제에 대한 판단과 지식을 사용해야 한다.
- 너무 비대한 계층 때문에 발생하는 문제는 너무 얇은 계층 때문에 발생하는 문제보다 더 심각하다. 확실하지 않은 경우에는 남용의 위험에도 불구하고 계층을 얇게 만드는 것이 좋다.
'좋은코드' 카테고리의 다른 글
[Good Code,Bad Code] Chapter1 - 코드 품질 (0) | 2023.10.20 |
---|