본문 바로가기

공부

객체지향 생활 체조

규칙 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 : 게터 / 세터 / 속성 사용 금지

 

 

출처

객체지향 생활 체조 총정리 / developerFarm 개발자 농장


'공부' 카테고리의 다른 글

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