Baru dicoba, langsung ditulis. Jadi maaf jika kurang begitu mendalam. Code Contracts adalah fitur lungsuran proyek Microsoft Research, Spec#. Secara garis besar, Microsoft mendefinisikan Code Contracts demikian :
Code Contracts provide a language-agnostic way to express coding assumptions in .NET programs. The contracts take the form of pre-conditions, post-conditions, and object invariants. Contracts act as checked documentation of your external and internal APIs. The contracts are used to improve testing via runtime checking, enable static contract verification, and documentation generation. Code Contracts bring the advantages of design-by-contract programming to all .NET programming languages.
Apabila selama ini, kita menggunakan Debug.Assert() untuk memberitahukan error kepada developer sendiri dan if (boolean) throw (exception) untuk menangani boundary, maka Code Contracts punya fungsi yang kurang lebih mirip. Namun dengan fitur yang lebih luas.
Untuk mendapatkannya, anda bisa mendownload Code Contracts Premium di sini untuk Visual Studio 2010 Team System dan Ultimate. Kemudian lakukan instalasi

Setelah instalasi selesai, jalankan Visual Studio. Create project dan cek properties-nya, kemudian pilih menu Code Contracts dan aktifkan Static Checking dan Show Squiggles.

Untuk menunjukkan fungsionalitasnya, saya akan memberikan sebuah kode sederhana (rada ngasal), untuk menangani transfer duit via rekening. Misalnya seperti berikut ini :

Sebenarnya banyak yang suka menulis kode seperti di atas, termasuk saya. Namun (menurut Microsoft Research), penulisan seperti itu mencampuradukkan antara requirement (contract) dengan behavior utama program. Sehingga kode pun menjadi terlihat crowded.
Ada lima macam kontrak yang didefinisikan oleh Code Contracts, yaitu :
- Pre-Condition : ini requirement pada pemanggil method, misalnya parameter tidak boleh negatif.
- Post-Condition : ini mewakili constraint pada akhir method, bisa berupa final state atau return value.
- Invariant : ini adalah contract yang memberikan constraint state selama object tersebut visible, misalnya di sepanjang pemrosesan sebuah string nilainya tidak boleh null
- Assumption / Assertion : kurang lebih mirip dengan Debug.Assert(), misalnya untuk mengasumsikan angka hasil pelemparan dadu yang digenerate secara random (dalam kasus ini, angka random tidak dapat dinyatakan hasilnya tanpa asumsi).
- Legacy : misalnya untuk menandai akhir dari sebuah rangkaian contracts (untuk kepentingan binary rewriter)
Dengan Code Contracts, kita bisa memanfaatkan method Contract.Required (untuk memeriksa pre-condition) dan Contract.Ensures(untuk memeriksa post-condition) :

Jelas kan? Kode menjadi lebih clean karena contract dan behavior dipisahkan dengan jelas.
Fitur Code Contracts yang masih dalam proses pengembangan ini, tidak hanya sampai di situ. Apabila kita lihat, pada bagian Error List, Code Contracts juga memberikan warning dan informasi, misalnya : berapa banyak assertions yang sukses, gagal, dan tidak terbukti (unproven). Bahkan ada pula contract suggestion yang direkomendasikan kepada developer.

Apabila anda suka nonton film detektif, maka di sana biasanya dikisahkan seorang teroris dapat dicegah jauh-jauh sebelum dia melakukan teror. Di dalam Code Contracts ini kita juga dapat mendeteksi kekeliruan kode sebelum kode tersebut dieksekusi. Cukup cek tooltip pada bagian yang di-highlight :

Di dalam kode di atas muncul bahwa salah satu contract bersifat unproven, karena selalu valid tidaknya nilai contract tersebut belum dapat dibuktikan pada saat compile-time (misalnya karena nilai contract tersebut harus menunggu input dari user. Walaupun untuk kasus ini sebenarnya dapat digunakan Assumption atau Assertion).
Atau jika misalnya saya dengan sengaja memanggil method TransferDuit dengan parameter invalid (misalnya jumlah kurang dari nol), maka secara otomatis akan diberitahukan kekeliruan tersebut pada saat pemanggilan method. Ya. Diberitahukan pada pemanggilan method, bukan di dalam method yang dipanggil :

Masih banyak fitur CodeContracts lainnya untuk mendukung testing, misalnya document generation, yang bisa anda eksplorasi sendiri. Saya pun masih dalam proses mencobanya. Namun saya rasa produk ini cukup menjanjikan untuk digunakan di kemudian hari.