A와 strawman이 패키지를 고려 java.util
대부분의 경우 자신의 클래스에 대한 더 의미 론적으로 올바른 패키지 이름으로 올 게으른 또는 영감이 있었다 넣어 사람보다 일반적인 다른에서 공유 아무것도하지 않는 다양한 클래스에 대한 덤핑 땅이다.
한 가지 예를 들어, 클래스 UUID
의 의미 상 올바른 패키지 이름은 무엇 이었습니까?
UUID
더 가벼운 클래스를 구현 하고 있습니다. me.myproject.util.UUID
패키지 이름 으로 사용하고 싶지 않습니다 .
나는 생각 me.myproject.rfc4122.UUID
했지만 그것이 사용의 의미를 암시하지는 않는다 UUID
.
나는 또한 고려 me.myproject.uuid.UUID
했지만 똑같은 이름을 가진 모듈에 클래스를 넣는 것이 파이썬에서 인기있는 접근법이지만 packages
Java modules
에서는 파이썬에서 의미 론적으로 동등 하지는 않지만 그 점에서 타우 톨로지를 좋아하지 않습니다 .
또한 me.myproject.UUID
네임 스페이스의 해당 부분을 관련이없는 것으로 오염시키지 않기 때문에 고려 했지만 거부했습니다. 이것은 문제를 한 수준 위로 올립니다.
나는 또한 고려 me.myproject.lib.UUID
했지만 이것은 의미상의 의미가 없으며 .util
문제의 이름을 바꿉니다.
semantics
: 의미 와 관련된 언어학과 논리의 지점 .
답변
해당 클래스의 의미 상 올바른 이름을 가진 패키지에 각 클래스를 배치하려고 할 때의 문제는 클래스가 거의 없거나 때로는 하나의 클래스 만 포함하는 패키지로 이어진다는 것입니다. 이것은 결국 많은 패키지로 이어집니다.
패키지 이름 지정에 대한보다 실용적인 접근 방식은 단순히 물건을 찾는 데 도움을주는 것입니다. 한곳에 모여있는 곳을 항상 알고있는 자주 사용하는 물건을 보관하면 방해가되지 않으므로 좀처럼 사용하지 않는 물건을 쉽게 찾을 수 있습니다. 따라서 패키지에 포함 된 각 클래스에 대해 의미 적으로 올바른 패키지 이름이 필요하지 않으며 의미 상 올바르지 않은 패키지 이름 만 있으면됩니다. 분명히 ‘유틸리티’패키지 이름은이 사고 방식에 따라 선택되었습니다. 포함 된 클래스 의 의미 상 올바른 이름은 아니지만 의미 상 올바르지 않은 것으로 충분합니다.
따라서이 UUID 유형의 유형이이 특정 응용 프로그램에서만 사용되도록 예정된 경우 ( ‘myproject’아래에 놓을 계획이라는 사실에 의해 입증 된 경우) 아마도 해당 유형의 ‘모델’의 일부일 수 있습니다. 계획. 영구 엔티티에 해당하는 모든 클래스 세트를 포함하는 ‘모델’패키지가 이미 있어야합니다. 대부분의 클래스에는 관계가있을 수 있으며 UUID가 이러한 관계를 구현하는 수단 일 수 있습니다. 또한 UUID는 아마도 자신을 유지하는 방법을 알고있을 것입니다. 또한 UUID는 모델 엔터티의 구성원으로 만 찾을 수 있습니다. 따라서 모델 패키지가 가장 적합한 장소 일 것입니다.
그렇지 않으면,이 UUID 유형이 다른 프로젝트에서도 사용될 수 있다면 일부 프레임 워크의 일부로 보여야합니다. 따라서 해당 프레임 워크의 루트 소스 폴더 또는 MainMa가 제안한 일부 ‘유형’하위 패키지 또는 ‘util’또는 ‘misc’라는 해당 프레임 워크의 일부 하위 패키지에있을 수 있습니다. 아무 문제가 없습니다.
답변
패키지의 목적은 몇 가지 기준에 따라 클래스를 그룹화하는 것입니다 (유형 / 계층 별 패키지 대 기능별 패키지 등). 나는 하나의 클래스에 대해서만 패키지를 만들 필요가 없다. 특히 미래에이 패키지에 다른 클래스가있을 것이라고 기대하지 않는다면 말이다.
또한 “util”패키지 이름은 완전히 의미가 없다고 생각합니다. 클래스를 특정 기준으로 그룹화하기 만합니다. “util”클래스는 응용 프로그램 도메인의 일부가 아니라는 의미이기도합니다. 프레임 워크 (응용 프로그램의 구조에 영향을 미치지 않음). 기본적으로 비표준 라이브러리의 확장입니다.
이 경우이 UUID 클래스를 “util”패키지에 넣는 데 문제가 없습니다. UUID 생성을위한 별도의 클래스와 같은 다른 UUID 관련 유틸리티 클래스가있는 경우 라이브러리를 작성하고 UUID가 노출 된 인터페이스의 일부가 아닌 한 리팩터링하고 “util.uuid”패키지를 쉽게 작성할 수 있습니다. , 당신은 조금 “앞으로 생각”해야합니다).
답변
Bob 아저씨는 패키지 분리에 대한 몇 가지 지침 을 가지고 있습니다 .
처음 세 가지 패키지 원칙은 패키지 응집력에 관한 것이며 패키지 안에 넣을 내용을 알려줍니다.
- 재사용 과립은 방출 과립입니다
- 함께 변경되는 클래스는 함께 패키지됩니다
- 함께 사용되는 클래스는 함께 패키지됩니다
그렇다면 UUID 클래스 를 누가 / 무엇으로 사용 할지 질문에 대답 하면 속성으로 사용하거나 작업을 호출합니까? 당신은 어떻게 의존성 그래프는 ? UUID는 다른 클래스 와 함께 사용 됩니까?
답변에 따라 me.myproject.identity 패키지, me.myproject.serialization 패키지, me.myproject라고해야합니다. DTO 또는 완전히 다른 것. 어쩌면 UUID 클래스는 모델과 함께 유지해야하며 me.myproject.models 와 같이 이미 가지고있는 패키지에 넣어야 합니다.
답변
우선, UUID (대문자 포함)는 패키지 이름 또는 클래스 이름에 대해 나에게 매우 나쁜 생각 인 것 같습니다. 어떤 방식 으로든 모든 스타일 이름이 “상수”와 연관되어 있습니다. 패키지는 물건을 정리하기위한 것으로 패키지 이름을 지정하는 가장 쉬운 방법은 보유하고있는 클래스의 가치입니다.
- 예를 들어 클래스를 비즈니스 가치로 구분할 수 있습니다
com.example.identifier
. - 또는 기술적 인 가치 (예 🙂
com.example.uuid
.
IT를 단순하게 유지