Saya tidak tahu dari mana pernyataan bahwa "itu tidak dan sering tidak dapat melakukan analisis statis" berasal. Bagian pertama dari pernyataan itu jelas-jelas salah. Yang kedua tergantung dari apa yang Anda maksud dengan "sering". Saya lebih suka mengatakan bahwa sering , ia melakukan analisis statis, dan jarang, gagal melakukannya. Dalam aplikasi bisnis biasa, jarang menjadi lebih dekat dengan tidak pernah .
Jadi ini dia, manfaat pertama:
Manfaat 1: analisis statis
Penegasan argumen dan argumen biasa memiliki kelemahan: mereka ditunda hingga kode dieksekusi. Di sisi lain, kontrak kode memanifestasikan diri pada tingkat yang jauh lebih awal, baik pada langkah pengkodean atau saat menyusun aplikasi. Semakin awal Anda menemukan kesalahan, semakin murah untuk memperbaikinya.
Manfaat 2: semacam dokumentasi yang selalu terkini
Kontrak kode juga menyediakan semacam dokumentasi yang selalu terkini. Jika komentar XML dari metode SetProductPrice(int newPrice)
memberitahu bahwa newPrice
harus lebih tinggi atau sama dengan nol, Anda mungkin berharap bahwa dokumentasi sudah mutakhir, tetapi Anda juga dapat menemukan bahwa seseorang mengubah metode sehingga newPrice = 0
melempar ArgumentOutOfRangeException
, tetapi tidak pernah mengubah dokumentasi yang sesuai. Mengingat korelasi antara kontrak kode dan kode itu sendiri, Anda tidak memiliki masalah dokumentasi yang tidak sinkron.
Jenis dokumentasi yang disediakan oleh kontrak kode juga berharga dengan cara yang sering, komentar XML tidak menjelaskan nilai yang dapat diterima dengan baik. Berapa kali adalah saya bertanya-tanya apakah null
atau string.Empty
atau \r\n
merupakan nilai yang berwenang untuk metode, dan XML komentar diam itu!
Kesimpulannya, tanpa kontrak kode, banyak potongan kode seperti itu:
Saya akan menerima beberapa nilai tetapi tidak yang lain, tetapi Anda harus menebak atau membaca dokumentasinya, jika ada. Sebenarnya, jangan membaca dokumentasinya: ini sudah ketinggalan zaman. Cukup lewati semua nilai dan Anda akan melihat yang membuat saya membuang pengecualian. Anda juga harus menebak rentang nilai yang dapat dikembalikan, karena meskipun saya akan memberi tahu lebih banyak kepada Anda tentang mereka, itu mungkin tidak benar, mengingat ratusan perubahan yang dibuat untuk saya selama beberapa tahun terakhir.
Dengan kontrak kode, itu menjadi:
Argumen judul dapat berupa string non-null dengan panjang 0..500. Bilangan bulat yang mengikuti adalah nilai positif, yang bisa menjadi nol hanya ketika string kosong. Akhirnya, saya akan mengembalikan IDefinition
objek, tidak pernah null.
Manfaat 3: kontrak antarmuka
Manfaat ketiga adalah bahwa kontrak kode memberdayakan antarmuka. Katakanlah Anda memiliki sesuatu seperti:
public interface ICommittable
{
public ICollection<AtomicChange> PendingChanges { get; }
public void CommitChanges();
...
}
Bagaimana Anda, hanya menggunakan penegasan dan pengecualian, jaminan yang CommitChanges
dapat dipanggil hanya ketika PendingChanges
tidak kosong? Bagaimana Anda menjamin itu PendingChanges
tidak pernah terjadi null
?
Manfaat 4: menegakkan hasil suatu metode
Akhirnya, manfaat keempat adalah dapat Contract.Ensure
hasil. Bagaimana jika, ketika menulis metode yang mengembalikan integer, saya ingin memastikan bahwa nilainya tidak pernah lebih rendah atau sama dengan nol? Termasuk lima tahun kemudian, setelah menderita banyak perubahan dari banyak pengembang? Segera setelah metode memiliki beberapa titik pengembalian, Assert
s menjadi mimpi buruk pemeliharaan untuk itu.
Pertimbangkan kontrak kode tidak hanya sebagai sarana kebenaran kode Anda, tetapi cara yang lebih ketat untuk menulis kode. Dengan cara yang sama, seseorang yang menggunakan bahasa dinamis secara eksklusif mungkin bertanya mengapa Anda menerapkan tipe di tingkat bahasa, sementara Anda dapat melakukan hal yang sama dalam penegasan saat dibutuhkan. Anda bisa, tetapi pengetikan statis lebih mudah digunakan, lebih sedikit rawan kesalahan dibandingkan dengan banyak pernyataan, dan mendokumentasikan diri sendiri.
Perbedaan antara pengetikan dinamis dan pengetikan statis sangat dekat dengan perbedaan antara pemrograman biasa dan pemrograman berdasarkan kontrak.