어떻게 해야 하는 구조 Java 응용 프로그램,나는 어디를 넣어 내십니까?

StackOverflow https://stackoverflow.com/questions/7596

  •  08-06-2019
  •  | 
  •  

문제

첫째,내가 알고있는 방법 Java 응용 프로그램을 구축하.하지만 나는 항상 당황에 대한 곳을 넣습니다.가 있는 지지자들을 위해 조직에서 패키지를 엄격하게 도메인 중심의 패션,별도 다른 사람에 의해 계층입니다.

나 자신은 항상 문제가 있었다

  • 이름
  • 배치

그래서,

  1. 어디에 당신은 당신의 도메인은 특정 상수(무엇인가에 대한 최고의 이름 같은 클래스)?
  2. 어디에 당신을 넣어 클래스를 위한 물건을 모두 인프라 및 특정 도메인(예를 들어 나는 FileStorageStrategy 클래스 저장하는 파일 중 하나를 데이터베이스에서,또는 데이터베이스에서)?
  3. 어디를 넣어 예외?
  4. 이 있는 모든 표준을 내가 참조할 수 있습니다?
도움이 되었습니까?

해결책

나는 정말 좋아하 Maven 의 표준 디렉토리 레이아웃.

하나의 핵심 아이디어를 나에게는 두 소스에 뿌리를 하나는 생산 코드 및 테스트 코드는 다음과 같이

MyProject/src/main/java/com/acme/Widget.java
MyProject/src/test/java/com/acme/WidgetTest.java

(여기에서,모두 src/main/java 및 src/시험/java source 뿌리).

장점:

  • 테스트 패키지(또는"기본")수준의 액세스를 당신의 클래스에서 테스트입니다.
  • 당신은 쉽게 수만 패키지의 생산원으로 항아리에 의해 떨어지는 src/시험/java 원으로 루트입니다.

중 엄지손가락의 규칙에 대해 클래스에 배치하고 패키지:

일반적으로 말하면,잘 구조적 프로젝트는 무료로 원형 종속성.을 배울 때 그들은 나쁜(그리고 그들은 고),고려 같은 도구 JDependSonarJ 는 제거하는 데 도움이됩니다.

다른 팁

가 조직의 원본은,그래서 나는 항상을 만들은 다음과 같은 디렉토리 구조로 구성되어 있다:

/src - for your packages & classes
/test - for unit tests
/docs - for documentation, generated and manually edited
/lib - 3rd party libraries
/etc - unrelated stuff
/bin (or /classes) - compiled classes, output of your compile
/dist - for distribution packages, hopefully auto generated by a build system

서/src 을 사용하고 기본 Java 패턴패키지 이름을 시작으로 귀하의 도메인(org.yourdomain.여)와 클래스 이름을 반영 OOP 측면에 당신과 함께 만들기 클래스(보이는 다른 코멘트).일반적인 패키지 이름 util, 모델, 보기, 이벤트 유용,too.

하는 경향이 있을 넣어 상수 위한 특정 항목에서는 자신의 클래스 SessionConstantsServiceConstants 에서 동일한 패키지의 도메인 클래스입니다.

어디서 일하고 있어요,우리가 사용하는 Maven2 고 우리는 꽤 좋은 원형에 대한 우리의 프로젝트입니다.목표를 얻을 수 있었 좋은 분리의 관심사,따라서 우리는 우리 정의된 프로젝트 구조를 사용하여 여러 개의 모듈(각각의 응용 프로그램'레이어'):-일반적인:일반적인 코드를 사용하는 다른 레이어를(예를 들어,i18n) -체:도메인 엔티티 저장소:이 모듈을 포함 daos 인터페이스 구현 서비스-intf:인터페이스는 서비스에 대한(e.g 로,...) 서비스-impl:의 구현 services(e.g UserServiceImpl) -웹 사이트:모든 것에 관한 웹 콘텐츠(예를 들어,css,jsp,jsf 페이지,...) -ws:웹사 서비스

