📌 4장 주석
- 주석 사용 이유 : 코드로 의도를 표현하지 못해, 실패를 만회하기 위해 사용
- 코드는 변화하기 때문에, 주석이 점점 코드에서 분리될 수 있다. 주석을 가능한 줄이도록 노력한다.
주석은 나쁜 코드를 보완하지 못한다
코드로 의도를 표현하라
// 직원에게 복지 혜택을 받을 자격이 있는지 검사한다.
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)){}
// 코드로 의도 표현
if (employee.isEligibleForFullBenefits())
좋은 주석
- 법적인 주석 : 저작권 정보, 소유권 정보
- 정보를 제공하는 주석 : ex. 정규 표현식이 시각과 날짜를 뜻하는 것을 명한다.
// kk:mm:ss EEE, IWI dd, yyyy 형식이다. Pattern timeMatcher = Pattern.compile(
:"*\\d W,*\\w,*\\d "*\)\;d
- 의도를 설명하는 주석
- 의미를 명료하게 밝히는 주석
- 결과를 경고하는 주석 : ex. 특정 케이스(여유 시간이 충분하지 않은 경우)를 꺼야 하는 이유를 설명
- 굳이 주석을 사용하지 않아도 @Ignore 속성으로 테스트 케이스를 끌 수 있다.
- TODO 주석 : 앞으로 할 일
- 중요성을 강조하는 주석
- 공개 API에서 Javadocs
- 나쁜 주석
- 대다수 주석은 나쁜 주석
- 주절거리는 주석
- 같은 이야기를 중복하는 주석
- 오해할 여지가 있는 주석
- 의무적으로 다는 주석
- 이력을 기록하는 주석
- 있으나 마나 한 주석
- 무서운 잡음
- 함수나 변수로 표현할 수 있으면 주석을 달지 마라
- 위치를 표현하는 주석
- 닫는 괄호에 다는 주
- 주석으로 처리한 코드
- HTML 주석 : 읽기 어렵다.
- 전역 정보 : 주석은 근처에 있는 코드만 기술
- 너무 많은 정보
- 모호한 관계
- 함수 헤더
- 비공개 코드에서 Javadocs
📌 5장 형식 맞추기
형식을 맞추는 목적
적절한 행 길이를 유지하라
- 대부분 200줄의 코드인 파일로도 커다란 시스템 구축이 가능하다.
신문 기사처럼 작성하라
- 위에서 아래로 내려갈수록 의도를 세세하게 묘사한다.
개념은 빈 행으로 분리하라
- 빈 행 : 새로운 개념을 시작하는 시각적 단서
세로 밀집도
- 서로 밀집한 코드 행은 세로로 가까이 놓아야 한다.
public class ReporterConfig {
/**
* 리포터 리스너의 클래스 이름
*/
private String m_className;
/**
* 리포터 리스너의 속성
*/
private List<Property> m_properties = new ArrayList<Property>(); public void addProperty(Property property) {
m_properties. add (property);
}
// 변경 후
public class ReporterConfig {
private String m_className;
private List<Property> m_properties = new ArrayList<Property>();
public void addProperty(Property property) { m_properties. add(property);
} }
수직 거리
- 서로 밀접한 개념은 세로로 가까이 위치하도록 한다.
- 멀리 떨어져 있으면 소스 파일과 클래스를 여기저기 뒤져야하는 불편함이 생긴다.
- 변수 선언 : 변수를 사용하는 위치에 최대한 가까이 선언
- 인스턴스 변수 : 클래스 맨 처음에 선언
- 종속 함수 : 종속되는 2개의 함수는 세로로 가까이 배치한다.
- 가능한 호출하는 함수를 호출되는 함수보다 먼저 배치한다.
- 개념의 유사성 : 개념적인 친화도가 높을수록 코드를 가까이 배치한다.
- 세로 순서 : 가장 중요한 개념을 먼저 표현한다.
- 가로 형식 맞추기 : 하나의 행의 가로 길이는 짧을수록 좋다. 최대 120자가 넘지 않도록 한다.
- 가로 공백과 밀집도 : 공백을 사용해서 밀접한 개념과 느슨한 개념을 표현한다.
- 들여쓰기 : scope(범위)를 표현하기 위해 코드를 들여쓴다.
팀 규칙
- 어디에 괄호를 넣을지
- 들여쓰기는 몇 자리로 할지
- 클래스, 변수, 메서드 이름 규칙
📌 6장 객체와 자료구조
자료 추상화
- 변수를 의존하지 않게 만들기 위해 private 사용
- get(조회), 설정(set)은 왜 public 인지?
- 변수를 private 으로 선언해도, 조회와 설정을 공개하면 구현을 외부로 노출하게 된다.
- 구현을 감추기 위해서는 추상화 필요. 추상 인터페이스 제공
자료/객체 비대칭
- 객체 : 추상화 뒤로 자료를 숨기고 자료를 다루는 함수만 공개
- 자료구조 : 자료를 그대로 공개하고 별다른 함수는 제공하지 않는다.
디미터 법칙
- 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
- 객체는 자료를 숨기고, 함수를 공개한다.
- 기차 충돌 : 여러 함수를 이어서 호출한 것은 이어진 기차로 보여진다.
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
// 기차 충돌 개선
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
- 하지만, 위의 ctxt, Options, ScratchDir가 객체면 디미터 법칙을 위반한다.
- 아래처럼 구현하면 디미터 법칙을 거론할 필요가 없다.
final String outputDir = ctxt.options.scratchDir.absolutePath;
자료 전달 객체
- 자료 구조체, 자료 전달 객체 DTO(Data Transfer Object) : 공개 변수만 있고, 함수가 없는 클래스
- 데이터 베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 구조체
- 빈(Bean) : 구조 좀 더 일반적인 형태
- private 변수를 조회/설정 함수로 조작한다.
- 활성 레코드 : DTO 의 특수한 형태
- save, find 와 같은 탐색 함수도 제공한다.
- 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한다.
- 활성 레코드는 자료 구조로 취급한다.
- 비즈니스 규칙을 담고, 내부 자료를 숨기는 객체는 따로 생선한다.
결론
- 객체는 동작을 공개하고 자료를 숨긴다.
- 어떤 시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체
- 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 적합하다.