April 18, 2011

En son hali:

import std.stdio;
import std.string;
struct XmlElement{
   string tag;
   string[string] attributes;
   string context;
   XmlElement[] elements;

   void addElement(XmlElement element ){
       elements ~= element;
   }

   override string toString () {
       string result;
       result ~= "<"~tag;
       foreach ( key , value ; attributes ) {
           result ~= format(" %s=\"%s\"",key,value);
       }
       result ~= ">"~context;
       foreach (element ; elements ){
           result ~= element.toString();
       }
       result ~= "</"~tag~">";
       result ~= "\n";
   return result;
   }



}

void main(){

   XmlElement eleman,diğer,öbürü,birDiğeri;

   eleman.tag="a";

   eleman.attributes=["href":"merhaba","link":"hello"];

   eleman.context = "Merhaba";

   diğer.tag="b";

   diğer.context = "Diğer";

   öbürü.tag = "c";

   öbürü.context = "Öbürü";

   birDiğeri.tag = "i" ;

   eleman.elements=[diğer,öbürü];

   eleman.addElement(birDiğeri);

   writeln(eleman.toString());
}

Daha ne gibi fonksiyonlara ihtiyacımız var?

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

April 18, 2011

Pardon o zaman. Aranıza girmiş oldum. :)

Ali

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

April 18, 2011

1) Kurucu işlev

Nesneleri üyelerini doğrudan 'eleman.tag="a"' diye değiştirerek değil, kurucu işlevleriyle kurmak istiyoruz.

Bu, sarma (encapsulation) için çok önemlidir. Bunun büyük bir yararı, programda anlamsız nesneler bırakmamaktır. Örneğin şu satırda nesneler var:

   XmlElement eleman,diğer,öbürü,birDiğeri;

Ama hiçbirisi de kullanılamaz. Kısaca, onlar aslında XmlElement kabul edilmemelidirler. Bir kural: şart olan nitelikler kurucu parametresi olarak verilmelidir. Sanırım Xml elemanları için şart olan tek parametre, tag:

   auto e = XmlElement("a");

Yani artık tutarsız XmlElement nesnesi oluşturamayız. Önemli.

Bunun başka yararı, artık isimsiz nesneler de oluşturup kullanabiliriz:

   e.addElement(XmlElement("b"));

2) Yapı değil, sınıf

Şimdi tag değerlerini düşünelim: XmlElement düzeyinde her tür tag yasaldır. Onun üstündeki HTML düzeyine çıkınca o konuyu ayrıca halledeceğiz. Örneğin Form, özel bir XmlElement türü olduğu için ondan türeyecek:

class Form : XmlElement
{
   // ...
}

Onun mümkün olabilmesi için XmlElement'ın da bir sınıf olması gerekiyor. O zaman örneğin tag'in "form" olmasını şöyle garanti edeceğiz. Form'un kurucu işlevi:

   this()
   {
       super("form"); // <-- üst sınıfın kurucusunu çağırıyor
       // ...
   }

Yani şimdilik iki şey kaldı: XmlElement'a kurucu işlev eklenmeli ve struct değil class olmalı.

Ali

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

April 19, 2011

XmlElement dışında acaba bir XmlDocument nesnesi de istermiyiz.

   auto doc = new XmlDocument ();
   doc.LoadXml("<kitap tür='bilgisayar' ISBN='1-861001-57-5'>",
               "<isim>The D Programming Language </isim>",
               "</kitap>")

gibi..

Aklıma gelen başka üye işlevler. Bunlar hep get/set türü şeyler.. O yüzden aslında XmlElement için işin zor kısmını tamamladık sanırım :)

1) 'getAttribute :' Parametre olarak geçilen niteliğin değerini verir.

2) 'getAttributes :' Tüm nitelikleri gösteren bir eşleme tablosu, ya da niteliklerden oluşan bir dizi döndürür.

3) 'getElement :' Kendisine parametre olarak geçilen elemanın alt elemanını döndürür.

4) 'getElements :' Tüm elemanları döndürür.

5) 'getText :' Ya da context mi desek. Aslında olabilir içerik anlamında. Hatta ben bunu ilk gördüğümde content olarak okumuştum. Ama özel olarak Xml elemanları sadece metin tutuyorlar bildiğim kadarıyla. Basitçe text de diyebiliriz.

Benim aklıma gelenler bunlar..

Tabi bu işlevlerden hangilerinin işimize yarayabileceği de ayrı bir konu. Eğer yaramıyorlarsa yazmamıza gerek yok ya da daha sonra kod geliştikçe ihtiyacımız olan üye işlevleri yazabiliriz.

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

April 19, 2011

Sınıf haline getirdikten sonra :)

import std.string, std.stdio;

class XmlElement
{
   string text_;
   string tag_;
   string[string] attributes_;
   XmlElement[] elements_;

   this(string tag) {
       tag_ = tag;
   }

   this(string tag, string attribute, string value)
   {
       tag_ = tag;
       attributes_[attribute] = value;
   }

   void addElement(XmlElement element) {
       elements_ ~= element;
   }

