"절대 절대로"말하지 마십시오
나는 그것이 반드시 나쁘다고 생각하지 않습니다, 당신이 그것을 잘못하고 남용하는 경우에만 나쁩니다.
우리 모두는 도구와 유틸리티가 필요합니다
우선, 우리 모두는 때때로 거의 어디에나 있고 꼭 필요한 것으로 간주되는 일부 라이브러리를 사용합니다. 예를 들어, Java 세계에서 Google Guava 또는 일부 Apache Commons ( Apache Commons Lang , Apache Commons Collections 등)가 있습니다.
따라서 이들에 대한 필요성이 분명히 있습니다.
하드 워드, 복제 및 버그 소개 피하기
당신이 생각하는 경우 꽤 많은 이들의 단지 매우 큰 무리입니다 Util
누군가가 그들 (상대적으로) 권리를 얻기 위해 많은 노력을했다를 제외하고, 당신이 설명하는 클래스, 그들은 봤는데 시간 - 테스트 와 크게 다른 사람에 의해 눈이-고사리.
Util
클래스 를 작성하는 가려움을 느낄 때 가장 먼저 경험할 수있는 규칙은 클래스가 Util
실제로 존재하지 않는지 확인하는 것 입니다.
내가 본 유일한 반론은 다음과 같은 이유로 종속성을 제한하려고 할 때입니다.
- 종속성의 메모리 풋 프린트를 제한하려고합니다.
- 또는 개발자가 사용할 수있는 것을 엄격하게 제어하려고합니다 (강박 한 대규모 팀에서 발생하거나 특정 프레임 워크가 이상한 슈퍼 크 래핑 클래스를 사용하여 어딘가를 피하는 것으로 알려진 경우).
그러나 두 가지 모두 ProGuard 또는 이와 동등한 것을 사용하여 lib를 다시 패키징 하거나 스스로 분리 하여 해결할 수 있습니다 ( Maven 사용자의 경우 maven-shade-plugin 은 빌드의 일부로 이것을 통합하기 위해 필터링 패턴 을 제공합니다 ).
따라서 lib에 있고 사용 사례와 일치하고 다른 벤치 마크가 없으면 사용하십시오. 그것이 당신과 약간 다를 경우, 그것을 확장하거나 (가능한 경우) 확장하거나 마지막 수단으로 다시 작성하십시오.
명명 규칙
그러나 지금 까지이 답변에서 나는 그들을 Util
당신처럼 부릅니다 . 그 이름을 말하지 마십시오.
그들에게 의미있는 이름을 부여하십시오. Google Guava를해야 할 일에 대한 아주 좋은 예라고 생각하고 com.google.guava
네임 스페이스가 실제로 util
루트 라고 상상해보십시오 .
util
클래스가 아닌 최악 의 패키지를 호출하십시오 . String
문자열 구조의 객체와 조작을 다루는 경우 호출 Strings
하지 마십시오 StringUtils
( 아파치 Apache Commons Lang- 여전히 좋아하고 사용합니다!). 특정 작업을 수행하는 경우 특정 클래스 이름 (예 : Splitter
또는 Joiner
)을 선택하십시오.
단위 테스트
이 유틸리티를 작성해야한다면 반드시 단위 테스트를 수행하십시오. 유틸리티의 장점은 일반적으로 특정 입력을 받고 특정 출력을 리턴하는 자체 포함 된 구성 요소라는 것입니다. 이것이 개념입니다. 따라서 단위 테스트를하지 않는다는 변명의 여지가 없습니다.
또한 단위 테스트를 통해 API 계약을 정의하고 문서화 할 수 있습니다. 테스트가 실패하면 잘못된 방식으로 변경 했거나 API 계약을 변경하려고 한 것입니다 (또는 원래 테스트는 문제를 학습 한 후 다시하지 마십시오) .
API 디자인
이러한 API에 대해 설계 결정을 내리면 오랜 시간이 걸릴 것입니다. 따라서 Splitter
-clone 을 작성하는 데 몇 시간을 소비하지 않지만 문제에 어떻게 접근하는지주의하십시오.
몇 가지 질문을 해보십시오.
- 유틸리티 메소드가 클래스를 자체적으로 보증합니까, 아니면 정적 메소드가 유사하게 유용한 메소드 그룹의 일부로 이해되는 경우 충분합니까?
- 객체를 생성하고 API를 더 읽기 쉽게하기 위해 팩토리 메소드 가 필요 합니까?
- 가독성에 대해 Fluent API , 빌더 등 이 필요 합니까?
이러한 유틸리티가 광범위한 사용 사례를 포괄하고 강력하고 안정적이며 잘 문서화되어 있고 가장 놀랍지 않은 원칙에 따라 자체적으로 포함되기를 원합니다. 이상적으로, utils의 각 하위 패키지 또는 전체 util 패키지는 재사용하기 쉽도록 번들로 내보낼 수 있어야합니다.
평소와 같이 여기에서 거인들로부터 배우십시오.
- 이것들을 살펴보고 분석하고 비교 한 다음 자주 다시 돌아가서 다시 수행하십시오 ( 이것이 절대적 또는 부분적으로 좋은지 나쁜지에 대한 판단을하지는 않습니다. 중심은 분석 및 비교 비트입니다) :
- Josh Bloch의 좋은 API를 디자인하는 방법과 중요한 이유 ( 슬라이드 )를보십시오.
- 추가 Bloch 자료를 읽고보십시오.
- API 디자인 문제를 읽으십시오 .
그렇습니다.이 중 많은 부분이 수집 및 데이터 구조에 중점을두고 있지만 대부분의 유틸리티를 직간접 적으로 구현할 수있는 곳이나 장소가 아니라고 말하지 마십시오.
Util
수업 이름 사용 을 중지하십시오 . 문제 해결됨.