programing

(Java) 패키지 구성에 대한 베스트 프랙티스가 있습니까?

newsource 2022. 8. 27. 09:48

(Java) 패키지 구성에 대한 베스트 프랙티스가 있습니까?

조금 전에 java 패키지의 세밀한 구성에 관한 질문을 받았습니다.예를들면,my.project.util,my.project.factory,my.project.service,기타.

지금 찾을 수가 없으니 물어보는 게 좋겠어요.

Java 패키지의 구성과 그 안에 무엇이 포함되어 있는지에 대한 베스트 프랙티스가 있습니까?

자바 프로젝트에서는 어떻게 수업을 편성하고 있습니까?

예를 들어, 제가 몇 명과 함께 작업하고 있는 프로젝트에는 콩이라는 패키지가 있습니다.처음에는 단순한 콩을 사용한 프로젝트였지만, (경험이 부족하고 시간이 부족하여) 모든 것을 포함하게 되었습니다(거의)팩토리 클래스(콩을 만드는 정적 메서드를 사용하는 클래스)를 팩토리 패키지에 넣어 조금 정리했습니다만, 비즈니스 로직을 실행하는 클래스나 속성 파일에서 코드의 메시지를 취득하는 등 간단한 처리(비즈니스 로직이 아닌)를 실행하는 클래스도 있습니다.

당신의 의견과 코멘트에 감사드립니다.

패키지는 패턴이나 구현 역할이 아닌 기능별로 정리합니다.패키지는 다음과 같습니다.

  • beans
  • factories
  • collections

틀렸습니다.

예를 들어 다음과 같습니다.

  • orders
  • store
  • reports

패키지 가시성을 통해 구현 세부사항을 숨길 수 있습니다.주문 공장은orders패키지이므로 주문 작성 방법에 대한 자세한 내용은 표시되지 않습니다.

패키지 구성 또는 패키지 구조는 일반적으로 뜨거운 논의입니다.다음은 패키지 이름 지정 및 구성에 대한 간단한 가이드라인입니다.

  • Java 패키지 명명 규칙을 따릅니다.
  • 기능적 역할 및 비즈니스 역할에 따라 패키지 구성
    • 기능 또는 모듈에 따라 패키지를 분류합니다.com.company.product.modulea
    • 소프트웨어의 레이어에 근거해 한층 더 상세하게 분류할 수 있습니다.그러나 패키지에 클래스가 몇 개만 포함되어 있다면 패키지에 모든 것이 들어 있는 것이 타당합니다.com.company.product.module.web또는com.company.product.module.util기타.
    • IMO는 긴급한 요구가 없는 한 예외나 공장 등의 개별 패키징을 피합니다.
  • 프로젝트의 규모가 작은 경우는, 몇개의 패키지로 심플하게 해 주세요.com.company.product.model그리고.com.company.product.util,기타.
  • Apache 프로젝트에서 인기 있는 오픈 소스 프로젝트를 살펴보십시오.다양한 규모의 프로젝트에서 구조화를 어떻게 사용하는지 확인하십시오.
  • 또한 명명 시 빌드 및 배포를 고려하십시오(다른 패키지로 API 또는 SDK를 배포할 수 있습니다. servlet api 참조).

몇 가지 실험과 시련을 거치면, 당신은 당신이 편한 구조를 생각해 낼 수 있을 것이다.하나의 관습에 집착하지 말고 변화에 열려라.

간단한 답변:모듈/기능별로 1개의 패키지(서브패키지 포함)밀접하게 관련된 것들을 같은 패키지에 담으세요.패키지 간의 순환 종속성을 방지합니다.

장황한 답변: 이 기사의 대부분에 동의합니다.

