[Effective Java 3/E] ITEM 51. 메서드 시그니쳐를 신중히 설계하라

대연.

·

2021. 4. 14. 23:58

Effective Java 표지. Source : https://blog.insightbook.co.kr/

*알림 : *
Effective Java 3판은 Java 9까지 도입된 언어적 기능을 중심으로 서술되어 있습니다. 10버젼 이후의 Java 개발을 하시는 분들은 우회적인 접근법 대신 Java 언어 내 새로 도입된 기능이 더 간결하고 좋을 수 있습니다.

해당 포스팅은 SSAFY 내 책읽기 스터디의 활동을 통해 작성된 포스팅입니다.
https://github.com/kjsu0209/JavaBook
https://medium.com/javabook

 

JavaBook – Medium

Documentation space of our book study.

medium.com

 

kjsu0209/JavaBook

책읽기 스터디. Contribute to kjsu0209/JavaBook development by creating an account on GitHub.

github.com

메서드 이름을 신중하게 짓자.

  • 메서드 이름만 보고도 동작을 유추할 수 있도록
  • 같은 패키지에 있는 다른 메서드와 일관성
  • 개발자 커뮤니티에서 통용되는 convention 따르기
  • 긴 이름 피하기

편의 메서드를 너무 많이 만들지 말자

  • 메서드가 너무 많은 클래스는 쓰기 어렵고 유지보수하기 어렵고 문서화 하기 어렵고 기타 등등 힘들다!
  • 메서드는 각 기능을 완벽히 수행하는 메서드로 제공해야 한다.
  • 자주 쓰이는 경우에는 고려해보자.
  • 편의성 vs 복잡성의 문제다.

매개변수 목록은 짧게 유지하자.

  • 4개 이하가 좋다. 사람의 기억 능력엔 한계가 있다.
  • 참고하기 : [코싸인의 인지과학 이야기]
    기억(3) by 코싸인
  • 특히 같은 타입의 매개변수가 연속하여 위치한다면, 개발자가 실수로 순서를 바꿔서 사용할 가능성이 있으며 의도와 다른 엉뚱한 동작이 있을 수 있다.

매개변수 목록을 짧게 쪼개는 테크닉

  1. 여러 메서드로 쪼갠다List 인터페이스의 부분 리스트에서 주어진 원소의 인덱스를 찾는다고 가정하면, 매개변수는 리스트의 시작, 끝, 찾을 원소 총 3개의 매개변수를 필요로 할 것이다. 그러나 인터페이스를 잘 살펴보면
    1. 부분 리스트를 반환하는 subList
    2. 인덱스를 알려주는 indexOf 메서드
    3. 를 기술하고 있으며 각각 매개변수 2개, 1개로 쪼개서 메서드를 호출한 결과를 잘 버무리면 된다.
  2. 메서드가 많아질 걱정을 할 수도 있지만, 소프트웨어 공학적으로 널리 받아들여지는 개념인 직교성(Orthogonality)을 높여서 메서드를 줄일 수 있다.
  3. 매개변수 여러 개를 묶어주는 Helper 클래스를 만든다.
  4. 복수의 매개변수를 하나의 개념으로 묶을 수 있을 때 사용할 수 있다. 예를 들면 2차원 평면상의 좌표인 x,y를 Coordination이란 클래스로 묶을 수도 있고, 카드는 숫자와 무늬로 묶을 수도 있다. 일반적으로 정적 멤버 클래스로 두는 것이 좋다.
  5. 빌더 패턴을 이용한다.
    1. 모든 매개변수를 하나로 추상화한 객체를 만든다. (2번 테크닉에서 다룬 카드, 좌표 등)
    2. setter 메서드로 필요한 매개변수를 세팅
    3. execute 메서드로 설정한 매개변수의 유효성 검사
    4. 해당 객체를 넘겨 원하는 계산 수행
  6. 매개변수가 많지만 일부는 생략해도 좋을 때 사용할 수 있다.

매개변수의 타입으로는 클래스보다는 인터페이스가 낫다

  • Map 인터페이스를 사용하면 HashMap, TreeMap 등 Map 인터페이스를 구현한 모든 구현체를 사용할 수 있다.

boolean과 원소 2개짜리 열거타입

  • boolean이든 원소 2개짜리 열거타입이든 가장 의미를 잘 드러낼 수 있는 타입을 사용한다.
  • 만약 어떤 학생의 시험 통과여부를 나타내는 변수는, boolean이 더 적합할 수도 있다. (isPassed=true, false)
  • 온도계 클래스가 있다고 가정하자.둘 중 가독성이 좋은 코드는 자명하다.
  • public enum TemperatureScale {FARENHEIT, CELSIUS} Thermometer.newInstance(true); Thermometer.newInstance(TemperatureScale.CELSIUS);

0개의 댓글