-
디미터의 법칙코드 성장 이야기/박재성 - 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 책
내 경험
반응형'코드 성장 이야기 > 박재성 - TDD, Clean Code with java- 10기' 카테고리의 다른 글
내가 생각하는 TTD란 (0) 2021.01.16 함수(메소드) (0) 2020.12.02 이름 짓는 방법 (0) 2020.12.02 gitHub 주소 (0) 2020.12.02 수업을 진행하면서 지켜야할 기본 규칙 9가지 (0) 2020.11.24