비즈니스 요구사항 영화관에 입장하는 관객의 초대권을 확인하고, 만약 초대권이 없다면 티켓 구매 후 입장을 시키고, 초대권이 있다면 티켓으로 바꿔준 후 입장 시킨다. 객체 지도 설계 객체와 자료 구조 객체 : private 형식의 변수와 함수가 존재하는 클래스 자료 구조 : public 형식의 변수만 가지고 있고, 함수가 없는 클래스 변수를 private 접근 제한자로 선언하는 이유는 남들이 변수에 의존하지 않게 만들고 싶어서이다. 그런데 웃긴점은 우리는 자연스럽게 getter/setter 함수를 public 하게 선언하여 외부에 노출한다. 과연 이것이 맞는것일까? OOP 스러운 클래스는 추상 인터페이스를 제공해 클래스의 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야하는 것이 진정한 의미의 클래..
의미있는 이름(Meaningful Names) 독자의 입장에서 고려하자. gubun, gbn, sabun, yuji 등 변수명만을 보고 어떤 데이터를 저장하고 있는지 예측이 되는가? 첫 번째 규칙: 의도를 분명히 밝혀라. 코드의 저자의 의도가 명확하게 파악된다. 코드가 위에서 아래로 술술 읽힌다. 코드의 맥락이 명시적이다. 두 번째 규칙: 그릇된 정보를 피하라. 세 번째 규칙: 의미있게 구분하라. 네 번째 규칙: 발음하기 쉬운 이름으로 정하자. 다섯 번째 규칙: 검색하기 쉬운 이름을 사용하자. 로그 검색 용이성 여섯 번째 규칙: 타입과 관련된 문자열을 넣지 말아라. 일곱 번째 규칙: 한 개념에 한 단어를 사용하라. 일관성있는 어휘를 선택해서 이름을 붙이자. ex) Controller-fetch, Serv..
한 가지만 해라! 함수는 한 가지만을 잘 해야한다. 여기서 함수가 한 가지만 하는지 판단하는 방법은 다음과 같다. 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다. 단순히 다른 표현이 아니라 의미있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다. 함수당 추상화 수준은 하나로! 함수가 확실히 한 가지 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다. 왜냐하면, 한 함수 내에서 추상화 수준을 섞으면 특정 표현이 근본 개념인지 아니면 세부사항인지 구분하기 어려운 탓이다. 또한 근본 개념과 세부사항을 뒤섞기 시작하면, 깨진 창문처럼 사람들이 함수에 세부사항을 점점 더 추가한다. 다음 코드는 함수 내 추상화 수준이 동일하지 않은 코드다. public ..
의도를 분명히 밝혀라 코드 맥락이 코드 자체에 명시적으로 드러날 수 있게 하자 다음 코드는 코드가 하는 일을 짐작하기 어렵다. private List theList = new ArrayList(); public List getThem() { List list1 = new ArrayList(); for (int[] x : theList) { if (x[0] == 4) { list1.add(x); } } return list1; } 하지만 아래와 같이 단순히 이름만 고치면 함수가 하는 일을 이해하기 쉬워진다. public static final int STATUS_VALUE = 0; public static final int FLAGGED = 4; private List gameBoard = new Arra..