Program örneklerinde hep assert kullanmıştık ve kullanıyoruz...
Ben onun yerine std.contracts modülündeki enforce'un kullanıldığını da görüyorum. assert ile hemen hemen aynı anlama geliyor ve aynı şekilde kullanılıyor.
Burada "kanunu uygulamak, mecbur bırakmak" gibi bir anlama geliyor. Amaca assert'ten biraz daha uygun; çünkü assert'ün "üzerine basarak belirtmek" gibi bir anlamı var.
Alexandrescu forumda şaka olarak "enforce'u öğrenmek için kitabı okuyun" demiş. Phobos'ta her tarafta da bol bol kullanılıyor.
assert'ten benim gördüğüm bir temel farkı var:
assert'ün attığı 'core.exception.AssertError' yerine, 'object.Exception' atıyor. Sanırım böylece Exception'ı yakalayan yerler onu da yakalayabiliyorlar. Programlarda atılan diğer hatalardan ayrı bir sıra düzende duran 'core.exception.AssertError''ın 'catch' ile ayrıca yakalanması gerekmemiş oluyor. (Denedim: gerçekten de enforce hataları 'catch (Exception)' bloklarıyla yakalanabiliyor; assert hataları ise yakalanamıyor.)
import std.contracts;
double hesap_enforce_ile(double a, double b)
in
{
enforce(b != 0, "sıfıra bölme hatası");
}
body
{
return a * 7 / b;
}
void main()
{
hesap_enforce_ile(1, 0);
}
Tabii ki yalnızca in, out, ve invariant bloklarında değil; her yerde de kullanılabiliyor.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]