CIRCLE
およびSQUARE
classesのすべてのメンバーを作成するとOverridable
、それらを継承し、すべてのメンバーをスタブでオーバーライドできます。たとえば、次のようになります。
Public Class Circle
Public Overridable Function Area() As Integer
' Complicated logic
End Function
End Class
Public Class MockCircle
Inherits Circle
Public Overrides Function Area() As Integer
Return 10
End Function
End Class
ただし、元のクラスのコンストラクターに作成が困難なパラメーターが多数必要な場合、クラスは引き続き基本コンストラクターを呼び出す必要があるCIRCLE
ため、それは役に立ちません。MockCircle
望ましい解決策は、インターフェイスを使用することです。ADD
メソッドに具象オブジェクトを受け入れる代わりに、代わりにインターフェースCIRCLE
を実装するオブジェクトを要求させます。ICircle
Public Interface ICircle
Function Area() As Integer
End Interface
Public Class Circle
Implements ICircle
Public Function Area() As Integer Implements ICircle.Area
' Complicated logic
End Function
End Class
Public Class MockCircle
Implements ICircle
Public Function Area() As Integer Implements ICircle.Area
Return 10
End Function
End Class
Public Class MyMath
Public Function Add(c As ICircle, s As ISquare) As Integer
Return c.Area() + s.Area()
End Function
End Class
CIRCLE
これで、がそのコンストラクターで何を必要としているかは問題ではなくなりました。これで、メソッドにオブジェクトまたはオブジェクトのいずれかを指定でき、ADD
どちらの方法でも機能します。オブジェクトは から継承しないため、複雑な依存関係を共有しません。この方法論には実は便利な名前もあります。これは、依存性注入 (DI) と呼ばれます。多くの単体テストを行う場合は、時間をかけて DI に関する調査を行う価値があります。理想的には、クラスの依存関係もすべてインターフェイスを介して行われるため、依存関係のすべてのモック オブジェクトを与えることで、オブジェクトを簡単に作成することもできます。CIRCLE
MockCircle
MockCircle
CIRCLE
CIRCLE
CIRCLE
コードの表面的な問題についても言及する義務があると感じています。.NET フレームワークおよび Microsoft 標準との一貫性を保つために、すべてのメソッドとクラス名に PascalCase を使用する必要があります。したがって、たとえば、それはAdd
ではなく である必要があり、 andではなくandADD
である必要があります。また、クラス名は文字「i」で始まらないでください。Microsoft の標準によれば、型名の先頭に「I」を付けると、それがクラスではなくインターフェイスであることを意味します。最後の問題は、関数が戻り値の型を指定していないことです。すべての関数の戻り値の型を常に指定する必要があります。たとえば、私の例では、 return に変更しました。Circle
Square
CIRCLE
SQUARE
iMath
ADD
As Integer