레이어보다 피쳐를 더 선호하지만 프로젝트에 따라 다를 수 있습니다.당신의 힘을 고려하세요.

  • 의존 관계
    특히 기능 간의 패키지 종속성을 최소화해 보십시오.필요한 경우 API를 추출합니다.
  • 팀 구성
    일부 조직에서는 팀이 기능에 대해 작업하고 다른 조직에서는 계층에 대해 작업합니다.이는 코드 구성 방식에 영향을 미치며 API를 공식화하거나 협력을 장려하기 위해 사용합니다.
  • 도입 및 버전 관리
    모듈에 모든 것을 포함하면 도입과 버전 관리는 간단해지지만 버그 수정은 어렵습니다.분할하면 제어, 확장성 및 가용성이 향상됩니다.
  • 변화에 대한 대응
    잘 짜여진 코드는 큰 진흙덩어리보다 훨씬 쉽게 바꿀 수 있다.
  • 크기(사람 및 코드 행)
    규모가 클수록 정형화/표준화해야 합니다.
  • 중요도/품질
    어떤 암호는 다른 암호보다 더 중요합니다.API는 구현보다 더 안정적이어야 합니다.따라서 명확하게 분리할 필요가 있습니다.
  • 추상화 및 진입점 수준
    외부인이 패키지 트리를 보고 코드가 무엇인지, 어디서부터 읽어야 하는지 알 수 있을 것입니다.

예제:

com/company/module
  + feature1/
    - MainClass          // The entry point for exploring
    + api/               // Public interface, used by other features
    + domain/
      - AggregateRoot
      + api/             // Internal API, complements the public, used by web
      + impl/ 
    + persistence/       
    + web/               // presentation layer 
    + services/          // Rest or other remote API 
    + support/            
  + feature2/
  + support/             // Any support or utils used by more than on feature
    + io
    + config
    + persistence
    + web

이것은 단지 예시일 뿐이다.꽤 격식을 차리네요.예를 들어 feature1에 2개의 인터페이스를 정의합니다.보통은 필수는 아니지만, 사람마다 다르게 사용하는 것이 좋습니다.내부 API를 통해 퍼블릭을 확장할 수 있습니다.

'impl' 또는 'support'라는 이름은 마음에 들지 않지만 중요하지 않은 것(도메인 및 API)을 구분하는 데 도움이 됩니다.이름을 짓는 것에 관해서라면, 나는 가능한 한 구체적으로 말하고 싶다.20개의 클래스로 구성된 'utils'라는 패키지가 있다면,StringUtils지지/스트링,HttpUtil서포트 / 서포트하고 있습니다.

Java 패키지의 구성과 그 안에 무엇이 포함되어 있는지에 관한 베스트 프랙티스가 있습니까?

그렇지 않아, 아니야.많은 아이디어와 의견이 있지만, 진정한 "베스트 프랙티스"는 상식을 이용하는 것입니다!

('베스트 프랙티스'와 그 프로모션을 실시하는 담당자에 대해서는, 「베스트 프랙티스 없음」을 참조해 주세요).

하지만, 아마도 널리 받아들여지고 있는 한 명의 주계약자가 있다.패키지 구조는 응용 프로그램의 (비공식) 모듈 구조를 반영해야 하며 모듈 간의 주기적 의존성을 최소화(또는 완전히 회피)하는 것을 목표로 해야 합니다.

(패키지/모듈의 클래스 간 순환 의존성은 양호하지만 패키지 간 사이클은 애플리케이션 아키텍처를 이해하기 어렵고 코드 재사용에 장애가 될 수 있습니다.특히 Maven을 사용하는 경우, 주기적인 패키지 간/모듈 간 종속성은 상호 연결된 전체 혼합물이 하나의 Maven 아티팩트가 되어야 함을 의미합니다.)

패키지 이름에 대해 널리 받아들여지고 있는 베스트 프랙티스가 하나 있다는 것도 덧붙여야 합니다.즉, 패키지 이름은 조직의 도메인 이름으로 역순으로 시작해야 합니다.이 규칙을 따르면 사용자의 (전체) 클래스 이름이 다른 사용자의 이름과 충돌하여 문제가 발생할 가능성을 줄일 수 있습니다.

나는 '패키지 바이 레이어'보다 '패키지 바이 피처'를 홍보하는 사람들을 봐왔지만, 몇 년 동안 꽤 많은 접근법을 사용해 본 결과 '패키지 바이 레이어'가 '패키지 바이 피처'보다 훨씬 낫다는 것을 알았다.

또한 하이브리드: '모듈별 패키지, 계층별 기능' 전략은 '기능별 패키지'의 장점이 많기 때문에 실제로 매우 효과적입니다.

  • 재사용 가능한 프레임워크(모델과 UI 양쪽 측면을 갖춘 라이브러리)의 작성을 촉진합니다.
  • 플러그 앤 플레이 레이어 실장이 가능.레이어 실장을 모델 코드와 같은 패키지/디렉토리에 배치하기 때문에 '기능별 패키지'에서는 사실상 불가능합니다.
  • 더 많이...

여기서 상세하게 설명합니다.Java Package Name Structure and Organization (Java 패키지 이름 구조 및 조직)하지만 표준 패키지 구조는 다음과 같습니다.

revdomain.moduleType.moduleName.layer 를 지정합니다.[레이어 임플]feature.subfeatureN.subfeatureN+1...

장소:

revdomain Reverse 도메인(예: com.mycompany)

module Type [app*|framework|util]

moduleName(모듈 유형이 앱인 경우 myAppName, 회계 프레임워크인 경우 '재무' 등)

레이어 [model|ui|consence|보안 등]

layerImple: wicket, jsp, jpa, jdo, hibernate (주: 레이어가 모델인 경우 사용되지 않음)

기능(예: 재무)

서브기능: 어카운팅 등

하위 기능 N+1(예: 감가상각)

*모듈의 경우 'app'이 생략될 수 있습니다.Type은 응용 프로그램이지만 이를 응용 프로그램에 넣으면 패키지 구조가 모든 모듈 유형에서 일관되게 유지됩니다.

패키지 구성에 대한 표준 관행을 알지 못합니다.저는 일반적으로 상당히 넓은 범위의 패키지를 만들지만 프로젝트 내에서 차별화할 수 있습니다.예를 들어 현재 작업 중인 개인 프로젝트에는 사용자 지정된 UI 컨트롤 전용 패키지가 있습니다(스윙 클래스를 하위 분류하는 클래스로 가득 차 있습니다).데이터베이스 관리 전용 패키지, 작성한 청취자/이벤트 패키지 등이 있습니다.

한편, 저는 동료에게 그가 한 거의 모든 일에 대해 새로운 패키지를 만들도록 시켰습니다.그가 원하는 각 MVC에는 자체 패키지가 있으며, 동일한 패키지에 포함할 수 있는 클래스의 그룹화는 MVC 세트뿐인 것 같습니다.내 기억으로는 그가 5개의 다른 패키지에 각각 하나의 클래스가 들어있었던 것으로 기억한다.그의 방법은 조금 극단적이라고 생각합니다(그리고 팀은 우리가 처리할 수 없는 상황에서 패키지 수를 줄이도록 강요했습니다). 하지만 사소한 어플리케이션이라면 모든 것을 같은 패키지에 넣을 수 있습니다.그것은 당신과 당신의 팀원들이 스스로 찾아야 할 균형점입니다.

한 가지 할 수 있는 일은 한 걸음 물러서서 생각해 보는 것입니다. 만약 당신이 이 프로젝트에 처음 참여한 멤버이거나, 당신의 프로젝트가 오픈 소스나 API로 공개되었다면 원하는 것을 찾는 것이 얼마나 쉽거나 어려울까요?왜냐하면 저에게 있어서, 그것이 바로 제가 패키지에서 원하는 것입니다.컴퓨터의 폴더에 파일을 저장하는 방법과 마찬가지로 전체 드라이브를 검색하지 않고도 파일을 다시 찾을 수 있습니다.패키지의 모든 클래스 목록을 검색하지 않아도 원하는 클래스를 찾을 수 있을 것으로 기대하고 있습니다.

언급URL : https://stackoverflow.com/questions/3226282/are-there-best-practices-for-java-package-organization