[객체지향 생활체조 원칙] 규칙 4. 한 줄에 점을 하나만 찍는다.
본문 바로가기
OOP

[객체지향 생활체조 원칙] 규칙 4. 한 줄에 점을 하나만 찍는다.

by IYK2h 2022. 11. 7.
728x90

한 줄에 점을 하나만 찍는다.

디미터(Demeter)의 법칙 : "친구하고만 대화하라"

"자기 소유의 장난감, 자기가 만든 장난감, 그리고 누군가 자기에게 준 장난감하고만 놀 수 있다. 하지만 절대 장난감의 장난감과 놀면 안 된다."

그렇지 않을 경우, 다른 객체에 너무 깊숙이 관여하게 된다. 이는 캡슐화를 어기는 것이다.

즉, 한 객체가 너무 먼 객체를 불러와서 사용하는 것을 지양해야 한다.

코드를 작성할 때 한 라인에 점이 여러 개 생기면 대상 객체의 내부에 깊이 접근할 수 있다는 의미이고, 이는 강한 결합도가 형성되어있다는 것을 뜻하게 된다. 설계에 대한 고민을 해봐야 한다.

class Location {
    public Piece current;
}
​
class Piece {
    public String representation;
}
​
class Board {
    public String boardRepresentation() {
        StringBuilder buf = new StringBuilder();
​
        for (Location loc : squares()) {
            buf.append(loc.current.representation.substring(0, 1));
        }
​
        return buf.toString();
    }
}

Location에 접근한 다음 Piece에 접근하고, 그 다음엔 Piece의 representation에 접근하여 작업을 수행하고 있다. 이 코드는 한 줄에 한 점만 사용한다는 원칙과 꾀나 거리가 있다. 디미터의 법칙에 따라 아래와 같이 수정했다.

class Location {
    // private으로 변경하여 프로그래머가 뭔가 잘못을 저지를 가능성을 제거
    private Piece current;
​
    // 인스턴스에 작업을 요청해야 하므로 새로운 메서드 addTo()를 추가
    public void addTo(StringBuilder buf) {
        current.addTo(buf);
    }
}
​
class Piece {
    // private으로 변경하여 프로그래머가 뭔가 잘못을 저지를 가능성을 제거
    private String representation;
​
    // representation의 첫 문자를 가져오는 것이 꽤 좋아보인다. 이와 같은 변경을 통해 언젠가 해당 기능을 재사용할 수도 있게 되었다. 
    public String character() {
        return representation.substring(0, 1);
    }
​
    public void addTo(StringBuilder buf) {
        buf.append(character());
    }
}
​
class Board {
    public String boardRepresentation() {
        StringBuilder buf = new StringBuilder();
​
        for (Location location : squares()) {
            location.addTo(buf);
        }
​
        return buf.toString();
    }
}

즉, getter, setter 지양해 객체에 메시지를 보내야 한다.

getter, setter 을 사용해 접근한다면, 객체의 내부 필드에 접근하게 된다. 이는 현재 사용 중인 객체에 메시지를 보내는 것이 아닌, 내부에 존재하는 다른 객체에 접근해 대화하겠다는 의미가 된다.

클래스의 필드에 접근할 때 List나 Map과 같은 Collection 클래스를 getter로 불러와 처리를 하는 경우가 많다. 이렇게 자료구조에 접근을 할 때에도 생활체조 원칙을 위반하는 경우가 많은데, 이런 경우에는 일급컬렉션과 같은 도메인 오브젝트 설계를 활용하는 것이 좋다.

인용 : https://limdingdong.tistory.com/10?category=952711

728x90

댓글