これが何層もの間接化になるのではないかと思っていました。
代替テキスト http://img244.imageshack.us/img244/7371/classdiagram1.jpg
私は少し説明しようとします。アイデアは、Do および Eval メソッドのみを公開する COM オブジェクトの上に API を構築しているということです。
以前は、IComObject を Table クラスに渡して直接処理していましたが、Table クラスをテストしようとすると、IComObject をモックして、コマンドがテーブル クラスの COM オブジェクトに送信されることを心配していました。
基本的な考え方は、COM オブジェクトで適切なコマンドを呼び出す役割を担うコマンド ランナーを用意し、Table (およびその他) オブジェクトはコマンド ランナーと対話するだけで、コマンドが実行されることを心配する必要がないというものです。次に、私のテストでこれを行うことができます:
Mock<TableCommandRunner> mockrunner = new Mock<TableCommandRunner>();
mockrunner.Setup(run => run.getName("DummyTable")).Returns("FakeName");
Table table = new Table("DummyTable");
//Table.Name just calls commandrunner.getName
Assert.Equal(table.Name,"FakeName");
間接的な層が多すぎますか、それとも問題ありませんか?
注: テーブルだけでなく、Map、Window、Object など、すべてコマンド ランナーと通信するクラスがさらに多くなります。