September 16, 2009

Sözleşmeli programlama nedir ? Nasıl kullanılır ? örnekler...

Mesela :

long square_root(long x)
in //Burada fonksiyona giren değer sıfırdan büyükse mi  fonksiyonu tanımlamayı başlat diyor ?
{
   assert(x >= 0);
}
out (result) // Burada da döndürülen değer assertteki gibi mi ise fonksiyonu tanımla diyor ?
{
   assert((result * result) <= x && (result+1) * (result+1) >= x);
}
body //Burada da şartlar yerine getirilirse fonksiyonun içeriğinin ne olacağı gösteriliyor ?
{
   return cast(long)std.math.sqrt(cast(real)x);
}
unittest //Sanırım buradada fonksiyonun doğru çalışıp çalışmadığını kontrol ediyoruz.
{
   assert(square_root(36) == 6);
}

Yorumlarım doğru mu ? Birde istersek in, out , unittest ten birini kullanmayabilir miyiz?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 19, 2009

'in:' fonksiyonun işine başlayabilmesi için gereken ön koşullar; yani çağıran tarafın uyması gereken koşullar

'out:' fonksiyonun işini bitirdiğinde var olması gereken koşullar; yani bu fonksiyonun uyması gereken koşullar

'body:' fonksiyonun asıl işi (kendisi)

'unittest:' fonksiyonun birim testleri (aslında sözleşmeli programlama konusunun dışındadır)

Sözleşmeli programlama Eiffel dilinden geliyor. O dilin yaratıcısı Bertrand Meyer'ın bir fikri...

Bir fonksiyonun kendisini çağırana hizmetini sunabilmesi için, fonksiyon ile çağıranı araşında uyulması gereken bir sözleşme vardır. Programlama dillerinin çoğu bu sözleşme konusunda bir yardım sunmazlar. Bu sözleşmenin maddeleri normalde açıklama satırlarında bile bulunabilir. "square_root fonksiyonunun parametresinin eksi olmaması gerekir" gibi...

Sözleşmeli programlama, üstü kapalı olarak halledilen bu konuyu dil olanağı düzeyine getirerek program sağlamlığını arttırmayı hedefler.

Önemli bir nokta: bu konunun kullanıcının uyması gereken koşullarla bir ilgisi yoktur. Örneğin kullanıcıdan 0-10 aralığında sayı beklenen durum 'in' bloğunda denetlenmez. Sözleşmeli programlama, program parçaları arasındaki sözleşmeleri kapsar.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]