TDPL'i bir kere daha gözden geçiriyorum. Sözleşmeli programlama ile ilgili bir şey öğrendim: Bir üye işlevin sıradüzendeki herhangi bir in bloğunun geçmesi yeterliymiş.
Mantık şöyle:
in bloğu, işlevin giriş koşullarını barındırıyor. Üst sınıf orada örneğin "bana verilen parametrenin değeri -1 olmalıdır" diyebiliyor. Peki alt sınıfların da bu kıstasta diretmeleri şart mıdır? Değilmiş. Alt sınıflar giriş koşullarını istedikleri gibi genişletebiliyorlar. Sanki "üst sınıf işi biraz sıkı tutar; ama merak etme; sen bana bir 42 ver, anlaşalım" gibi...
Derleyici önce üst sınıfın in bloğunu işletiyor; eğer başarılı olmuşsa, tamam: alt sınıfların in blokları işletilmiyor.
out bloğu ise işlevin ürettiği sonuçla ilgili olarak verdiği sözü barındırır. Üst sınıf örneğin "10'dan büyük bir değer döndüreceğim" diye söz veriyor. Alt sınıfların bu sözü genişletmeleri söz konusu değil. Alt sınıflar, üst sınıfın koşulunun üzerine ancak daha sıkı koşullar getirebiliyorlar. Örneğin "10'dan büyük olacağının sözü zaten verilmişti; ben üstelik tam olarak 100 değerini döndüreceğim" gibi...
Özetle, derleyici bu mantığı şöyle işletiyor:
-
in bloklarından birisinin geçmesi yeterli.
-
out bloklarının hepsinin geçmeleri şart.
-
invariant bloklarının da hepsinin geçmeleri şart.
Bir örnek:
import std.stdio;
class Üst
{
int foo(int i)
in
{
writeln("? Üst.foo in deneniyor");
assert(i == -1);
writeln("+ Üst.foo in mutlu oldu");
}
out (sonuç)
{
writeln("? Üst.foo out deneniyor");
assert(sonuç > 10);
writeln("+ Üst.foo out mutlu oldu");
}
body
{
return 11;
}
}
class Alt : Üst
{
override int foo(int i)
in
{
writeln("? Alt.foo in deneniyor");
assert(i == 42);
writeln("+ Alt.foo in mutlu oldu");
}
out (sonuç)
{
writeln("? Alt.foo out deneniyor");
assert(sonuç == 100);
writeln("+ Alt.foo out mutlu oldu");
}
body
{
return 100;
}
}
void main()
{
auto a = new Alt;
writeln(-1, " ile çağrılıyor");
a.foo(-1);
writeln(42, " ile çağrılıyor");
a.foo(42);
}
Çıktısı:
'-1 ile çağrılıyor
? Üst.foo in deneniyor
- Üst.foo in mutlu oldu <-- bu yüzden Alt.foo'nun in bloğu işletilmiyor
? Üst.foo out deneniyor <-- sıradüzendeki bütün out blokları işletiliyorlar - Üst.foo out mutlu oldu
? Alt.foo out deneniyor <-- sıradüzendeki bütün out blokları işletiliyorlar - Alt.foo out mutlu oldu
42 ile çağrılıyor
? Üst.foo in deneniyor <-- "mutlu oldu" satırı çıkmadı; yani kıstas başarısız
? Alt.foo in deneniyor <-- bu yüzden şimdi Alt.foo'nun in bloğuna bakılıyor - Alt.foo in mutlu oldu <-- tamam, o başarılı oldu; işlev işletilebilir
[... out mesajları öncekiyle aynı ...]
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply