다음과 같은 경우`util`보다 의미 상 더 적합한 패키지 이름은 무엇입니까?


18

A와 strawman이 패키지를 고려 java.util대부분의 경우 자신의 클래스에 대한 더 의미 론적으로 올바른 패키지 이름으로 올 게으른 또는 영감이 있었다 넣어 사람보다 일반적인 다른에서 공유 아무것도하지 않는 다양한 클래스에 대한 덤핑 땅이다.

한 가지 예를 들어, 클래스 UUID의 의미 상 올바른 패키지 이름은 무엇 이었습니까?

UUID더 가벼운 클래스를 구현 하고 있습니다. me.myproject.util.UUID패키지 이름 으로 사용하고 싶지 않습니다 .

나는 생각 me.myproject.rfc4122.UUID했지만 그것이 사용의 의미를 암시하지는 않는다 UUID.

나는 또한 고려 me.myproject.uuid.UUID했지만 똑같은 이름을 가진 모듈에 클래스를 넣는 것이 파이썬에서 인기있는 접근법이지만 packagesJava modules에서는 파이썬에서 의미 론적으로 동등 하지는 않지만 그 점에서 타우 톨로지를 좋아하지 않습니다 .

또한 me.myproject.UUID네임 스페이스의 해당 부분을 관련이없는 것으로 오염시키지 않기 때문에 고려 했지만 거부했습니다. 이것은 문제를 한 수준 위로 올립니다.

나는 또한 고려 me.myproject.lib.UUID했지만 이것은 의미상의 의미가 없으며 .util문제의 이름을 바꿉니다.

semantics: 의미 와 관련된 언어학과 논리의 지점 .


어때요 me.myproject.UUID? 또는me.UUID
Robert Harvey

나에게, 좋아 from me.myproject.uuid import UUID, GetUUIDInfo보이는 것 같습니다 . 모듈에 둘 이상의 내 보낸 항목이있을 수 있습니다.
9000

2
JXTA에는 ID와 관련된 작업을위한 'id'패키지가 있습니다.
greg-449

@ greg-449-나는 아마 받아 들여질 것입니다 답변으로 조금 더 설명과 함께 당신의 제안에 기대어 identity또는 identifiers제안하고 있습니다.

답변:


11

해당 클래스의 의미 상 올바른 이름을 가진 패키지에 각 클래스를 배치하려고 할 때의 문제는 클래스가 거의 없거나 때로는 하나의 클래스 만 포함하는 패키지로 이어진다는 것입니다. 이것은 결국 많은 패키지로 이어집니다.

패키지 이름 지정에 대한보다 실용적인 접근 방식은 단순히 물건을 찾는 데 도움을주는 것입니다. 한곳에 모여있는 곳을 항상 알고있는 자주 사용하는 물건을 보관하면 방해가되지 않으므로 좀처럼 사용하지 않는 물건을 쉽게 찾을 수 있습니다. 따라서 패키지에 포함 된 각 클래스에 대해 의미 적으로 올바른 패키지 이름이 필요하지 않으며 의미 상 올바르지 않은 패키지 이름 만 있으면됩니다. 분명히 '유틸리티'패키지 이름은이 사고 방식에 따라 선택되었습니다. 포함 된 클래스 의미 상 올바른 이름은 아니지만 의미 상 올바르지 않은 것으로 충분합니다.

따라서이 UUID 유형의 유형이이 특정 응용 프로그램에서만 사용되도록 예정된 경우 ( 'myproject'아래에 놓을 계획이라는 사실에 의해 입증 된 경우) 아마도 해당 유형의 '모델'의 일부일 수 있습니다. 계획. 영구 엔티티에 해당하는 모든 클래스 세트를 포함하는 '모델'패키지가 이미 있어야합니다. 대부분의 클래스에는 관계가있을 수 있으며 UUID가 이러한 관계를 구현하는 수단 일 수 있습니다. 또한 UUID는 아마도 자신을 유지하는 방법을 알고있을 것입니다. 또한 UUID는 모델 엔터티의 구성원으로 만 찾을 수 있습니다. 따라서 모델 패키지가 가장 적합한 장소 일 것입니다.

그렇지 않으면,이 UUID 유형이 다른 프로젝트에서도 사용될 수 있다면 일부 프레임 워크의 일부로 보여야합니다. 따라서 해당 프레임 워크의 루트 소스 폴더 또는 MainMa가 제안한 일부 '유형'하위 패키지 또는 'util'또는 'misc'라는 해당 프레임 워크의 일부 하위 패키지에있을 수 있습니다. 아무 문제가 없습니다.


2
답변의 유용성에 실제로 도움이되지 않는 답변에서는 해설을 제한하십시오. 의견 섹션은 그러한 면책 조항을 위해 예약되어 있습니다. 감사합니다.
maple_shaft

1

패키지의 목적은 몇 가지 기준에 따라 클래스를 그룹화하는 것입니다 (유형 / 계층 별 패키지 대 기능별 패키지 등). 나는 하나의 클래스에 대해서만 패키지를 만들 필요가 없다. 특히 미래에이 패키지에 다른 클래스가있을 것이라고 기대하지 않는다면 말이다.

또한 "util"패키지 이름은 완전히 의미가 없다고 생각합니다. 클래스를 특정 기준으로 그룹화하기 만합니다. "util"클래스는 응용 프로그램 도메인의 일부가 아니라는 의미이기도합니다. 프레임 워크 (응용 프로그램의 구조에 영향을 미치지 않음). 기본적으로 비표준 라이브러리의 확장입니다.

