포스트

2023-01-26-TIL

2023-01-26-TIL

Today I Learned

Helper Class

헬퍼 클래스는 어떤 기능을 돕기 위해 만든 클래스다. Wikipedia는 헬퍼 클래스를 애플리케이션이나 그 클래스를 쓰는 쪽의 주목적은 아니지만, 그 기능을 제공하는 데 도움을 주는 클래스라고 설명한다(Helper class). 예를 들어 주문 서비스 안에서 금액 반올림이나 날짜 포맷처럼 반복되는 처리를 따로 모아 둔 클래스가 여기에 해당한다. 헬퍼 클래스는 인스턴스를 만들 수 있고 상태(필드)를 가질 수도 있다.

  • https://www.geeksforgeeks.org/java-helperclass/
  • https://www.tutorialspoint.com/how-to-create-your-own-helper-class-in-java
  • https://stackoverflow.com/questions/2135775/what-are-helper-objects-in-java
  • http://minsone.github.io/programming/what-is-helper-class
  • https://epdev.tistory.com/46
  • https://overface.tistory.com/436
  • https://zetawiki.com/wiki/%ED%97%AC%ED%8D%BC_%ED%81%B4%EB%9E%98%EC%8A%A4
  • https://en.wikipedia.org/wiki/Helper_class

Utility Class

같은 문서는 유틸리티 클래스를 모든 메서드가 static인 헬퍼 클래스의 특수한 경우로 본다. 즉 둘의 차이는 상태와 인스턴스다. 헬퍼 클래스는 객체로 만들어 쓸 수 있지만, 유틸리티 클래스는 상태 없이 static 메서드만 모아 둔다.

JDK에도 유틸리티 클래스가 많다. java.util.Collections의 Javadoc 첫 문장은 이 클래스가 컬렉션을 다루거나 돌려주는 static 메서드로만 이루어져 있다고 적는다(Collections). 유틸리티 클래스는 인스턴스를 만들 이유가 없으므로 보통 생성자를 private으로 막는다.

1
2
3
4
5
6
7
public final class PriceUtils {
    private PriceUtils() {}

    public static long roundToHundreds(long price) {
        return Math.round(price / 100.0) * 100;
    }
}
  • https://stackoverflow.com/questions/12192050/what-are-the-differences-between-helper-and-utility-classes

Utility Class is Bad?

유틸리티 클래스를 피하라는 주장도 있다. Yegor Bugayenko는 유틸리티 클래스가 데이터를 받아 처리하는 절차적 코드일 뿐 객체가 아니라고 본다.

“Utility classes are not proper objects; therefore, they don’t fit into object-oriented world.”

대안으로 NumberUtils.max(10, 5) 대신 new Max(10, 5).intValue()처럼 동작 자체를 객체로 만드는 방식을 제안한다(OOP Alternative to Utility Classes). 첫 번째 링크는 이 글의 한국어 번역이다.

내 생각에 핵심은 static 메서드 자체보다 “어디에도 속하지 않는 로직이 한 클래스에 계속 쌓이는 것”이다. Collections처럼 범용적이고 상태가 없는 연산은 유틸리티로 두어도 문제가 적다. 반면 OrderUtils처럼 특정 도메인의 규칙이 유틸리티로 빠져나가면, 그 규칙은 원래 주인이어야 할 도메인 객체의 메서드가 되는 편이 낫다. static 메서드는 다형성으로 교체하기 어려워 테스트에서 대체하기 힘들다는 점도 함께 고려할 만하다.

  • https://www.mimul.com/blog/oop-alternative-to-utility-classes/
  • https://www.jmgundersen.net/blog/utility-and-helper-classes-a-code-smell
참고한 자료외부 출처 3

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다