본문 바로가기

Java

디미터의 법칙

디미터의 법칙은 객체에게 자료를 숨기는 대신 함수를 공개하도록 하는 것입니다.

즉, 디미터의 법칙은 다른 객체가 어떠한 자료를 가지고 있는지 몰라야 한다는 것을 의미합니다. 이는 직관적으로 이해하기 위해 여러개의 점(.)을 사용하지 말아야 한다는 법칙으로도 유명합니다.

TDD, Clean Code With Java 17기 과정을 들으면서 많은 것을 배우고 있습니다.

특히, 어떻게 클린 코드를 작성할 수 있을까를 많이 배우면서 지저분한 코드를 리팩토링 하고 테스트 코드를 작성하고 있습니다.

이번 미션을 진행하던 중 그동안 작성해왔던 코드의 큰 문제점을 발견하게 되었습니다.

문제점

디미터 법칙을 위반하는 코드

List<Car> cars = new ArrayList();

for (int i = 0; i < names.getValue().size(); i++) {
      cars.add(new Car(names.getValue().get(i), new Position(DEFAULT_POSITION)));
  }

위 코드의 가장 큰 문제점은 객체의 내부 구조가 getter를 통해 외부로 노출된다는 점입니다.

위 코드만 보더라도 다음의 객체가 노출되게 됩니다.

public class Names {
	private List<Name> value;
	
	public List<Name> getValue() {
		return this.value;
	}
}

해결책

디미터 법칙을 준수하는 코드

for (int i = 0; i < names.size(); i++) {
    cars.add(new Car(names.getName(i), new Position(DEFAULT_POSITION)));
}

names.getValue().size() 대신, names.size() 라는 메서드를 새로 만들어서, Names의 value에 해당하는 사이즈를 리턴하도록 만들었고, names.getValue().get(i) 대신, names에서 바로 Name을 반환하도록 새로운 메서드를 만들어주었습니다.

이를 통해 객체의 내부 구조를 외부로 반환하지 않는 구조로 만들 수 있었습니다.

'Java' 카테고리의 다른 글

어떻게 JVM은 메모리를 관리할까  (0) 2024.01.13
Spring Test - H2 적용하기  (0) 2023.10.31
[JUnit5] @ParameterizedTest  (0) 2023.10.30
Java Record  (0) 2023.10.23
== & Equals  (0) 2023.10.15