Forum: Projeler turna RSS
XmlElement [Helper'da Ne Kaldı?]
Sayfa:  önceki  1  2  3  4  sonraki 
acehreli (Moderatör) #16
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4474 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 3772
Evet, fikir o. toString çok özel bir işlev olduğu için açıkça çağırmaya da gerek yok:

    writeln(element);

Görüldüğü gibi bu tür bir çok kütüphane işleviyle de kullanılabiliyor. Hatta elements dizisi de XmlElement olduğu için onları da teker teker ~= ile ekleyebiliriz.

Ali
erdem (Moderatör) #17
Üye Tem 2009 tarihinden beri · 932 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu XmlElement yapısına bakınca aklıma değişik değişik fikirler geliyor.

Böyle bir yapının yapılıp yapılamayacağını bilmiyorum ama sadece rastgele fikirler :)

Örneğin bu XmlElement yapısına bakınca ağaç (tree) gibi bir yapı ortaya çıkıyor. Acaba bu xml sınıfını grafik (graph) nesneleri kullanarak yapabilirmiydik.

Bir de örneğin kitabevi elemanının 2 tane kitap isimli elemanı var. Her elemanın içeriğini sonuçta bir Xml elemanı olduğuna göre kendi başına yazdırması düşünülebilir mi.

kitabevi
elemanlar -> kitap çocuk, kitap web

kitap çocuk
elemanlar -> isim, yazar, yıl, fiyat

Yani kitabevi sadece iki elemanını, nitelik, metin gibi bilgileri bilse ama alt elemanların içeriğinden haberdar olmasa. Alt elemanlar kendi içeriklerini kendileri yazdırsalar. Bu ikincisi biraz karışık oldu galiba :)
acehreli (Moderatör) #18
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4474 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
bu XmlElement yapısına bakınca ağaç (tree) gibi bir yapı ortaya çıkıyor.

Güzel bir gözlem. XmlElement aynen dediğin gibi bir ağaç. 'elements', her düğümün çocukları (veya dalları).

Acaba bu xml sınıfını grafik (graph) nesneleri kullanarak yapabilirmiydik.

Olabilirdi. Ama bu hali de tam ihtiyacımızı karşıladığı için başka türlü veri yapılarına geçmek için bir neden bulmamız gerekecek. :) (Öyle yapalım demediğini biliyorum.)

Bir de örneğin kitabevi elemanının 2 tane kitap isimli elemanı var. Her elemanın içeriğini sonuçta bir Xml elemanı olduğuna göre kendi başına yazdırması düşünülebilir mi.

He he! :) O sorun toString ile çözüldü bile! :)

kitabevi
elemanlar -> kitap çocuk, kitap web

kitap çocuk
elemanlar -> isim, yazar, yıl, fiyat

Yani kitabevi sadece iki elemanını, nitelik, metin gibi bilgileri bilse ama alt elemanların içeriğinden haberdar olmasa. Alt elemanlar kendi içeriklerini kendileri yazdırsalar. Bu ikincisi biraz karışık oldu galiba :)

Zaten XmlElement aynen öyle çalışıyor (gibi birşey). ;) Önceden de söylediğim gibi, XmlElement.toString'e, foreach (element; elements) döngüsünü de ekleyince iş tamam... :)

Ali
erdem (Moderatör) #19
Üye Tem 2009 tarihinden beri · 932 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Önceden de söylediğim gibi, XmlElement.toString'e, foreach (element; elements) döngüsünü de ekleyince iş tamam... :)

Aslında o kısmı en başından beri biliyorum ;)

Ama projenin hızını gereksiz yere hızlandırmak veya yavaşlatmak istemediğim için o kısmı Kadir Can yazar diye düşünmüştüm. Ben sadece yardımcı programcı olarak takılıyorum :)

Ama örneğin biraz daha yavaş gidelim ya da hızlanalım derseniz o da olabilir benim açımdan..
acehreli (Moderatör) #20
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4474 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Pardon o zaman. Aranıza girmiş oldum. :)

Ali
erdem (Moderatör) #21
Üye Tem 2009 tarihinden beri · 932 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
O zaman Kadir Can programcı, ben yardımcı (destek) programcı, Ali bey de lead software engineer olmuş oluyor :)
Kadir Can #22
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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 mesaj erdem tarafından değiştirildi; zaman: 2011-04-22, 01:38.
acehreli (Moderatör) #23
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4474 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
erdem (Moderatör) #24
Üye Tem 2009 tarihinden beri · 932 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.
erdem (Moderatör) #25
Üye Tem 2009 tarihinden beri · 932 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 mesaj 3 defa değişti; son değiştiren: erdem; zaman: 2011-04-22, 01:39.
Değişiklik nedeni: override ekledim
Kadir Can #26
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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 mesaj erdem tarafından değiştirildi; zaman: 2011-04-22, 01:40.
Değişiklik nedeni: override ekledim
erdem (Moderatör) #27
Üye Tem 2009 tarihinden beri · 932 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben de tasarımı nasıl gerçekleştireceğimizi anlamış değilim  :huh:

Ama şöyle düşünüyorum. Bir xml belgesindeki her <etiket></etiket> 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 <kitap kategori="ÇOCUK"> yazamayız. Bir de iki tür eleman var. <etiket></etiket> gibi yazabileceğimiz elemanlar. Bir de tek bir etiketle <etiket /> yazdığımız elemanlar <hr /> gibi. Daha sonra örneğin bir form da bir html elemanı olduğu için bu şekilde gerçeklemesini yapabiliriz sanırım.
acehreli (Moderatör) #28
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4474 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
acehreli (Moderatör) #29
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4474 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #27
erdem:
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.

Sanırım belgenin başına gelen "name space" gibi satırlar da var. Ama onun dışında ben de aynı fikirdeyim: XML belgesi tek elemandan oluşur.

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 <kitap kategori="ÇOCUK"> yazamayız.

Bence o mutlak değişmezleri (invariant'ları) her tür kendisi halledebilir. Ayrıca nitelikleri serbestçe veremiyor olmak yararlı olur. Örneğin Form'da radyo düğmeleri varsa, onlar teker teker kopuk olarak değil, Form.radioButtons() üye işlevi ile verilebilir. Çünkü bütün radyo düğmeleri yanılmıyorsam aynı değişken ismini kullanırlar:

class Form
{
    void radioButtons(string var, Button[] buttons);

gibi... Kafamda tam oturmuş değil ama güvenli bir çatı olabilmesi için HTML elemanları oluşturulurken yapılabilecek yanlışlıklara izin vermemeye çalışıyoruz.

Bir de iki tür eleman var. <etiket></etiket> gibi yazabileceğimiz elemanlar. Bir de tek bir etiketle <etiket /> yazdığımız elemanlar <hr /> gibi. Daha sonra örneğin bir form da bir html elemanı olduğu için bu şekilde gerçeklemesini yapabiliriz sanırım.

XmlElement çıktının nasıl olacağına kendi toString() işlevinde karar verebilir. Veya yanılmıyorsam aslında <hr></hr> da yasal, değil mi? Öyleyse bu konunun fazla önceliği yok.

Ali
erdem (Moderatör) #30
Üye Tem 2009 tarihinden beri · 932 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #28
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 <form></form> arasına yazılan html form elemanı olarak düşünüyordum. Şimdi jeton düştü  :-)

Evet <hr></hr> de geçerli oluyor sanırım.
Bu mesaj erdem tarafından değiştirildi; zaman: 2011-04-19, 22:45.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2  3  4  sonraki 
Forum: Projeler turna RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-09-23, 18:27:58 (UTC -07:00)