2011-08-02 4 views
0

Recorder 클래스가 있습니다. 그것은 장면, 오디오 및 음악을 녹음 할 수 있습니다. 녹음 과정의 정확한 세부 사항은 재미없는 - 예를 현장 녹화가 여러 인스턴스 변수를 필요로하고, API는 다음과 같습니다 위해 :상속을 사용하여 기능을 계층화 하시겠습니까?

- (void) startRecordingScene: (Scene*) scene; 
- (void) stopRecordingCurrentScene; 

같은 오디오와 음악에 간다. 제가 수업에 관해 싫어하는 점은 실제로 녹음 장면, 오디오 및 음악을위한 세 가지 수업이라는 것입니다. 수업을 나누고 싶지만 어떻게할지는 모르겠다. 이것은 Objective-C이므로 카테고리를 사용할 수는 있지만 새로운 인스턴스 변수를 추가 할 수는 없습니다.

상속을 사용하여 기능을 레이어하는 방법에 대해 어떻게 생각합니까? SceneRecorder, AudioRecorderMusicRecorder과 같으며 각각 앞의 것과 상속합니다. 이것은 상속을 오용하는 것처럼 느껴집니다. 세 가지가 관련되어 있지만 실제로는 AudioRecorderSceneRecorder이라고 말할 수는 없습니다. 나는 그들에게 AudioRecorder, AudioAndSceneRecorder 등이라고 부를 수는 있지만 엉망이다.

구성은 어떻습니까? 세 가지 구성 요소 모두 녹음 자체 또는 마지막 녹음 이벤트에 대한 정보와 같은 일부 데이터를 공유해야합니다. 그래서 구성도 법안에 맞지 않는 것 같습니다.

그런 디자인에 대해 어떻게 생각하세요?

답변

1

음악은 분명 Audio의 하위 집합이므로 MusicRecorder는 AudioRecorder의 하위 클래스가 될 수 있습니다. 장면은 아마도 비디오와 오디오일까요? Obj-C에는 다중 상속이 없지만 어쨌든 장면은 오디오와 비디오가 분리되어 있지 않으므로 둘 다 Recorder의 하위 클래스 여야합니다.

전체 혼란을 없애고 클래스 클러스터의 보이는 부분 인 Recorder 만 노출 할 수 있습니다. 클러스터를 구성하는 다양한 클래스는 비공개로 유지됩니다. 의지로 결합 할 수있는 방법입니다. 그냥 레코더 클래스는 모든 가능성을 노출해야합니다 : 외부, 하나 개의 클래스 만이 동안

-(id) initWithMusic:(Music *)music; // returns MusicRecorder 
-(id) initWithScene:(Scene *)scene; // returns SceneRecorder 

등 내부적으로 설계, 그것은 의미가 계층 구조를 사용할 수있다. 두 세계의 장점, IMO.

+0

답변 해 주셔서 감사합니다. 디자인 문제를 논의 할 때의 문제점은 토론을 가로 지르지 않고 올바른 정보를 고를 수없는 것입니다. 음악, 오디오 및 장면 대신 A, B 및 C와는 전혀 관련이없는 그림을 그릴 수 있습니다. – zoul

+0

완전히 관련이 없지만 레코더가 많은 동작을 공유하면 Recorder 클래스의 개별 하위 클래스 여야합니다. 클래스 클러스터가되기를 원하거나 스스로를 인스턴스화해서는 안되는 "추상적 인"Recorder 클래스를 드러내고 자한다면 당신의 결정입니다. 나는 클래스 클러스터를 선호한다. –

관련 문제