각 모듈은 자신의 종속성(예를 들어,저장소할 수 있 jpa)고 일부는 넓은 프로젝트(따라서 그들은 그 속에서 일반적인 모듈).간의 종속성을 다른 프로젝트는 모듈을 명확하게 분리되는 것(예를 들어,웹 층에 따라 달라집 서비스 층지에 대해 알아 저장소 계층).

각 모듈은 자신의 기본 패키지는 경우,예를 들어,응용 프로그램 패키지의"com.foo.바",그리고 우리는:

com.foo.bar.common
com.foo.bar.entities
com.foo.bar.repositories
com.foo.bar.services
com.foo.bar.services.impl
...

각 모듈를 존중하며 maven 을 표준 프로젝트 구조:

   src\
   ..main\java
     ...\resources
   ..test\java
     ...\resources

단위 테스트를 위한 특정 계층을 쉽게 찾아보실 그들의 장소에서\src\...테스트모든 것을 도메인 전용에는 그것이 장소에서 엔티티는 모듈이 있습니다.지금 같은 것 FileStorageStrategy 로 가야한 저장소 모듈,이후 우리는지 알아야 할 무엇인지 정확히 구현한다.에서 서비스를 계층,우리는 알아 저장소 인터페이스,우리는 걱정하지 않는 어떤 특정의 구현은(문제의 분리).

다음과 같은 여러 이점이 있습니다 이 방법:

  • 분명 문제의 분리
  • 각 모듈 패키지할 수으로 항아리(또는에서 전쟁의 경우 웹 단위)및 따라서도 편리하게 수행할 수 있습 코드를 재사용할(예를 들어,우리 모듈을 설치하고 maven 저장 및 재사용 그것은 다른 프로젝트에서)
  • 최대의 독립의 각 부분의 프로젝트

내가 이것을 알지 않는 모든 질문에 대답하지만,저는 이것을 생각하 넣을 수 있습니다 오른쪽에서 경로 및 증명할 수 있는 사용자에게 유용하다.

클래스 이름은 항상을 설명하고 자명하다.여러 개 있는 경우 도메인의 책임에 대한 귀하의 수업 후 그들은 아마 refactor.

마찬가지로 당신을 위한 패키지입니다.그들의 그룹에 의해 도메인의 책임입니다.모든 도메인은 자신의 예외가 있습니다.

일반적으로 땀을 얻을 때까지 당신이 그것을 압도 되 부상했다.그리고 앉아지 않는 코드,그 리팩터링는 클래스를 컴파일하는지 확인하기 위해 정기적으로 모든 작동합니다.다음 계속하기로 합의했다..

패키지를 사용하여 그룹과 관련된 기능을 함께합니다.

일반적으로 최고의 패키지 트리는 귀하의 도메인 이름을 반전(com.domain.subdomain)고유성을 보장하기 위해,그리고 일반적으로 다음이 될 것입니다 패키지에 대한 응용 프로그램입니다.다음 세분화하여 관련 지역,그래서 당신 FileStorageStrategy 수도 있습에 가서,말 com.domain.subdomain.myapp.storage, 가 될 수도 특정 구현/서브 클래스/아에서 com.domain.subdomain.myapp.storage.filecom.domain.subdomain.myapp.storage.database.이러한 이름을 얻을 수 있는 꽤 긴하지만, import 들 모두에 최고의 파일 및 Ide 을 관리할 수 있습니다.

예외는 일반적으로 가서와 같은 패키지에는 클래스를 던져 그들이,그래서 당신이 있다면,말, FileStorageException 그것은에서와 같은 패키지 FileStorageStrategy.마찬가지로 인터페이스 상수를 정의 것에 동일한 패키지입니다.

그건 정말로 어떤 표준으로 이러한 사용,일반적인 감각,그리고 모든 경우가 너무 지저분한 리팩터링!

하나는 것은 매우 도움이 발견을 위한 단위 테스트를 수 있는 프로그램이 setup/src/고 또한 프로그램이 setup/test_src/디렉터리입니다.이 방법은,내가 할 수 있는 장소에 단위 테스트는 동일한 패키지로 클래스들을 테스트,그리고 아직 쉽게 할 수 있습니 제외의 테스트 사례 때에 내가 준비하는 내 생산 설치합니다.

