「静的解析を実行しないことが多い」という主張がどこから来たのかはわかりません。アサーションの最初の部分は明らかに間違っています。2つ目は、「多くの場合」の意味によって異なります。私はむしろ、しばしば静的分析を実行し、めったに失敗しないと言いたいです。通常のビジネスアプリケーションでは、neverに近づくことはめったにありません。
ここに、最初の利点があります。
利点1:静的分析
通常のアサーションと引数のチェックには欠点があります:コードが実行されるまで延期されます。一方、コードコントラクトは、コーディング段階で、またはアプリケーションのコンパイル中に、はるかに早いレベルで現れます。エラーを早期に発見すればするほど、修正費用は安くなります。
利点2:常に最新のドキュメントのようなもの
コード契約は、常にドキュメントの一種を提供します最新のします。メソッドのXMLコメントは場合はSetProductPrice(int newPrice)
それが伝えるnewPrice
優れていることや、ゼロに等しくなければならない、あなたはドキュメントが最新であることを願っていますが、あなたも誰かがなるようにする方法を変更することを発見するかもしれnewPrice = 0
投げるArgumentOutOfRangeException
が、対応するドキュメントを変更することはありません。コードコントラクトとコード自体の相関関係を考えると、非同期のドキュメントの問題はありません。
コードコントラクトによって提供されるドキュメントの種類も貴重であり、多くの場合、XMLコメントでは許容値を十分に説明できません。何回思った?null
やstring.Empty
または\r\n
メソッドの認可値であり、XMLのコメントは、その上静かでした!
結論として、コードコントラクトがない場合、多くのコードは次のようになります。
一部の値は受け入れますが、他の値は受け入れませんが、ドキュメントがある場合は、推測または読む必要があります。実際には、ドキュメントを読んでいない:それは時代遅れです。すべての値をループするだけで、例外をスローする値が表示されます。また、返される可能性のある値の範囲を推測する必要があります。これは、過去数年間に私に加えられた何百もの変更を考えると、それらについてもう少しお話ししたとしても、真実ではない場合があるためです。
コードコントラクトでは、次のようになります。
title引数には、0..500の長さのnull以外の文字列を指定できます。続く整数は正の値で、文字列が空の場合にのみゼロになる場合があります。最後に、IDefinition
nullではないオブジェクトを返します。
利点3:インターフェースの契約
3番目の利点は、コードコントラクトがインターフェイスを強化することです。次のようなものがあるとしましょう:
public interface ICommittable
{
public ICollection<AtomicChange> PendingChanges { get; }
public void CommitChanges();
...
}
アサートと例外のみを使用して、空でないCommitChanges
ときにのみ呼び出すことができることをどのように保証しPendingChanges
ますか?それPendingChanges
が決してないことをどのように保証しますかnull
ますか?
利点4:メソッドの結果を実施する
最後に、4番目の利点はContract.Ensure
、結果が得られることです。整数を返すメソッドを記述するときに、値が決してゼロ以下にならないことを確認したい場合はどうすればよいですか?5年後を含め、多くの開発者からの多くの変更に苦しんだ後?メソッドに複数のリターンポイントがあるとすぐに、Assert
sはそのためのメンテナンスの悪夢になります。
コードコントラクトは、コードの正確さを意味するだけでなく、より厳密なコード記述方法としても考慮してください。同様に、動的言語のみを使用した人は、言語レベルで型を強制する理由を尋ねる一方で、必要に応じてアサーションで同じことを行うことができます。ただし、静的型付けは使いやすく、多数のアサーションと比較してエラーが発生しにくく、自己文書化できます。
動的型付けと静的型付けの違いは、通常のプログラミングとコントラクトによるプログラミングの違いに非常に近いです。