ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 디미터의 법칙
    코드 성장 이야기/박재성 - TDD, Clean Code with java- 10기 2020. 12. 11. 12:33
    반응형

    디미터의 법칙은?

    • 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다.
    • 객체는 자료를 숨기고 함수만 공개한다.
      • 객체는 조회함수로 내부구조를 공개하면 안된다.

    위의 말이 한마디로 말하면 '메소드만 호출만 하면 내가 원하는 기능을 해줘'다. 즉 하나의 기능에 해당되는 객체에 모든 권한을 주고, 실행만 하는 것이다. 

     

    디미터의 법칙을 지키게된다면 많은 이점이 있는데

     

    현재 내가 생각하는 장점은 아래와 같다.(2020-12-11일 기준)

    • 한 곳만 수정을 하게 되면 다른 곳을 수정할 필요가 없다.
    • 객체 지향 5대원칙 중 단일책임 원칙 준수 가능
      • 단일책임원칙 : 클래스나 메소드는 하나의 책임만 가져야 한다.

     

    위의 내용을 바탕으로 코드로 설명을 하겠다.

     

    코드

    디미터의 법칙 적용 전 Typhoon

    public class Typhoon {
    
        private String typhoonCode; // 태풍 코드
        private Location location;
        private List<Rain> rainList; // 강우량에 대한 보정값 (타입이 여러개)
    
        public Typhoon(String typhoonCode, Location location) {
            chcekTyphoonCode(typhoonCode);
            initTyphoon(typhoonCode);
    
            this.location = location;
            this.typhoonCode = typhoonCode;
        }
    
        private void initTyphoon(String typhoonCode) {
            // 1. DB에서 시군구코드에 맞는 계수들과 강우를 가지고옴
            //   - 계수의 type은 지역별로 여러개가 존재
            // 2. 위의 계수에 맞게 강우량의 보정값을 계산
    
            List<RainType> typeList = new ArrayList<>(); // 위의 1번의 행위를 진행
    
            for (RainType rainType : typeList) {
                // 위의 2번의 행위를 진행
            }
        }
    
        private void chcekTyphoonCode(String typhoonCode){
            // typhoonCode 체크
        }
        
        // getter() 코드들 생략
    }

     

     

    public class Rain {
    
        private String type;
        private String sigunguCode;
        private int correctionRainfall;
    
        public Rain(String type, String sigunguCode, int correctionRainfall) {
            this.type = type;
            this.sigunguCode = sigunguCode;
            this.correctionRainfall = correctionRainfall;
        }
    
        public String getType() {
            return type;
        }
    
        public String getSigunguCode() {
            return sigunguCode;
        }
    
        public int getCorrectionRainfall() {
            return correctionRainfall;
        }
    }

     

    위의 코드에서 충북 단양의 데이터를 조회한다면 아래와 같이 조회를 할 수 가 있다. 

        (원하는 데이터를 조회하기 위해서는 filter를 거쳐야 한다.)

     

    public static void main(String[] args) {
        Location location = new Location(); //데이터가 존재한다고 가장
        Typhoon typhoon = new Typhoon("test1", location);
    
        List<Rain> rainList = (List<Rain>) typhoon.getRainList()
                .stream()
                .filter(rain -> rain.getSigunguCode().equals("43800"));
    }

     

    만약 위와 같은 코드들이 한 곳이 아니라 여러 곳에서 존재하고,  핵심적인 기능이 수정이 된다면

    사용한 모든 코드를 수정할 수 밖에 없는 상황이 된다. 이렇게 된다면 쓸데 없는 곳에 시간을 낭비하게 된다.

    이러한 행위들을 방지하기 위해서는 해당되는 조회기능을 아래와 같이 Typhoon의 객체에 넣으면 된다. 

     

    public class Typhoon {
    
        private String typhoonCode; // 태풍 코드
        private Location location;
        private List<Rain> rainList; // 강우량에 대한 보정값 (타입이 여러개)
    
        public Typhoon(String typhoonCode, Location location) {
            chcekTyphoonCode(typhoonCode);
            initTyphoon(typhoonCode);
    
            this.location = location;
            this.typhoonCode = typhoonCode;
        }
    
        private void initTyphoon(String typhoonCode) {
            // 1. DB에서 시군구코드에 맞는 계수들과 강우를 가지고옴
            //   - 계수의 type은 지역별로 여러개가 존재
            // 2. 위의 계수에 맞게 강우량의 보정값을 계산
    
            List<RainType> typeList = new ArrayList<>(); // 위의 1번의 행위를 진행
    
            for (RainType rainType : typeList) {
                // 위의 2번의 행위를 진행
            }
        }
    
        public List<Rain> searchArea(String sigunguCode) {
            return (List<Rain>) rainList
                    .stream()
                    .filter(rain -> rain.getSigunguCode().equals(sigunguCode));
        }
    
        private void chcekTyphoonCode(String typhoonCode) {
            // typhoonCode 체크
        }
    }

     

    Typhoon 객체가 모든 일을 담당하게 된다면 다른 사용자는 필요한 메소드만 호출해주면 된다는 것이다.

    이렇게 되면 객체에만 기능들이 존재하여 수정 및 리팩토링하기가 매우 쉬워진다는 것이다.

     

     

     

     

    참고

    박재성 - TDDTDD, Clean Code with Java 10기

    참고문서 - CleanCode 책 

    내 경험

    반응형
Designed by Tistory.