2012-03-24 100 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