Forum: Ders Arası RSS
vtD dbwrite işlevi
Avatar
huseyin #1
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: vtD dbwrite işlevi
Veritabanı projem için  dbwrite işlevini yazıyorum sizce foreach mı kullanmalıyım yoksa farklı bir yöntem mi işin içinden çok çıkamadım da :)
Huseyin
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kod örnekli sorarsan sanırım çok faydalı olacak. Örneğin foreach() ile başlayıp bunun olası dezavantajlarını inceleriz. Gerçi pek zannetmiyorum, kendisi pek kuvvetlidir...:)

Özellikle şu şekilde; sayaçlı ilerleme nedeniyle:
    foreach(i, eleman; [ 10, 20, 30 ]) {
        i.writeln(": ", eleman);
    }
Çıktısı:
0: 10
1: 20
2: 30


Dikkat: foreach()'in, tam hatırlayamadığım (sanırım Aralıklar'dı) şekilde kullanımında bir sakınca vardı. Ali hocam naklettiği için daha iyi bilecektir. Sanırım sayaç devre dışı kalıp hata veriyordu.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #3
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Peki şimdi verdiğim benim vt modulum Database sınıfının içine write diye void bir işlev açacağım daha sonra db adlı eşleme tablomdaki verilerimin sırası ile bir dosyaya yazılmasını istiyorum yani tablo anahtar deger şekilnde

module vt;
import std.path;
import std.datetime;
import std.process;
import std.stream; 
import std.conv;
import std.string;
import std.file;
import std.cstream;
import std.array;
import crypt; 
 
 
class Data
{
    string[] datas;
    
    void del(string name)
    {
        string[] dizi2;
        int sayac = datas.length;
        for (int i=0;i<sayac;++i)
        {
            if(datas[i] != name)
            {
                dizi2~=datas[i];
            }
        }
        datas=dizi2;
    }
    void add(string dat)
    {
        datas~=dat;
    }
}//end of class
 
class Subtable
{
    Data [string] subtables;
    Data opIndexAssign(Data dat,string name)
    {
        return subtables[name]=dat;
    }
    void del(string key)
    {
        subtables.remove(key);
    }
    
    void add(string key,Data firstdata)
    {
        subtables[key]=firstdata;
    }
}//end of class
 
class Database
{
    
    Subtable [string] db;
    string dbname;
    
    this(string db)
    {
        this.dbname=db;
    }
    
    Subtable opIndex(string table)
    {
        return db[table];
    }
    
    Subtable opIndexAssign(Subtable table,string name)
    {
        return db[name]=table;
    }
    void del()
    {
        db.remove(table);
    }
    void add(Subtable firstkey)
    {
        db[table]=firstkey;
    }
    void open()
    {
        Data data = new Data;
        Subtable subtable = new Subtable;
        scope File myfile = new File(dbname,FileMode.In);
        
        string currenttable;
        string currentkey;
        string[] currentdatas;
        while(myfile.available)
        {
            char[] line_c = myfile.readLine();
            string line_s = to!(string)(line_c);
            if(line_c[0..2]=="|;")
            {
                currenttable=replace(line_s,"|;","");
            }
            else if(line_c[0..2]=="*;")
            {
                currentkey=replace(line_s,"*;","");
            }
            else
            {
                data.datas~=line_s;
                subtable.subtables[currentkey]=data;
                this.db[currenttable]=subtable;
            }
        }
        
        
    }
    
    
}//end of class 
Huseyin
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sınıfı buraya koyman gayet iyi olmuş çünkü diğer başlıklara bakmamız gerekebilirdi...
(Ali hocam, bu arada artık ayrı bir proje kategorisi açsak ve bu başlıkları oraya taşısak mı?)

Şimdi şöyle devam edelim:

Bu sınıfı kullanan bir ana işlevimiz var ve yaptığı ise foreach() ile ekrana yazmak olsun. Yani doğrudan dosyaya yazmak ile uğraşmayalım ve önce ekranda görelim. Zaten devamı daha kolay olacak...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-07-15, 10:45.
Avatar
huseyin #5
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
hmm evet öyle başlasak daha mantıklı olacak galiba haklısın ben bir deneme işine girişeyim
Huseyin
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bir dakika...

Önce bir takım hatalar var onları giderelim. Örneğin:
class Database
{
    
