応答の落ち込みには圧倒されます... しかし恐れる必要はありません。従来の C++ コードの悪魔を追い払うための聖典があります。レガシ C++ コードを 1 週間以上も試してみたいという人は、真剣にこの本を購入してください。
127 ページに目を向けてください:恐ろしいインクルード依存関係の事例。(今、私はマイケル・フェザーズから何マイルも離れていませんが、ここで私が管理できる限りの短い答えです..)
問題: C++ では、クラス A がクラス B について知る必要がある場合、クラス B の宣言は、クラス A のソース ファイルにそのまま/テキストで含まれています。そして、私たちプログラマーはそれを間違った極端に扱うのが好きなので、ファイルは無数の他のファイルを推移的に再帰的に含めることができます。ビルドには何年もかかります..しかし、少なくともそれがビルドされる..待つことができます.
「テスト ハーネスの下で ClassA をインスタンス化するのは難しい」と言うのは控えめな表現です。(MF の例を引用 - スケジューラは deps 豊富な私たちのポスター問題の子です。)
#include "TestHarness.h"
#include "Scheduler.h"
TEST(create, Scheduler) // your fave C++ test framework macro
{
Scheduler scheduler("fred");
}
これにより、ビルド エラーが相次ぐインクルード ドラゴンが表示されます。
Blow#1 忍耐と永続性: 各インクルードを一度に 1 つずつ実行し、その依存関係が本当に必要かどうかを判断します。SchedulerDisplay がそのうちの 1 つであり、その displayEntry メソッドが Scheduler の ctor で呼び出されるとします。
Blow#2 Fake-it-till-you-make-it (RonJ に感謝):
#include "TestHarness.h"
#include "Scheduler.h"
void SchedulerDisplay::displayEntry(const string& entryDescription) {}
TEST(create, Scheduler)
{
Scheduler scheduler("fred");
}
そしてポップは依存関係とそのすべての推移的なインクルードに行きます。Fakes.h ファイルにカプセル化してテスト ファイルに含めることで、Fake メソッドを再利用することもできます。
Blow#3 練習: いつもそれほど単純ではないかもしれません..しかし、あなたはアイデアを得る. 最初の数回の決闘の後、依存関係を破るプロセスは簡単で機械的なものになります
警告(警告があると言いましたか? :)
- このファイルには、テスト ケース用の別のビルドが必要です。プログラムで SchedulerDisplay::displayEntry メソッドの定義を 1 つだけ持つことができます。そのため、スケジューラ テスト用に別のプログラムを作成します。
- プログラム内の依存関係を壊していないため、コードをよりクリーンにしていません。
- テストが必要な限り、これらの偽物を維持する必要があります。
- しばらくの間、あなたの美的感覚が損なわれるかもしれません..ただ唇を噛んで「より良い明日のために我慢してください」
この手法は、依存関係の問題が深刻な非常に大きなクラスに使用します。頻繁にまたは軽く使用しないでください。より深いリファクタリングの開始点としてこれを使用してください。時間の経過とともに、このテスト プログラムは、(独自のテストを使用して) より多くのクラスを抽出するにつれて、納屋の後ろに持ち込むことができます。
詳細については、本を読んでください。かけがえのない。仲間と戦え!