이 경우이 UUID 클래스를 "util"패키지에 넣는 데 문제가 없습니다. UUID 생성을위한 별도의 클래스와 같은 다른 UUID 관련 유틸리티 클래스가있는 경우 라이브러리를 작성하고 UUID가 노출 된 인터페이스의 일부가 아닌 한 리팩터링하고 "util.uuid"패키지를 쉽게 작성할 수 있습니다. , 당신은 조금 "앞으로 생각"해야합니다).


1
이것이 나의 접근법이다. 명확한 목적이없는 패키지를 만드는 것은 이치에 맞지 않습니다. 클래스를 의미있는 패키지에 쉽게 할당 할 수 없다면 'util'은 괜찮으며 아마도 더 좋을 수도 있습니다. 일반적으로 진행하면서 발생하는 일은 충분한 클래스가 관련 유틸리티에서 끝나고 유틸리티에서 (적어도 개발 중에) 의미있는 패키지로 리팩토링하기 쉽다는 것입니다. 어디로 가는지 모르는 각 클래스에 대해 고유 한 패키지를 만들려고 시도했다면 이러한 관계와 더 깨끗한 아키텍처로 리팩토링 할 수있는 기회를 쉽게 놓칠 수 있습니다.
덩크

@Dunk는 실제로 아주 좋은 지적입니다. 다소 독창적 인 패키지 구조를 조기에 만들면 더 자연스럽고 자연스러운 조직을 볼 수 없습니다.
qbd

1

Bob 아저씨는 패키지 분리에 대한 몇 가지 지침 을 가지고 있습니다 .

처음 세 가지 패키지 원칙은 패키지 응집력에 관한 것이며 패키지 안에 넣을 내용을 알려줍니다.

  1. 재사용 과립은 방출 과립입니다
  2. 함께 변경되는 클래스는 함께 패키지됩니다
  3. 함께 사용되는 클래스는 함께 패키지됩니다

그렇다면 UUID 클래스 를 누가 / 무엇으로 사용 할지 질문에 대답 하면 속성으로 사용하거나 작업을 호출합니까? 당신은 어떻게 의존성 그래프는 ? UUID는 다른 클래스 와 함께 사용 됩니까?

답변에 따라 me.myproject.identity 패키지, me.myproject.serialization 패키지, me.myproject라고해야합니다. DTO 또는 완전히 다른 것. 어쩌면 UUID 클래스는 모델과 함께 유지해야하며 me.myproject.models 와 같이 이미 가지고있는 패키지에 넣어야 합니다.


1
dto같은 의미 무용 등에 관한 lib또는 utils전체 dto, 개념은 90 년대 중반에서 순진 안티 패턴 model뿐만 아니라 같은 쓸모없는 일반화 범주에 속하는

우리는 당신에게 더 유용한 이름을 줄 프로젝트에 대해 잘 모릅니다
Hbas

-2

우선, UUID (대문자 포함)는 패키지 이름 또는 클래스 이름에 대해 나에게 매우 나쁜 생각 인 것 같습니다. 어떤 방식 으로든 모든 스타일 이름이 "상수"와 연관되어 있습니다. 패키지는 물건을 정리하기위한 것으로 패키지 이름을 지정하는 가장 쉬운 방법은 보유하고있는 클래스의 가치입니다.

  • 예를 들어 클래스를 비즈니스 가치로 구분할 수 있습니다 com.example.identifier.
  • 또는 기술적 인 가치 (예 :) com.example.uuid.

IT를 단순하게 유지


2
자바 ALLCAPS 클래스의 예 : java.util.UUID, java.net.URL, java.util.zip.CRC32
scriptin

@scriptin 개발자가 캡 스타일과 클래스를 "일정한"클래스, 패키지 이름의 멤버 등으로 구별 할 수 있다면 개발자가 더 쉬울 수 없을까요? 왜 CRC32, UUID는 java가 그렇게했기 때문에 클래스의 좋은 이름이라고 생각합니까? 또는 "Universally unique identifier"또는 "Cyclic Redundancy Check"의 약어이기 때문에 조금 기다리십시오! 이 java.util.zip.GZIPOutputStream수업 은 무엇입니까 ? GZIP는 ... ? there is also a java.util.zip.ZipOutputStream`의 약자
Tiberiu C.

1
클래스는 유형이고 상수는 값이며 혼란이 없습니다. 나는 그 이름이 좋고 나쁘지 않다고 생각합니다. 나는 당신이 말하는 (코딩) 스타일이 클래스에 소문자를 강요하지 않는다는 것을 지적하고 있습니다. 파이썬 UUID에서도 대문자입니다.
scriptin

매일 코드를 보거나 유지한다면, 그것의 스타일은 "읽기 쉬운"과 "뒤로 가기"축제의 차이를 만들어 여기에서 캡 스타일로 분리합니다. 두문자어, 약어 인 사실보다 멤버의 유형 (클래스, 상수, 패키지 등)
Tiberiu C.

1
원래 질문은 패키지 이름을 쓸 때 어떤 대소 문자를 사용하든 아무 관련이 없습니다. 의미 상 UUID는 Uuid, uuid, UuId, UuID 또는 "최고"라고 생각되는 다른 임의의 대문자 표기법과 다르지 않습니다.
Brandin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.