2010-07-26 3 views
9

몇 가지 공통적 인 동작을 갖고 몇 가지 전략을 구현 중이며 공통 작업이 살아 있어야하는 곳은 미정입니다.Java 추상 클래스 또는 정적 유틸리티 클래스 디자인 선택

  • 1 상황 및 3 전략으로 가정하면 전략에 사용되는 작업 중 일부는 공유되며 일부는 전략 중 하나 일 뿐인 나머지 2 개에서만 필요합니다.
  • 공유되는 구성원 수준 상태가 없으므로 유일한 작업 만 효과적으로 상태 비 저장됩니다.
  • 작업의 의도는보기 도우미와 같은 파일의 상태 서식 지정을 지원하는 것입니다.

옵션 1 : 확인 AbstractStrategy 클래스

  • 내가 자바를 사용하고 지금이 바로 는 앞으로이 기능을 사용하여 멀리합니다.
  • 상속이 발생하기 쉽습니다. 융기 구조의 .
  • 작업이 최종적입니다.

옵션 2 :

  • 유연한 정적 헬퍼의 백분율 클래스를 생성하지만, 어떤 이유로 코드 냄새 같은 느낌이 든다.
  • 돌출되지 않음.

모든 권장 사항이나 기본 설정은 무엇입니까?

내가 일하고있는 레벨은 컨텍스트 레벨이 아니라 전략 레벨입니다 (위키피디아 링크 참조).

+0

유틸리티 클래스는 OOP에 존재하지 않습니다. http://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html – yegor256

+0

나는 추상화가있는 것을 선호합니다. ** 오픈 - 클로즈 ** 패턴을 따를 필요가 있습니다. 즉, 프로그램은 확장을 위해 열릴 것이지만 수정을 위해 닫힙니다 ... – Jay

답변

7

하나의 이유가 있습니다 ... 거대한 이유 ... 추상 클래스 나 인터페이스를 통해 정적 Util 클래스를 사용하는 이유입니다.

나중에 메서드를 추가 할 수 있습니다.

추상 클래스 또는 인터페이스를 사용하면 해당 클래스/인터페이스에 대한 모든 변경 사항을 추상 클래스 또는 인터페이스에서 상속 한 모든 클래스에서 변경해야합니다. 이것은 공개 API를 작성하는 경우 특히 문제가됩니다.

Java 프레임 워크에는 정적 메서드가있는 흩어져있는 util 클래스가 있습니다. 가장 잘 알려진 패키지는 CollectionsArraysjava.util 패키지입니다.

+0

좋은 지적. 나는 개인적으로 정적이라고 생각합니다. 이 함수는 ViewHelper 패턴에 잘 들어 맞기 때문에 이것을 복잡하게하는 것은 불필요한 것처럼 보입니다. – JamesC

+0

이 주제에서 RestAssured 라이브러리와 Groovy 프로젝트의 XMLSlurper는 정적 유틸리티 클래스를 사용하는 좋은 예라고 생각합니다. – djangofan

1

이렇게하려면 여러 가지 방법이 있습니다. 다른 사람들이 선택 항목을 건너 뛸 수 있지만

  1. 은 (추상 메소드를 오버라이드 (override)) => 어떤 전략이 모든 작업을 구현하는 것이 추상 메소드로 실행의 변수 부분을 추상 클래스를 사용합니다. 이 경우 선택적 작업은 추상 메서드가 아닌 빈 후크 메서드가 될 수 있습니다. 그렇게하면 하위 클래스에서 이러한 작업을 빈 메서드로 구현해야하는 번거 로움을 피할 수 있습니다.

  2. 실제로 '전략'인터페이스를 사용하십시오 (예를 들어, 위키피디아 기사와 같은 실행 메소드 사용). 클라이언트 클래스는 전략 구현에 의해 제공됩니다 (익명의 내부 클래스 또는 실제 완전한 전략 클래스 일 수 있음).

첫 번째는 더 간단하지만, 더 단단하다 : 당신은 작업의 수 (특별히 추상적 인 것들)를 수정해야하는 경우, 모든 서브 클래스 업데이트해야합니다.

두 번째는 더 유연하지만 정적 유틸리티 메서드를 위임하거나 사용하여 다른 전략간에 일반적인 작업을 "공유"할 수있는 방법을 찾아야합니다.당신이 나와 두 외에 다른 옵션이 있습니다

+0

"두 번째는 더 융통성이 있지만 공통점을 공유하는 방법을 찾아야합니다 정적 유틸리티 방법을 위임하거나 사용하여 다른 전략 사이에서 작업을 수행 할 수 있습니다. " - 전략은 제가 일하고있는 수준이며 당신이 말하는 공통 부분은 제가 풀려고하는 문제입니다. – JamesC

+0

일반적인 부품은 소규모 사업 단위에 적합합니까? 제가 의미하는 바는 다음과 같습니다 : 함수로 모델링 할 수 있습니까? 그렇다면 작은 작전 클래스에서 이러한 작업을 캡슐화하고 이러한 전체 전략을 다시 사용하는 것이 좋습니다. 이점은이 경우 테스트 가능성과 재사용 가능성입니다. – dimdm

+0

소규모 사업은 가능하지만 사업 전반에는 해당되지 않습니다. 전략에 대해서만 적용 할 수 있습니다 - 그래서 정적 util 패키지 제한, 생각하고있어? – JamesC

1

는 :

그것은 당신이 당신에게 당신이 필요한 기능 만 끌어 당길 수있는 성분의 일종 싶은 나에게 소리. 아마도 명령 패턴을 사용하여 작업을 패키지화 한 다음 이들로부터 전략을 어셈블 할 수 있습니까?

장점 :

  • 전략 상속은 필요하지 않음.
  • 전략은 사용되지 않거나 숨겨진 '공유 방법'을 볼 수 없습니다.
  • 관련이없는 (아마도) 관련 메소드가있는 정적 유틸리티 클래스가 없습니다.
  • 더 간단한 유닛 테스트 - 작업을 독립적으로 테스트 할 수 있습니다.
  • 작업을 반복하는 간단한 공유 전략 클래스입니다.

단점 :

  • 추가 클래스.
  • 작업은 제한적인 공통 명령 인터페이스를 준수해야합니다.
  • 포맷터가 될 수있는 매우 간단한 작업에 과도 할 수 있습니다.
+0

전략은이 인스턴스의 명령과 매우 유사하므로 상속을 피할 수있는 방법을 알지 못합니다. 명령을 올바르게 이해하면 명령에서 공통 기능을 공유해야하기 때문에 구현 방법을 어떻게 제안합니까? – JamesC

+0

전략이 ​​명령으로 구성되어 있다고 제안합니다. 각 '함수'는 명령 인스턴스입니다. 그런 다음 적절한 명령을 선택하고 선택하여 전략을 구성 할 수 있습니다. – teabot

1

초록으로 선언 된 경우 사람들은 확장을 위해 설계된 것입니다. 개인 생성자을 선언하는 것이 더 좋습니다.

관련 문제