"Statik bir analiz yapıp yapamadığı ve sık sık yapamayacağı" iddiasının nereden geldiğini bilmiyorum. İddianın ilk kısmı açıkça yanlıştır. İkincisi, "sık sık" ne demek istediğine bağlı. Sık sık statik analizler yaptığını ve nadiren de başarısız olduğunu söylerdim . Sıradan iş uygulamalarında, nadiren hiç olmadığı kadar yaklaşır .
Yani burada geliyor, ilk yararı:
Fayda 1: statik analiz
Sıradan iddiaların ve argüman kontrolünün bir dezavantajı vardır: kod çalıştırılana kadar ertelenirler. Diğer taraftan, kod sözleşmeleri, kodlama aşamasında ya da başvuruyu derlerken kendilerini çok daha erken bir düzeyde ortaya koymaktadır. Bir hatayı ne kadar erken yakalarsanız, düzeltmesi o kadar az masraflıdır.
Fayda 2: Her zaman güncel belgeler
Kod sözleşmeleri ayrıca her zaman güncel olan bir tür belge sunar . Yöntemin XML yorumu, bunun üstün veya sıfıra eşit olması gerektiğini SetProductPrice(int newPrice)
söylerse newPrice
, belgelerin güncel olduğunu umabilirsiniz, ancak birinin yöntemi newPrice = 0
atması için ArgumentOutOfRangeException
değiştirdiğini ancak karşılık gelen belgelerin değişmediğini keşfedebilirsiniz . Kod sözleşmeleri ile kodun kendisi arasındaki korelasyon göz önüne alındığında, senkronizasyon dışı dokümantasyon probleminiz yoktur.
Kod sözleşmelerinin sağladığı dokümantasyon türleri, XML yorumlarının kabul edilebilir değerleri iyi açıklamadığı bir şekilde de değerlidir. Kaç kere merak eğer oldu null
ya string.Empty
ya \r\n
bir yöntem için yetkili bir değerdir ve XML yorumlarının bu konuda sessiz oldu!
Sonuç olarak, kod sözleşmeleri olmadan, birçok kod parçası şöyledir:
Bazı değerleri kabul ediyorum, ancak diğerlerini kabul edemem, ancak varsa belgeleri tahmin etmek veya okumak zorunda kalırsınız. Aslında, belgeleri okumayın: güncel değil. Basitçe tüm değerler arasında dolaşın ve beni istisnalar attıranları göreceksiniz. Ayrıca geri getirilebilecek değerler aralığını da tahmin etmelisiniz, çünkü onlar hakkında size biraz daha fazla şey söylesem bile, son yıllarda bana yapılan yüzlerce değişiklik göz önüne alındığında bu doğru olmayabilir.
Kod sözleşmeleri ile, olur:
Başlık argümanı, uzunluğu 0..500 olan boş olmayan bir dize olabilir. İzleyen tamsayı, yalnızca dize boş olduğunda sıfır olabilen pozitif bir değerdir. Sonunda, bir IDefinition
nesneyi geri döndüreceğim , asla boş.
Fayda 3: Arayüz sözleşmeleri
Üçüncü bir fayda, kod sözleşmelerinin arayüzleri güçlendirmesidir. Diyelim ki şöyle bir şeyiniz var:
public interface ICommittable
{
public ICollection<AtomicChange> PendingChanges { get; }
public void CommitChanges();
...
}
Yalnızca varsayım ve istisnalar kullanarak, yalnızca boş olmadığı CommitChanges
zaman aranabilecek garantiyi nasıl elde edersiniz PendingChanges
? Bunun PendingChanges
asla olmadığını nasıl garanti edersin null
?
Fayda 4: Bir yöntemin sonuçlarını uygulamak
Son olarak, dördüncü fayda Contract.Ensure
sonuçlara ulaşabilmektir. Bir tamsayı döndüren bir yöntem yazarken, değerin hiçbir zaman aşağı veya sıfıra eşit olmadığından emin olmak istersem? Beş yıl sonra, birçok geliştiriciden gelen çok fazla değişiklikten sonra? Bir yöntem birden fazla geri dönüş noktasına sahip Assert
olur olmaz, bunun için bir bakım kabusu olur.
Kod sözleşmelerini yalnızca kodunuzun doğruluğu anlamına gelmez, aynı zamanda kod yazmanın daha katı bir yolu olarak düşünün. Benzer şekilde, yalnızca dinamik dilleri kullanan bir kişi neden dil düzeyinde türler uyguladığınızı sorabilirken, gerektiğinde iddialarda aynı şeyi yapabilirsiniz. Yapabilirsiniz, ancak statik yazmanın kullanımı daha kolaydır, birçok iddiaya kıyasla daha az hataya eğilimlidir ve kendi kendini belgelemektedir.
Dinamik yazma ve statik yazma arasındaki fark, normal programlama ve sözleşmeyle programlama arasındaki farka son derece yakındır.