짧은 대답:그리 시스템 아키텍처의 관점에서 모듈,그린 side-by-side,각 모듈 슬라이스에 수직으로 레이어(예:보기,모델,지속).다음 사용은 다음과 같은 구조 com.mycompany.프로그램이 setup.somemodule.somelayer, 예 com.mycompany.프로그램이 setup.클라이언트입니다.보기com.mycompany.프로그램이 setup.서버입니다.모델.

를 사용하고 최고 수준의 패키지에 대한 응용 프로그램 모듈, 에서 옛날은 컴퓨터 과학의 의미 모듈 프로그래밍, 야 할 명백합니다.그러나,대부분의 프로젝트에 나가서 우리가 잊지 및로의 패키지 않고 최고 수준의 구조입니다.이 anti-패턴은 일반적으로 자체적으로 패키지를 위해 무언가가 다음과 같'청취자'또는'작업 그룹 그렇지 않으면 없는 클래스는 단순히기 때문에 그들이 일어날 구현하는 동일한 인터페이스입니다.

모듈 내에서,또는 작은 응용 프로그램을 사용 패키지 응용 프로그램에 대한 레이어입니다.가능성이 패키지와 같은 것들을 포함에 따라 다음링

  • com.mycompany.프로그램이 setup.보기
  • com.mycompany.프로그램이 setup.모델
  • com.mycompany.프로그램이 setup.서비스
  • com.mycompany.프로그램이 setup.규정
  • com.mycompany.프로그램이 setup.지속성 (또는'dao'를 위한 데이터 액세스 layer)
  • com.mycompany.프로그램이 setup.util (주의 이로 사용되는 경우'기타')

이러한 각 층을,그것은 자연을 그룹 클래스에 의해 입력하는 경우가 많습니다.일반적인 안티-패턴은 여기를 불필요하게 소개하는 너무 많은 패키지고 수준의 서브 패키지는 그래서는 거기에 몇 가지는 클래스에서 각 패키지입니다.

내가 생각하는 간단하고 정상은 그것을 생각합니다.지 않는 이상 추상적이고층에 너무 많다.그냥 깔끔하고,그것이 성장함에 따라,refactoring 그것은 간단하다.최고 중 하나의 특징 Ide 은 refactoring,그래서 왜 그것의 사용 및 저장을 두뇌의 힘 문제를 해결하는 앱과 관련된,오히려 그런 다음 메타 문제 코드는 기관입니다.

나 과거에-난 경우는 클래스를 확장하려고하고 따르는 자신의 규칙을 따릅니다.예를 들어,으로 작업할 때 Spring 프레임워크가 제 MVC 컨트롤러에서 클래스라는 패키지 com.mydomain.프로그램이 setup.웹.servlet.mvc 지 않는다면 연장 내가 그냥 갈 것입니다.com.mydomain.도메인을 도메인 물체(지만 경우에 당신의 도메인 개체를 이 패키지 얻을 수 있는 조금 다루기).도메인에 대한 특정한 상수로,내가 실제로 그들을 공용으로 상수에 가장 관련 클래스입니다.예를 들어,가 있는 경우"회원"클래스고 있 최대 멤버 이름을 일정한 길이,나는 그것에 멤버 클래스입니다.일부 상점은 별도의 상수 클래스지에서 한덩어리로 만든 관련이 없는 숫자와 문자열을 하나의 클래스입니다.본 다른 일부 상점이 문제를 해결하기 위해 시도를 작성하여 별도의 상수 클래스,하지만 그는 것처럼 시간을 낭비하고 그 결과에 너무 복잡하다.를 사용하여 이 설정과 함께 큰 프로젝트를 여러 개발자가 될 것이 중복수는 상수입니다.

나는 다음과 같 내업으로 하는 패키지 관련이 있습니다.

예를 들어:모델 를 위한 데이터베이스 관련내 통화

보기 클래스를 다루는 당신이 무엇을보

핵심 기능 클래스

Util 어떤 misc.는 데 사용되는 클래스(일반적으로 정적 기능)

etc.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top