Alıntı (Kadir Can):
> 'r'(reverse) düz için 'n'(normal) karakteriyle kontrol edebilirim.
Bu gibi durumlarda enum'lar daha iyi oluyor: hata yapması daha güç ve ne anlama geldiği açık oluyor:
enum Yön { sol, sağ };
D'nin C ve C++'da bulunmayan güzel bir olanağı 'final switch'... Bütün değerleri kullanılan enum'larda çok yararlı oluyor: hiçbir değerin unutulmadığını garanti ediyor; o yüzden default kullanmak da yasak:
import std.stdio;
enum Yön { sol, sağ };
void foo(Yön yön)
{
final switch (yön) {
case Yön.sol:
writeln("Sola gitmemi istediniz");
break;
case Yön.sağ:
writeln("Sağa gitmemi istediniz");
break;
}
}
void main()
{
foo(Yön.sol);
}
Alıntı:
> assert leri daha tam öğrenemedim ama öğreneceğim.
Neden daha önce sormadın! :) Yükte hafif, pahada ağır, son derece yararlı bir olanak. Öğrenmesi şu kadar basit: "assert'e verilen mantıksal ifadenin doğru çıkmasını bekliyoruz." Öyle olmazsa bir hata var demek. Burada anlatacağım. :)
Kendisine verilen string'leri aralarında tire karakteri ile birleştiren bir işlev:
import std.stdio;
string tireyleBirleştir(string[] parçalar ...)
{
string sonuç = parçalar[0];
foreach (parça; parçalar[1 .. $]) {
sonuç ~= '-' ~ parça;
}
return sonuç;
}
void main()
{
writeln(tireyleBirleştir("abc", "xyz"));
}
O programı çalıştırabilir ve ekrandaki çıktısına bakabiliriz. Ama bu çok yetersiz olur çünkü program değiştikçe çıktı bozulmuş olabilir; örneğin "abc-xyz-" haline gelmiş olabilir. assert, bu beklentimizi denetleyebilir. Örneğin bir unittest bloğuna şöyle yazabiliriz:
unittest
{
assert(tireyleBirleştir("abc", "xyz") == "abc-xyz");
assert(tireyleBirleştir("abc", "xyz", "123") == "abc-xyz-123");
}
Çok kolay: yaptığımız tek şey, işlevin döndürdüğü değerin neye eşit olması gerektiğini düşündüğümüzü belirtmek oldu ('==' işleci ile).
Neler olabileceğine bakalım:
- Daha sonradan bir programcı gelip parçalar[0]'a neden özel olarak davranıldığını anlamadan işlevi şöyle değiştirebilir:
string tireyleBirleştir(string[] parçalar ...)
{
string sonuç;
foreach (parça; parçalar) {
sonuç ~= '-' ~ parça;
}
return sonuç;
}
Ve yaptığı yanlışı birim testler tarafından hemen yakalanır:
'core.exception.AssertError@deneme(28464): unittest failure'
- Veya başka bir programcı gelip tireyleBirleştir()'in gereksizce yazıldığını düşünüp onun std.array.join çağrılarak da yazılabileceğini düşünebilir:
import std.array;
// ...
string tireyleBirleştir(string[] parçalar ...)
{
return join(parçalar, "-");
}
Ve tamamen emin bir şekilde olay yerinden ayrılır. :) Çünkü birim testleri geçerler. Yani işlev istendiği gibi işlemiş ve iki örnek çağrı için doğru sonucu üretmiştir.
Öte yandan, birim testi olmayan koda dokunulamaz ve sonuçta kod çürür (code rot).
İşte assert bu kadar basit ve bu kadar kullanışlıdır. :) Programın başka yerlerine de yazılabilir ama şimdilik bu kadarı yeterli.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]