プログラマーが「オブジェクトではなくインターフェースに対してコードを書け」と言うのはどういう意味か?
2023-08-04 23:54:55
質問
私は、この度、非常に長くて困難な学習と研究の探求を開始しました。 を適用する TDD を私のワークフローに適用するための非常に長いクエストを開始しました。私は、TDD が IoC の原則と非常によく合うという印象を抱いています。
SOでTDDタグのついた質問をいくつか見た後、オブジェクトではなくインターフェースに対してプログラミングするのは良い考えだと読みました。
これが何であるか、そしてどのように実際のユースケースに適用するかについて、簡単なコード例を提供することができますか?簡単な例は、私 (および学習したい他の人々) が概念を把握するための鍵です。
どのように解決するのですか?
考えてみてください。
class MyClass
{
//Implementation
public void Foo() {}
}
class SomethingYouWantToTest
{
public bool MyMethod(MyClass c)
{
//Code you want to test
c.Foo();
}
}
なぜなら
MyMethod
は
MyClass
に置き換えたい場合は
MyClass
をモックオブジェクトに置き換えてユニットテストを行いたい場合、それはできません。インターフェイスを使用するのがベターです。
interface IMyClass
{
void Foo();
}
class MyClass : IMyClass
{
//Implementation
public void Foo() {}
}
class SomethingYouWantToTest
{
public bool MyMethod(IMyClass c)
{
//Code you want to test
c.Foo();
}
}
これで
MyMethod
をテストすることができます。なぜなら、これは特定の具象実装ではなくインターフェースのみを使用しているからです。そして、そのインターフェイスを実装することで、テストのために必要なあらゆる種類のモックや偽物を作成することができます。Rhino Mocks のようなライブラリもあります。
Rhino.Mocks.MockRepository.StrictMock<T>()
のようなライブラリもあり、これは任意のインターフェイスを受け取り、その場でモックオブジェクトを構築してくれます。
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】「namespace」なのに「type」のように使われる。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】C#で四捨五入する方法
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み] KotlinのMutableListを空のMutableListに初期化するには?