Visual Studio İle Code Contracts Yapısı
Uzun zamandır var olan ama şahsen benim varlığından bir haber olduğum Code Contracts yapısını öğrendiğim zaman çok işe yarar ve avantajlı bir işlev gören ve bu güne kadar “nerdeydin olum” dedirten bir yapı olduğunu belirtmeden edemeyeceğim.
Code Contracts yapısı, adı üzerinde yazdığımız işlevsel programın kontratını yani yasal yükümlülüğünü belirlememizi sağlayan yapıdır. Static olarak metod içerisine yerleştirilen Code Contracts yapısı sayesinde, derleme veyahut çalışma zamanında ilgili yapının durumunu kontrol etmemize yaramaktadırlar.
Asıl kullanmada sağladığı avantajı ise yazdığımız metodların parametrelerin değerlerini doğrulamayı ve kontrol altına almayı sağlamasıdır. Örnek olarak, metodun işlevinin sağlıklı çalışabilmesi için alacağı parametrenin null değer olmaması gerektiği ya da işlevde gelecek değerin filanca değerden büyük – küçük olması gibi gerekli kriterlerde Code Contracts yapısı sayesinde kontrol sağlayabilir ve benzer durumlarda kullanabiliriz.
Birde buna ek olarak, başkalarının kullanması amaçlı oluşturacağınız Api, Web Service, Kütüphane vs.. gibi yapılarda oluşturduğunuz elemanlarda Code Contracts yapısını kullanarak, sizin sunduğunuz bu servisler üzerinde çalışan yazılımcılara kolaylık sağlayacak ve yanlış değerlere hata fırtalarak müdahale edebileceksiniz. Söz gelimi, yazmış olduğunuz bir Web Service’de “Yas(int yas)” isimli bir metodunuz var. Lakin bu metoda gönderilecek parametre değeri 18’den büyük veya eşit olduğu değerleri kabul edeceğini diğer kullanıcıya gösterebilir ve şartın dışında girilen değer durumunda ki derleme aşamasında ilgili kriteri belirten uyarı cinsinden hata verdirebilirsiniz. Eee haliyle ilgili yazılımcı gözden Code Contracts’ın uyarısını kaçırsada uyarı sonucu yola gelecektir 🙂
Şimdi Code Contracts yapısını nasıl entegre edeceğimizi inceleyelim.
Öncelikle yapmamız gereken bu adresten Code Contracts Tools’u indirmeli ve kurmalıyız.
İndirdiğiniz dosya üzerine tıklayıp “Next” -> “Next” he “Next” diyerek dakika içerisinde kurulumunu gerçekleştiriniz.
Kurulumdan sonra yapmanız gereken, üzerinde çalıştığınız projeye sağ tıklayarak Properties bölümüne geliniz.
Gördüğünüz gibi Code Contracts kategorisi sol menüye gelmiştir. Bana çalışmamda rehber olan Arda Çetinkaya hocamızda resimde vurguladığım yerleri işaretlememiz gerektiğini önceden belirtmiş.(Allah razı olsun 🙂 ) Bu yapılan ayarlar kodun statik olarak analiz edilmesi ve kontrantların işletilmesini, eğer bir uygunsuzluk var ise de hata gösterilmesini sağlamaktadırlar. Yok eğer uygunsuzluk anında hata değilde Warning alınmasını istiyorsanız eğer “Fail build on warnings” işaretini kaldırmanız yeterlidir.
Bu işlemlerden sonra Code Contracts’ı kullanacağınız kod sayfasına “System.Diagnostics.Contracts” kütüphanesini entegre etmeniz yeterlidir.
Artık entegrasyon işlemi tamam. Şimdi Code Contracts yapısını nasıl tanımlayacağımıza geçebiliriz.
public static void Yas(int yas) { }
Öncelikle yukarıdaki metodu ele alırsak eğer, “yas” parametresine 18’den küçük değer girilemeyeceğini belirtelim. Bunu biz açıklama olarakta gerçekleştirebiliriz lakin Code Contracts yapısını birazdan referans tipinden bir parametre üzerinde kullanırken daha net algılayacağız.
public static void Yas(int yas) { Contract.Requires(yas > 18, "Lütfen 18'den büyük değer giriniz."); }
Gördüğünüz gibi Contract sınıfında static olarak bulunan Requires metodu aracılığıyla ilgili metodumuza kontratımızı tanımlamış bulunmaktayız. Eğer şarta uygunsuz değer girilirse 2. parametredeki değer gösterilecektir.
Gördüğünüz gibi şarta uymayan değerlerde kontrat hatayı ve gerekli şartı muhattap yazılımcıya göstermektedir.
Şarta uygun değerler parametreye verildiğinde hatasız kodumuz çalışmaktadır.
static public void EviKirala(Insan insan) { Contract.Requires(insan != null, "Insan nesnesi null olamaz."); Contract.Requires(!String.IsNullOrEmpty(insan.Adi) && !String.IsNullOrEmpty(insan.SoyAdi), "Adı veya soyadı boş olamaz."); Contract.Requires(insan.EvliMi, "Evli olmayana ev yok!"); }
Eğer yukarıdaki gibi bir referans tipli değişkeni ele alırsak, muhattap yazılımcı Insan sınıfının hangi özelliklerinin, hangi şarta göre tanımlanması gerektiğini bilemeyecektir.(Tabi farklı bir mesajla belirtmediysek) İşte bu tarz durumlarda Code Contract oldukça işe yaramaktadır. Örnekte de gördüğünüz gibi ilgili nesne belirli koşulları (PreConditions) sağlıyor mu? sağlamıyor mu? kontratlar sayesinde kontrol edebiliyoruz.
Ekran görüntüsünde gördüğünüz gibi belirttiğimiz koşul geçerli olmadığından ilk Contract’ın mesajını vermektedir. Eğer ilk kontrat koşulu doğru sağlanmış olsaydı diğer kontratları kontrol edecektir.
Gördüğünüz gibi ilk kontrat koşulu sağlandığı zaman Ad ve Soyad özelliklerine özel kontrat devreye girmiştir.
İlk iki kontrat doğrulanmış ise sonuncusunu görmektedir.
Tüm kontratların koşulları geçerli olduğu durumda sorunsuz çalışmaktadır.
Buraya kadar tek dikkat etmeniz gereken bir husus mevcuttur.
Eğer bir metotda Code Contracts kullanacaksanız, o metodun ilk satırlarında Contract’ların tanımlanması gerekmektedir. Aksi durumda program derleme hatası verecektir.
Faydalanmanız dileğiyle…
Hepinize iyi çalışmalar dilerim…
Sonraki yazılarımda görüşmek üzere…
Kaynak : http://www.minepla.net/2014/10/code-contracts-nedir-kullanmak-lazim/