2012-03-24 17 views
0

このクラスの3つの初期化メソッドは非常に非常によく似ています。私は両方の引数を必要とするメソッドに潜在的に一緒に呼び出しをチェーンする方法があるかどうかを確認したいと思います。ありがとう。私はそれが時間やコードを変更するための努力の価値があるかどう疑問があるのでC++:メソッド自体を繰り返します。 DRYの最適化が必要

AudioHandler.h

class AudioHandler { 

public: 
    static bool Initialize(const SoundLibrary& sl); 
    static bool Initialize(const Soundtrack& st); 
    static bool Initialize(const SoundLibrary& sl, const Soundtrack& st); 
    static void Release(); 
private: 
    static const SoundLibrary* _sl; 
    static const Soundtrack* _st; 
}; 

AudioHandler.cpp

bool AudioHandler::Initialize(const SoundLibrary& sl) { 
    if(_sl != NULL || _st != NULL) return false; 

    unsigned long numVoices = 0; 

    //If allegro is unable to initialize the sound drivers then return false. 
    if((numVoices = detect_digi_driver(DIGI_AUTODETECT)) == 0) return false; 
    if(install_sound(DIGI_AUTODETECT, MIDI_NONE, NULL) == -1) return false; 
    _sl = &sl; 

    return true; 
} 

bool AudioHandler::Initialize(const Soundtrack& st) { 
    if(_sl != NULL || _st != NULL) return false; 

    if(detect_midi_driver(MIDI_AUTODETECT) == 0) return false; 
    if(install_sound(DIGI_NONE, MIDI_AUTODETECT, NULL) == -1) return false; 
    _st = &st; 

    return true; 
} 

bool AudioHandler::Initialize(const SoundLibrary& sl, const Soundtrack& st) { 
    if(_sl != NULL || _st != NULL) return false; 

    unsigned long numVoices = 0; 

    if((numVoices = detect_digi_driver(DIGI_AUTODETECT)) == 0) return false; 
    if(detect_midi_driver(MIDI_AUTODETECT) == 0) return false; 
    if(install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) == -1) return false; 

    _sl = &sl; 
    _st = &st; 

    return true; 
} 

void AudioHandler::Release() { 
    _sl = NULL; 
    _st = NULL; 
    remove_sound(); 
} 
+1

名前空間ではないのはなぜですか? –

+2

定数参照のアドレスを格納することは非常に危険です。関数呼び出しの後にオブジェクトが実際に存在するかどうかはわかりません。 –

+0

@KerrekSBネームスペースとは何でしょうか? – Casey

答えて

3
  1. 3番目の亜種のみを残してください。
  2. ポインタへの参照を変更します。
  3. あなたが必要としない引数のためにNULLを送信してください。
  4. 特定のコードを実行する前にNULLを確認してください。

PS:現在のバージョンでは、オブジェクトに渡された参照のアドレスを格納することはお勧めできません。

0

これらは非常に短いの機能があります。しかし、私はおそらくそれをやりたいと思うでしょう。他の3つのプライベート関数を作成して、それらが共通して持つすべての操作を行うための特定のパラメータを呼び出すことができます。そうすれば、一般的な操作は1か所に収まります。それは価値があるかどうかはあなた次第です。あなたが将来の維持について心配しているなら、それに行きましょう。

+0

ああ、もっと詳しく見ると、これらの関数が呼び出す関数のパラメータだけが違いではないことがわかります。むしろ、関数呼び出し自体は異なっており、入力のタイプにのみ依存しています。その場合は、Krizzが言ったようにして3番目の機能を維持したいと思うかもしれません。関数に渡されたポインタがNULLでない場合にのみ、テストを実行してください。 – ShiggityShiggityShwa

関連する問題