2011-03-15 6 views
5

둘 중 어느 것을 선호해야합니까?기본 클래스와 유틸리티 클래스

클래스 A, B 및 C

의해 호출되는 일부 방법 이러한 방법은 클래스 D (A, B 및 C의 염기) 내에 캡슐화되어야한다 있는가?

또는

은 그 방법은 U와 다른 클래스가 필요에 따라 방법을 사용하는 객체의지지합니다 클래스에 캡슐화되어야합니다.

어떤 기준으로 결정해야합니까?

감사합니다.

+4

클래스 A, B 및 C 사이에 개념적인 관계가 있습니까? –

+0

A, B, C로 인터페이스를 만들고 구현하는 것은 어떻습니까? –

+0

@p : 오직 클래스 D가 사용하는 데이터를 구성합니다. A에는 다른 클래스와 다른 입력이 필요합니다. @Srinivas : 이러한 메서드의 구현은 A, B 및 C에 대해 정확히 동일합니다. – Azodious

답변

9

static 유틸리티 클래스를 만들어야합니다. 실제로 의미가 있는지

A, BC 실제로 D이다 — 경우 상속을 사용합니다.

+0

네, 그렇습니다. D에는 세 가지 유형의 알고리즘을 호출하는 메소드가 있습니다. A, B 및 C는 알고리즘에 특정한 데이터를 구성하고 실행을위한 일반적인 메소드를 호출합니다. – Azodious

+0

@Azo : 항상 세부 사항이 도움이됩니다. 이 경우 상속을 사용해야하며'A','B' 및'C'로 대체 된 추상 메소드가 있어야합니다. – SLaks

+0

전적으로 두 번째 요점에 동의하지만, 유틸리티 메소드에 상태 (예 : 정적 변수 없음)가없고 부작용 (파일 IO 또는 데이터베이스 활동 등)이없는 정적 유틸리티 클래스의 사용을 권장합니다. . A, B, C 단위 테스트의 경우, mock 객체를 사용하여 정적 유틸리티 클래스에서 이들을 분리하는 것은 거의 불가능합니다. 생성자 삽입을 통해 A/B/C에 전달되는 비 정적 유틸리티 클래스를 사용하는 것이 훨씬 좋습니다. 그런 다음 코드를 구성 할 수 있으며 집계를 통해 동작을 얻습니다. – sheikhjabootie

2

분명히 인 경우가 아니면 관계가 아니라면 상속에서 벗어날 것입니다. 위의 설명에서이 경우가 아닌 것으로 판단됩니다. 나의 선호하는 솔루션은 다음과 같습니다

  1. 이 A, B, C
  2. 으로에게 유틸리티 클래스의 인스턴스를 주입이를 A, B, C 적절한 유틸리티 클래스를

장점을 인스턴스화 클래스를 주입하는 것은 당신이 다른 구현을 쉽게 제공 할 수 있다는 것입니다. 이것은 특히 테스트에 유용합니다. 정적 메서드를 사용하는 싱글 톤 또는 클래스는 같은 이유로 문제를 일으키는 경향이 있습니다. 쉽게 대체하거나 대체 할 수 없습니다.

3

클래스 A, B 및 C에 특정한 작업을 수행하는 경우 메소드가 수행중인 작업에 대한 결정을 기반으로합니다. 그런 다음 기본 클래스에 있어야합니다. 이렇게하면 클래스 관련 기능을 시스템의 나머지 부분에서 멀리하여 코드를 깨끗하게 유지할 수 있습니다. (물론 A, B, C가 이미 D에서 상속 받았거나 분명히 관련되어 있다고 가정합니다.)

다른 유형의 작업을 수행하는 경우 A, B 및 C에 내재되어 있지 않습니다. C는 재사용 기회를 극대화하기 위해 유틸리티 클래스에 있어야합니다.

다른 유형 (예 : 예쁜 시간 인쇄)과 관련된 다른 유형의 작업을 수행하는 경우 의 확장 메소드 인 유형을 사용하는 것이 좋습니다.

+1

+1 : 너는 나를 때렸다. SLaks 언급 그것도 OP는 정적 기능을 인식하지 못하는 것 같습니다. 아마도 유틸리티 클래스에 대해서도 언급할만한 가치가있을 것입니다. –

0

기본 클래스 사용 기본 클래스에 따라 일부 논리 만 작성하려는 경우 - 기본 클래스를 만드는 것이 좋습니다. 이 경우 파생 클래스는 기본 클래스로 완전히 대체 가능해야합니다. 파생 된 유형을 확인하고 이에 따라 작동하는 스위치 논리가 없어야합니다.리스 코프 치환 원칙을 참조하십시오 http://en.wikipedia.org/wiki/Liskov_substitution_principle

사용 유틸리티 클래스 을 일부 언어는 다중 상속을 지원하지 않는 한계를 가지고있다. 의미있는 기본 클래스가 이미있는 경우 유틸리티 클래스로 이동해야합니다. 또한, 상속을 사용하면 dervied 클래스에서 기본 클래스로 긴밀한 연결을 만듭니다.

파생 클래스가 자연스럽게 기본 클래스로 대체 가능한 경우 기본 클래스로 이동하겠다. 클래스간에 재사용 가능한 코드를 공유하는 것이 목적이라면 유틸리티 클래스를 사용하는 것이 더 합리적입니다.

관련 문제