2011-12-17 5 views
1

高性能を必要とするMFCアプリケーション用のアジャイルとTDD環境をセットアップしようとしています。TDDとDI for VC++プラットフォーム

MFCビュー/ドキュメントはテスト可能ではないので、私はそれらをできるだけダムにし、Boost Testフレームワークで他のクラスをテストするつもりです。 - あなたがこの環境のためのより良い方法またはより良いテストフレームワークを知っているかどうか私に知らせてください。

TDDを動作させるためには、疎結合構造には依存性注入が不可欠であると思います。どうすればこれを達成できますか?すべての参照またはヒントが評価されます。

+0

クラスを表すインターフェイスにshared_ptrを使用します。私はhttp://ideone.com/r1Ou7のようなものを考えている。次に、あなたのコンストラクタでクロック実装を取るか、setClockなどの実装を設定する別のメソッドを用意するだけです。 – Lalaland

+0

@EthanSteinberg残念ながら[この記事](http://programmaticallyspeaking.blogspot.com/2010/04/beautiful-dependency-injection-in-c.html) –

+1

によれば、その記事はshared_ptrを無視しているようです。記事がダイナミックメモリの使用を嫌う主な理由(私の提案)は、管理が難しいためです。 Shared_ptrはほとんどの管理上の問題を取り除きます。しかし、パフォーマンス上の理由(おそらく、可能性がある)のためにshared_ptrを使用できない場合は、物事は非常に複雑になるでしょう(記事が話しているように)。 – Lalaland

答えて

1

クラスを表すインターフェイスにshared_ptrを使用します。

私はその後、あなたは自分のコンストラクタでクロックの実装を取るか、setclockスクリプトか何かのように、実装を設定するための別の方法を持っている可能性が

#ifndef CLOCK_HPP_INCLUDED 
#define CLOCK_HPP_INCLUDED 

#include <boost/shared_ptr.hpp> 


class Clock 
{ 
public: 
    static boost::shared_ptr<Clock> create(); 
    virtual void init() = 0; 
    virtual double getSeconds() = 0; 
    virtual void sleepUntilNext(double howMuch) = 0; 

protected: // No polymorphic deconstruction because of shared_ptr 
    ~Clock() 
    {} 


}; 

#endif 

のようなものを考えています。この

例は、その後、あなたのユニットテストでは、あなたがこのような何かを行うことができ

#include "clock.hpp" 
class MyClass 
{ 
public: 
    myClass(boost::shared_ptr<Clock> aClock) : myClock(aClock) 
    { 
     myClock.init(); 
    } 

private: 
    boost::shared_ptr<Clock> myClock; 
} 

次のようになります。

boost::shared_ptr<Clock> mock = createMockClock(); 
MyClass b(mock); 

mock.assertThatInitIsCalled(); 

また、単にリソースを無視することができます。 shared_ptrは自分自身を削除します。

これにかかるコストは、動的割り当て、仮想関数呼び出し、およびshared_ptrのオーバーヘッドによってわずかなパフォーマンスの低下になります。

利点は、モジュール性が向上し、コンパイル時間が短縮され、googlemock(それらにはインターフェイスが必要)、リソース管理が容易になります(ヌルポインタを使用することはありません)。

+0

注入の仕方やそのオブジェクトの寿命がホストオブジェクトなどに依存しないことを示すサンプルを追加した方が、もっと好きかもしれません。しかし、私はその要点を得て、この質問を受け入れる十分な理解を持っています。 –