    Subtable [string] db;
    tring dbname; //<--- bunun türü string olmalı sanırım?
    :    :    :

Ayrıca aynı sınıfın add() ve del() üyelerine table ismindeki indeksi nereden vermeyi düşünüyorsun?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #7
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
kopyalama hatası string olacak evet amacım opIndex ten vermek ama nasıl yapacağımı çözemedim
Huseyin
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet, bence de öncelikle foreach'i düşün ve özel bir nedeni varsa for veya while kullan. foreach daha üst düzeyde: "şunların hepsiyle" dememizi sağlıyor. Amaç oysa yeterli...

Bana normal gelen: add() ve del() hangi tablo üzerinde işleyeceklerini parametre alsınlar.

Ali
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #7
Peki hocam UFCS'deki akıllı veri paylaşımını yapabilir miyiz?

Yani bir sınıfın üyesine parametre vermek yerine tıpkı @property gibi bir kullanım (ama bu sefer dışarıdan içeri) söz konusu olabilir mi? Şöyle:
with(new Database) {
    tables1.add (sub1);
}
Demek istiyorum ki tıpkı writeln()'nin hem soldan UFCS ile parametre alabildiği gibi hem de parantez içinde kullanımını biz kendi sınıflarımızda nasıl başarabiliriz?
foreach(foo; bar) {
    foo.write ("\t"); // foreach(foo; bar) write (foo, "\t") aynısı...
}
huseyin325325:
kopyalama hatası string olacak evet amacım opIndex ten vermek ama nasıl yapacağımı çözemedim
Evet, basit bir kopyalama hatası var ve bunu hep yapıyoru(m)z...:)

Aslında programcılara sağlam önerilerden biri de mümkün olduğunca kopyala&yapıştır'dan uzak kalmak. Çünkü kodu ilk yazdığımız anda yapılan bir hata, bulaşıcı bir virüs gibi tüm programa yayılabiliyor...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #10
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet ama foruma da elle yazmaya kalkarsak işimiz çok :)
Huseyin
Avatar
huseyin #11
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam dbwrite ı yazdım da yazmasına bunun bir sorunu var galiba elemanları tekrar yazıyor

void dbwrite()
    {
        scope File myfile = new File(dbname,FileMode.OutNew);
        foreach(table,subtab;db)
        {
            myfile.writeLine("|;"~table~"|;");
            foreach(key,val;subtab.subtables)
            {
                myfile.writeLine("*;"~key~"*;");
                foreach(dat;val.datas)
                {
                    myfile.writeLine(dat);
                }
            }
        }
        
    }
Huseyin
Avatar
Salih Dinçer #12
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet, çalışıyor eline sağlık...:)

Benim tek gördüğüm sorun her seferinde farklı bir dosya oluşturması. Yani veritabanı dediğimizde aklıma sürekli güncellenen veya eklenen veriler topluluğu geliyor. Acaba bazı ek kontroller ile birlikte FileMode olayını şöyle yapsak daha doğru olmaz mı?
scope File myfile = new File(dbname,FileMode.Append);
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #13
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #9
Salih Dinçer:
Peki hocam UFCS'deki akıllı veri paylaşımını yapabilir miyiz?

Yani bir sınıfın üyesine parametre vermek yerine tıpkı @property gibi bir kullanım (ama bu sefer dışarıdan içeri) söz konusu olabilir mi? Şöyle:
with(new Database) {
    tables1.add (sub1);
}

Yani derleyicinin UFCS'i yalnızca üzerinde bulunduğumuz türe değil, onun üyelerine de uygulamasını mı düşünüyoruz? Yani add() üye işlevi aslında Database türü üzerinde tanımlanmış olsun ama biz tables1 üyesine uygulayınca derleyici aslında şunu çağırsın:

    __with_içindeki_isimsiz_Database_nesnesi__.add(
        __with_içindeki_isimsiz_Database_nesnesi__.tables1, sub1);

Evet, belki yararları vardır. Bildiğim UFCS bunu yapmıyor.

Ali
Avatar
huseyin #14
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #12
Hatamı buldum ama kod darmadağın oldu hemen açıklıyorum ilk önce class lar yerine struct yapılarla çalışmak daha mantıklı çünkü onlarda verileri atama hatalarını düzeltebildim ikinci olarak open işlevimdeki hatayı farkettim önceki tabloların verilerini bir sonrakine aktarmaktaydı bunuda dongude init değerlerini atayarak aştım şuan doğru çalışıyor :) kod değişti biraz
Huseyin
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:
Forum: Ders Arası 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-11-19, 08:08:26 (UTC -08:00)