良い質問のタイトルを見つけるのに問題があったので、それを自由に改善してください。
エンティティコンポーネントシステム をC++で実装したいのですが、初めてTDDを使用したいと思います。ターゲットの「アーキテクチャ」がすでに指定されている場合、TDDがどれほど役立つか疑問に思いますが、とにかく試してみたいと思います。私の問題はTDDの問題のほうが多く、別の状況でも問題が発生する可能性があります。
最初のテストでは、Component
がEntity
sのセットを「所有」する必要があるため、Entity
にComponent
を追加できるかどうかを確認することになっていた(おそらくこれは悪いテストであり、問題はすでにここにありますか?)。これまでのところコードは存在せず、私は1つではないかもしれないジレンマに直面しています。私はこれを行うテストを書くことができます:
Entity e;
Component c;
e.add(c);
しかし、add
が正しく機能したことをどのように主張すればよいでしょうか?遅かれ早かれ、ある種のhas_component
メソッドが必要になることはわかっていますが、今は追加機能を実装するべきではありませんか、それともすべきですか?また、Entity
のパブリックインターフェイスにリストタイプを設定し、それをテストで使用して、後で「離れて」リファクタリングすることもできます。
ここでの正しいアプローチは何ですか? TDDに対する私の考え方は完全にずれているかもしれないので、どんな入力にも感謝しています!
あなたの最初のテストは良いスタートです。エラーチェックについて考えてみてください。addからのリターンコードがあり、それが機能したかどうかを示していますか?それとも、何か問題が発生した場合に例外をスローすることになっていますか?
推奨されるアプローチ
Entity
クラスにはメソッドhas_component()
が必要であることを知っているので、それをクラス定義に追加するだけで、常にfalse
(および大きなコメント_// TO DO !!
_)。
次のテストは次のようになります。
_assert(! e.has_component(c) );
e.add(c);
assert(e.has_component(c)); // or return FAIL to your test framework.
_
principle は、両方の関数が正しくなるまでテストが失敗することです。
代替案は何ですか
number_of_components()
などのより単純なメンバーを使用して、正しい方向に進んでいることを確認します(つまり、新しいコンポーネントを追加すると数が増え、同じコンポーネントを2回追加しても数は変わりません)。Entity
の内部を検査させます。このアプローチはカプセル化のルールを破るので、私は好きではありません。has_component()
のエミュレート/シミュレーションされた答えを提供します。それは非常に複雑な機能でしょうか、これが進むべき道です。しかし、ここのような単純な機能の場合、これはやり過ぎかもしれません。Entity
からComponents
に転送するディスパッチ関数がある場合は、それを使用してcが反応するかどうかを確認できます。