책너두 5기 13일차

로버트 C. 마틴의 클린코드 p.111 ~ p.122

내용 정리

5. 형식 맞추기

들여쓰기

계층에서 각 수준은 이름을 선언하는 범위이자 선언문과 실행문을 해석하는 범위이다. 들여쓰는 정도는 계층에서 코드가 자리잡은 수준에 비례한다. 들여쓰기한 파일은 구조가 한눈에 들어온다. 변수, 생성자 함수, 접근자 함수, 메서드가 금방 보인다.

들여쓰기 무시하기

한 행에 범위를 뭉뜽그린 코드를 피해야 한다. 간단한 if 문, 짧은 while 문 등에서도 마찬가지.

가짜 범위

빈 while문이나 for문은 피해야 한다. 필요하다면 빈 블록을 올바로 들여쓰고 괄호로 감싸야 한다.

팀 규칙

여러 사람이 함께 코드를 작성할 때는 정해진 팀 규칙을 지켜야 한다. 좋은 소프트웨어 시스템은 읽기 쉬운 문서로 이어진다. 스타일은 일관적이고 매끄러워야 한다.

6. 객체와 자료 구조

변수를 private(비공개)로 정의하는 이유는 남들이 변수에 의존하지 않게 만들고 싶어서다. 왜 많은 프로그래머들이 get(조회)함수와 set(설정)함수를 당연하게 public(공개)해 비공개 변수를 외부에 노출할까?

자료 추상화

자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. 아무 생각 없이 조회/설정 함수를 추가하는 방법은 나쁘지만, 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다.

1
2
3
4
public class Point {
    public double x;
    public double y;
}
1
2
3
4
5
6
7
8
public interface Point {
    double getX();
    double getY();
    void setCartesian(double x, double y);
    double getR();
    double getTheta();
    void setPolar(double r, double theta);
}

아래 코드는 점이 직표좌표계를 사용하는지 극좌표계를 사용하는지 알 길이 없다. 그럼에도 불구하고 인터페이스는 자료구조를 명백하게 표현한다.

1
2
3
4
public interface Vehicle {
    double getFuelTankCapacityInGallons();
    double getGallonsOfGasoline();
}
1
2
3
public interface Vehicle {
    double getPercentFuelRemaining();
}

두 예시 모두 위보단 아래 코드가 더 좋은 코드이다.

자료/객체 비대칭

객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다. 자료 구조는 자료를 그대로 공개하며 별다른 함수를 제공하지 않는다. 두 개념은 정반대다.

자료 구조를 사용하는 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.

이 반대도 참이다.

절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다. 객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.

다시 말해, 객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며, 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다.

새로운 자료 타입이 필요 => 클래스와 객체 지향 기법이 적합

새로운 함수가 필요 => 절차적인 코드와 자료 구조가 적합

읽고 나서

오늘 부분은 조금 어려웠다. 아무래도 코드의 문법에 대한 지식이 부족해서 그런가.. 그래도 하고자 하는 말은 파악은 되었다. 자료는 세세하게 공개하기 보단 추상적으로 표현하자. 절차적인 코드와 객체 지향 코드는 각 장단점이 있다.