2012-03-24 93 views
0

這個類的三種初始化方法非常非常非常相似。我想看看是否有方法將調用鏈接在一起,可能會涉及需要兩個參數的方法。謝謝。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

爲什麼這是一個類,而不是命名空間? – 2012-03-24 21:02:25

+2

存儲一個常量引用的地址是非常危險的。你不知道該對象實際上是在函數調用之後生存的。 – 2012-03-24 21:04:18

+0

@KerrekSB它將成爲一個命名空間的成就? – Casey 2012-03-24 22:51:55

回答

3
  1. 僅限第3個變體。
  2. 更改對指針的引用。
  3. 發送NULL您不需要的參數。
  4. 在做特定代碼之前檢查NULL

PS:在您當前的版本中,在對象中存儲傳遞引用的地址不是一個好主意。

0

這些都是很短的功能,所以我懷疑這將是值得的時間和精力來修改代碼。但我可能也想這樣做。您可以創建另一個私有函數,其他三個函數調用某些參數來執行它們共同執行的所有操作。這樣常見的操作就在一個地方。這取決於你是否值得。如果你擔心將來會維護,那就去做吧。

+0

啊,仔細看後,我發現這些函數調用的函數的參數並不是唯一的區別。相反,函數調用本身是不同的,只依賴於輸入的類型。在這種情況下,您可能只想按照Krizz的說法做,並保留第三個功能。如果傳遞給該函數的指針不是NULL,則只執行測試。 – ShiggityShiggityShwa 2012-03-24 21:11:51