규칙 1 : 한 메서드에 오직 한 단계의 들여쓰기만 한다.
- 각 메서드가 정확히 한 가지 일을 하는지, 즉 메서드 당 하나의 제어 구조나 하나의 문장 단락(block)으로 되어 있는지를 지키려고 노력
class Borad {
String borad() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
buf.append(data[i][j]);
}
buf.append("/n");
}
return buf.toString();
}
}
class Borad {
String borad() {
StringBuffer buf = new StringBuffer();
collectRows(buf);
return buf.toString();
}
private void collectRows(StringBuffer buf) {
for (int i = 0; i < 10; i++) {
collectRow(buf, i);
}
}
private void collectRow(StringBuffer buf, int row) {
for (int i = 0; i < 10; i++) {
buf.append(data[row][i]);
}
buf.append("/n");
}
}
규칙 2 : else 예약어 금지
public void endMe() {
if (status == DONE) {
doSomething();
} else {
// 다른코드
}
}
public void endMe() {
if (status == DONE) {
doSomething();
return;
}
// 다른코드
}
public Node head() {
if (isAdvancing()) {
return first;
} else {
return last;
}
}
public Node head() {
return isAdvancing() ? first : last;
}
규칙 3 : 원시값과 문자열의 포장
- 원시형 변수로는 컴파일러가 의미적으로 맞는 프로그램 작성을 안내할 수 없다.
- 객체로라면 아주 사소하더라도 컴파일러와 프로그래머에게 그 값이 어떤 값이며, 왜 쓰고 있는지에 대한 정보를 전하는 셈이다.
규칙 4 : 한 줄에 한 점만 사용
- 종종 하나의 동작에 대해 어떤 객체가 맡고 있는지 구분하기 어려울 때가 있다.
- 어떠한 코드 한 줄에서라도 점이 하나 이상 있으면 그른 곳에서 동작이 일어나고 있다는 뜻이다.
class Board {
class Piece {
String representation;
}
class Location {
Piece current;
}
String boardRepresentation() {
StringBuffer buf = new StringBuffer();
for (Location l : squares()) {
buf.append(l.current.representation.substring(0, 1));
}
return buf.toString();
}
}
class Board {
class Piece {
String representation;
String character() {
return representation.substring(0, 1);
}
void addTo(StringBuffer buf) {
buf.append(character());
}
}
class Location {
Piece current;
void addTo(StringBuffer buf) {
current.addTo(buf);
}
}
String boardRepresentation() {
StringBuffer buf = new StringBuffer();
for (Location l : squares()) {
l.addTo(buf);
}
return buf.toString();
}
}
규칙 5 : 축약 금지
왜 축약을 하고 싶은지 생각해 보라.
- 계속 반복해서 똑같은 단어를 치기 때문 -> 메서드가 너무 대대적으로 사용되어 중복을 없앨 기회
- 메서드 이름이 길어지고 있기 때문 -> 책임 소재의 오류나 클래스의 부재
클래스와 메서드 이름을 한두 단어로 유지하려고 노력하고 문맥을 중복하는 이름을 자제하자.
클래스 이름이
Order
라면shipOrder
라고 메서드 이름을 지을 필요가 없다. 짧게ship()
이라고 하면 클라이언트에서는order.ship()
라고 호출하며, 간결한 호출의 표현이 된다.
규칙 6 : 모든 엔티티를 작게 유지
- 50줄 이상 되는 클래스와 파일이 10개 이상인 패키지는 없어야 한다는 뜻
- 클래스가 점점 작아지고 하는 일이 줄어 들며 패키지 크기를 제한함에 따라 패키지가 하나의 목적을 달성하기 위해 모인 연관 클래스의들의 집합을 나타낸다는 사실을 알아차리게 된다.
- 패키지도 클래스처럼 응집력 있고 단일한 목표가 있어야 한다. 패키지를 작게 유지하면 패키지 자체가 진정한 정체성을 지니게 된다.
규칙 7 : 2개 이상의 인스턴스 변수를 가진 클래스 사용 금지
String first;
String middle;
String last;
class Name {
Surname family;
GivenNames given;
}
class Surname {
String family;
}
class GivenNames {
List<String> names;
}
규칙 8 : 일급 콜렉션 사용
- 콜렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다.
규칙 9 : 게터 / 세터 / 속성 사용 금지
출처
'공부' 카테고리의 다른 글
JVM (3) | 2019.04.07 |
---|---|
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); 를 하는 이유 .. (0) | 2019.03.06 |
AssertJ, JUnitSoftAssertions (0) | 2019.01.18 |
접근 제어자 (0) | 2019.01.17 |
다형성 Polymorphism (0) | 2019.01.16 |