   override string toString() const {
       string result;
       result ~= '<' ~ tag_;

       if (attributes_.length > 0) {
           foreach (key, value; attributes_)
               result ~= format(` %s="%s"`, key, value);
       }

       result ~= '>' ~ text_;

       foreach(element; elements_) {
           result ~= element.toString();
       }

       result ~= "</" ~ tag_ ~ '>';

       return result;
   }

}

void main ()
{
   auto e = new XmlElement("a");
   e.addElement(new XmlElement("b"));

   auto c = new XmlElement("a", "href", "www.google.com");
   writeln(c);

   auto kitabevi = new XmlElement("kitap", "kategori", "Çocuk");
   writeln(kitabevi);
}

Yalnız kurucu işlevin birden fazla parametre alan kısmını nasıl tasarlamalıyız. O konuda kararsız kaldım. O yüzden şimdilik

   auto c = new XmlElement("a", "href", "www.google.com");

şeklinde yaptım.

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

April 19, 2011

Form adlı sınıfı yazmaya da başladım.Kodların son hali:
helper.d:

import std.stdio;
import std.string;
class XmlElement{
   string tag;
   string[string] attributes;
   string content;
   XmlElement[] elements;

   this(string tag_) {
       tag = tag_;
   }

   this(string tag_, string attribute_, string value_,string content_)
   {
       tag = tag_;
       attributes[attribute_] = value_;
       content = content_;
   }

   void addElement(XmlElement element ){
       elements ~= element;
   }

   override string toString () {
       string result;
       result ~= "<"~tag;
       foreach ( key , value ; attributes ) {
           result ~= format(" %s=\"%s\"",key,value);
       }
       result ~= ">"~content;
       foreach (element ; elements ){
           result ~= element.toString();
       }
       result ~= "</"~tag~">";
       result ~= "\n";
   return result;
   }
}

formHelper.d:

import std.stdio;
import helper;
class formHelper : XmlElement {

   this(){
       super("form");
   }

   void addInput(string type,string name){

       auto result = new XmlElement("input","type",type,name);

       addElement(result);

   }

}

void main(){
   auto form = new formHelper();
   form.addInput("text","giriş");
   writeln(form);
}

Sizce ne durumda?

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

April 19, 2011

Ben de tasarımı nasıl gerçekleştireceğimizi anlamış değilim :huh:

Ama şöyle düşünüyorum. Bir xml belgesindeki her arası bir xml elemanıdır. Bunun dışında bir xml dökümanı da, xml elemanlarından oluşur. Örneğin herhangi bir xml dökümanını açtığımızda gördüğümüz yazım şeklini de xml dökümanı mı sağlasın.

Bunun dışında bir html elemanı sınıfına ihtiyaç var mı. Bir html belgesi de html elemanlarından oluşur. Ama onun içine yazılabilecek etiketler bellidir. Örneğin yazamayız. Bir de iki tür eleman var. gibi yazabileceğimiz elemanlar. Bir de tek bir etiketle yazdığımız elemanlar '' gibi. Daha sonra örneğin bir form da bir html elemanı olduğu için bu şekilde gerçeklemesini yapabiliriz sanırım.

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

April 19, 2011

Alıntı (acehreli):

>
  • formHelper'ın ismi bence yalnızca Form veya HtmlForm olmalı; çünkü o bir "html formu". Yalnızca o kavramı temsil ediyor.

Ben şimdiye kadar siz Form diye bahsederken '' arasına yazılan html form elemanı olarak düşünüyordum. Şimdi jeton düştü :-)

Evet '' de geçerli oluyor sanırım.

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

April 19, 2011

Ama sadece Form elemanını mı yapıyoruz. Örneğin başlıklar, tablolar, resimler vs.. bir sürü başka elemanlar var. Benim biraz kafam karıştı galiba ..

Örneğin bir XmlElement sınıfımız var. Sonra gene bir HtmlElement sınıfına da ihtiyacımız olmaz mı. Örneğin HtmlElement, XmlElement'in biraz özelleşmiş biçimidir. Sadece belirli etiketleri içerebilir. Form da bir html elemanıdır.

Burada HtmlElement sınıfını oluşturmasak da tüm html elemanlarını yazmayacakmıyız. Neden sadece Form yazıyoruz onu anlamadım :huh:

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

April 19, 2011

Kadir Can, her zaman olduğu gibi gayet güzel gidiyor. Umarım neden belirli yöntemlerde ısrar ettiğimiz anlaşılıyordur. :) Bu konularda başka fikirler varsa tartışalım.

  • Artık kodlama standardı konusunu gündeme getirmeyeceğim. Benim alıştığım kadar önemli bir konu değil herhalde.

  • formHelper'ın ismi bence yalnızca Form veya HtmlForm olmalı; çünkü o bir "html formu". Yalnızca o kavramı temsil ediyor; bu yüzden ismi bu gerçeği yansıtmalı.

  • Kurucu işlev, sınıfın mutlak değişmezlerini ayarlamalı ve nesneyi kullanıma hazırlamalı. Programda yarım nesneler istemeyiz. Örneğin eğer eylem çeşidi (POST veya GET) belirtilmeyen HTML formu olamıyorsa, Form o bilgiyi de bir kurucu parametresi olarak istemelidir. (Bu, her sınıf için geçerli bir kural: şart olanlar kurucuda, seçime bağlı olanlar üye işlevler yoluyla. (örneğin @property olabilir))

Ali

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