Thread overview
D'nin 'belirsiz sayıda parametre' olanağının bir örneği
Feb 18, 2011
Kadir Can
Feb 19, 2011
Kadir Can
Feb 19, 2011
Kadir Can
February 17, 2011

Bu konuyu da HTML'in gibi başlık elemanları ile üzerinde konuşacağım. Elimizde bu işe yarayan bir işlev var:

string başlık(int düzey, string metin)
{
   string etiket = 'h' ~ to!string(düzey);
   return '<' ~ etiket ~ '>' ~ metin ~ "</" ~ etiket ~ '>';
}

unittest
{
   assert(başlık(1, "merhaba") == "<h1>merhaba</h1>");
}

Birim testindeki kullanımdan anlaşıldığı gibi verilen dizgiyi başlık etiketi haline dönüştürüyor. Güzel ama bunda bir yetersizlik var: ya başlık elemanının içinde ile kalın yazı da kullanmak istesek? Örnek: "merhaba dünya".

İşlevin bu tasarımı pek kullanışlı değil, çünkü önce "merhaba dünya" dizgisini oluşturmamız gerekiyor. Ancak ondan sonra işleve verebiliyoruz:

string koyu(string metin)
{
   return "<b>" ~ metin ~ "</b>";
}

// ...

   string başlıkSatırı = başlık(1, "merhaba " ~ koyu("dünya"));

string'in ~ işleci olduğu için burada yararı tam olarak anlaşılmıyor ama burada D'nin belirsiz sayıda parametre olanağından yararlanabiliriz. Örneğin başlık()'ı şöyle çağırmak yararlı olur (string yerine başka bir yapı türü olsaydı daha iyi anlaşılırdı).

Bu iş D'de çok kolay:

  1. Son parametreyi o türden dizi alacak şekilde değiştirin: yani string yerine string[]

  2. Ondan sonra '...' yazın

  3. Gereken veriyi, o dizide foreach ile ilerleyerek oluşturun

string başlık(int düzey, string[] metinParçaları ...)
{
   string etiket = 'h' ~ to!string(düzey);

   string metin;

   foreach (parça; metinParçaları) {
       metin ~= parça;
   }

   return '<' ~ etiket ~ '>' ~ metin ~ "</" ~ etiket ~ '>';
}

unittest
{
   assert(başlık(1, "merhaba") == "<h1>merhaba</h1>");
   assert(başlık(2, "merhaba ", koyu("dünya"))
          == "<h2>merhaba <b>dünya</b></h2>");
}

Birim testindeki ikinci assert'te görüldüğü gibi, sondaki parametreler string oldukları sürece başlık()'ı istediğimiz kadar parametre ile çağırabiliyoruz.

Dikkat ederseniz, oradak koyu çağrısından önce ~ işleci değil virgül var. Dediğim gibi, string olmayan türlerde bunun yararı daha iyi anlaşılıyor. Eğer bu olanak olmasaydı ve başlık() tek bir string alacak şekilde yazılmış olsaydı, birden fazla HtmlElemanı türünü şöyle kullanmak zorunda kalırdık (bunları derlemeden yazıyorum):

// Bu sefer HtmlElemanı diye bir tür olduğunu ve onun nesnelerini
// kullandığımızı varsayalım
başlık(3, to!string(metinElemanı("merhaba ")) ~
         to!string(koyuElemanı("dünya")) ~
         to!string(eğikElemanı(" ve evren")));

Veya text'ten de yararlanabilirdik:

başlık(4, text(metinElemanı("merhaba "),
              koyuElemanı("dünya"),
              eğikElemanı(" ve evren")));

Aslında sonuncusu da güzelmiş ve yeterliymiş. :D

Ali

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

February 18, 2011

Ali bey;
Bunu yapacağım lakin şimdilik sadece çalışmasını yeterli görüyorum.Bütün HTML elemanlarının fonksiyonlarını halledince bu işe de el atacağım.

Ayrıca güzel kaynak olmuş. :D

O zaman her fonksiyonun content'e eklemesi dışında bir de değer döndürmesi iyi olur mu?

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

February 19, 2011

canalpay;
Teşekkür ederim.Ekleyeceğim.Zaten projeyi forkladım.Daha rahat çalışabilirim.

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

February 19, 2011

Güncelleme sorunu için özür dilerim.

Evet modül iyi gidiyor.Metin düzenleme kısmı bitti.Şimdi iş karmaşıklaşacak biraz daha.

Yarın devam edeceğim.

İyi akşamlar :D

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

February 19, 2011

Alıntı:

>

O zaman her fonksiyonun content'e eklemesi dışında bir de değer döndürmesi iyi olur mu?

Bana olabilir gibi geliyor.

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

February 19, 2011

Alıntı:

>

Teşekkür ederim.Ekleyeceğim.Zaten projeyi forkladım.Daha rahat çalışabilirim.

Çok iyi yapmışın. Çatallama çok güzel bir şey. Ali Beyin kararına göre herkes böyle yapacak. Ancak ana proje güncellendiğinde sende çatalladığın projeyi güncellemeyi unutma. (Bizde unutmayalım :-) )

Aklında bulunsun kodda değişiklik yapacaksan ilk önce güncellemeleri al. Örneğin senin en son yaptığın güncellemede benim güncellemeleri edinmeden yaptığın için benim yaptığım güncellemeleri geriye almış. Proje oluşurken hata veriyor şuan. Sorun değil yarına düzeltirim ancak ileride sorun olabilir.

Yazdığın modül iyiye gidiyor ancak Ali Beyin önerdiği şeyleride yapmayı unutma.

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