Forum: Projeler dkv RSS
bilgi.d nasıl ekleyeceğim ?
canalpay (Moderatör) #1
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: bilgi.d nasıl ekleyeceğim ?
dkvG'nin oluşturduğu kodların kaydını tutabilmesi için yine dkvG ile geliştirilen bir modül yazdım. (modülün adına bilgi adı verdim.)
kodlar:  http://www.ozgurlukicin.com/yapistir/445/

Bunu nasıl dkvG'ye dahil ederim ?


:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Ben şu yolu denedim.

bilgi modülü eklenmeyecek olan dkvG'nin adını dkvB olarak değiştirdim. Gerekli ayarlamaları yapmaya çalıştım.

Sonra bilgi.d için dkvB'yi dahil ettirdim. Daha sonrada dkvG'ye bilgi.d'yi dahil ettirdim.

Ama şöyle bir hata verdi:
dmd denemeG.d dkvG.d belge.ddoc -D -Ddhtml
denemeG.o:(.data+0x98): undefined reference to `_D5bilgi12__ModuleInfoZ'
denemeG.o:(.data+0x1d0): undefined reference to `_D5bilgi12__ModuleInfoZ'
collect2: ld returned 1 exit status
--- errorlevel 1
make: *** [belge] Hata 1

dkvB'nin kodu :http://www.ozgurlukicin.com/yapistir/446/

dkvG'nin kodu :http://www.ozgurlukicin.com/yapistir/447/ (bilgi.d işlevlerini daha tam ekleyemedi.)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Makefile içindeki iki dmd komut satırına bilgi.d ve dkvB.d'yi ekleyince derleniyor:

.PHONY: derle
derle:
    dmd denemeG.d dkvG.d bilgi.d dkvB.d
    ./denemeG
.PHONY: belge
belge:
    dmd denemeG.d dkvG.d belge.ddoc bilgi.d dkvB.d -D -Ddhtml

Tabii bir de bilgi.d'ye import dkvB; satırı gerekecek.

Ali
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Eğer hem dkvB hem de dkvG bu projeye dahil olacaksa, kendini ileride kötü bir durumda bulabilirsin. :) Bir dosyada giderdiğin hatayı diğerinde de unutmaman gerekir, birisine yaptığın ekleme de öyle... Bu, kod tekrarının en zararlı örneklerinden birisidir. (Profesyonel programcıların da yaptıkları olur. Kötü bir durum.)

Umarım geçici olarak deneme amacıyla iki dosyan vardır.

Eğer ikisini de tutmak istiyorsan, ne yapmak istediğini konuşalım ve daha iyi bir çözüm bulalım.

Ali
canalpay (Moderatör) #4
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler oldu.

Benim yapmak istediğim şey dkvG'nin eklediği dosyanın kaydını tutabilmesi ve ne eklediğini kaç tane eklediğini öğrenebilmek.

Bunu o kadar satır kod yazdığım dkvG ile yazmak istedim(Haksız mıyım :-) ) . Ama dkvG'yi ekleyeceğim kodları dkvG'den türetmek biraz sorun oluşturdu :-)

Sanırım çok iyi anlatamadım. Kodlar ile örnek vereyim:
örneğin dkvG bu olsun
class dkvG{
    void yazar(string deneme)
    {
    writeln(deneme);
    }
}
Ben dkvG'ye yeni işlev kazandırmak adına şu bilgi.d'yi yazdım:
class bilgi
{ 
     dkvG ya;
     this()
    {
         ya=new dkvG;
    }
    void yazdığınyer()
    {
         ya.yazar("yazdığım yer");
    } 
}
Sanırım dkvG.d ve bilgi.d kodları  böyle. Ben şimdi bunu dkvG'ye nasıl eklerim ?


sanırım şöyle yapabilirim:

class dkvYeni:dkvG
{
    bilgi bilgiler;
    this()
    {
          bilgiler = new bilgi;
    }
    override yazar(string deneme)
    {
        super.yazar(deneme);
        yazdığınyer();
    }
}
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Bunu o kadar satır kod yazdığım dkvG ile yazmak istedim(Haksız mıyım :-) )

Anladığım kadarıyla, en kolayı dkvG'ye eklemek olmaz mı? Yoksa dkvG'yi daha akıllı yapmak yerine, yeni yeteneğe sahip yeni bir sınıf mı düşünüyorsun?

class dkvG{
    void yazar(string deneme)
    {
    writeln(deneme);
    }
}
Ben dkvG'ye yeni işlev kazandırmak adına şu bilgi.d'yi yazdım:
class bilgi
{ 
     dkvG ya;
     this()
    {
         ya=new dkvG;

O, bilgi'nin bir dkvG sahibi olmasını sağlar. bilgi, kendisi bir dkvG üyesi oluşturur ve ona sahip olur. Yani bu anlamda dkvG'ye bir şey eklemez; ondan bir nesnenin sahibidir.

    }
    void yazdığınyer()
    {
         ya.yazar("yazdığım yer");

Tamam, kendi üyesini kullanıyor.

class dkvYeni:dkvG
{
    bilgi bilgiler;

Şimdi bu sınıftan olan nesnelerin ikişer tane dkvG'si olur. Birincisi kalıtımla edindiği, ikincisi de bilgi'nin üyesi olan...

    this()
    {
          bilgiler = new bilgi;
    }
    override yazar(string deneme)
    {
        super.yazar(deneme);
        yazdığınyer();

Tabii, yazdığınyer() derleyici hatası verecektir. Belki de bilgiler.yazdığınyer() demek istemişizdir. Ama o zaman sonuçta bilgiler'in içindeki dkvG kullanılır, kalıtımla edinilen değil.

Senin bunun doğru çözüm olduğunu söylemediğini biliyorum. :) Ben gördüğüm ve anladığım kadarının açıklamasını yapıyorum.

Şimdi bir de kullanıcı tarafından ele alalım. Bu sınıf tasarımını bir kenara bırakarak, kullanıcının nasıl bir kod yazmasını amaçlıyoruz?

Kullanıcı dkvYeni mi oluşturup kullanacak? Eğer öyleyse, ve eğer bilgi, bilgi tutan bir sınıfsa, belki de en iyisi, onun kendi dkvG'sini oluşturmaması, ama dkvYeni'nin gösterdiğini kullanması iyi olur.

Şöyle bir şey önereceğim, ama bunda da bir sonsuz döngü oluşuyor: yazar() ve yazdığınyer() birbirlerini çağırıyorlar.

import std.stdio;
 
class dkvG
{
    void yazar(string deneme)
    {
        writeln(deneme);
    }
}
 
class bilgi
{ 
    dkvG ya;
 
    this(dkvG ya)
    {
        this.ya = ya; // kendisine verileni kullanacak; kendisi
                      // oluşturmayacak
    }
    void yazdığınyer()
    {
        ya.yazar("yazdığım yer");
    } 
}
 
class dkvYeni : dkvG
{
    bilgi bilgiler;
 
    this()
    {
        bilgiler = new bilgi(super);
    }
 
    override void yazar(string deneme)
    {
        super.yazar(deneme);
        bilgiler.yazdığınyer()// SONSUZ DÖNGÜ!
    }
}
 
void main()
{
    auto d = new dkvYeni;
    d.yazar("merhaba");
}

Bence en iyisi, en son kullanıcı kodunu nasıl düşünüyorsun ve ekrana ne yazılmasını bekliyorsun? Ondan yola çıkalım.

Ali
canalpay (Moderatör) #6
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Anladığım kadarıyla, en kolayı dkvG'ye eklemek olmaz mı? Yoksa dkvG'yi daha akıllı yapmak yerine, yeni yeteneğe sahip yeni bir sınıf mı düşünüyorsun?

Hem yeni bir yeteneğe sahip bir sınıf olmuş olur, hem de kodlar birbirinden ayrıldığı için kod bakımı daha kolay olur diye düşündüm.

Şuan bilgi.d sayesinde şunu yapacağım=> eğer dkvG ile bir şeyi silmek istiyorsanız dkvG'nin oluşturduğu dosyalara bakacağım ve böylece eğer dkvG oluşturmadıysa silmeyecek.

O, bilgi'nin bir dkvG sahibi olmasını sağlar. bilgi, kendisi bir dkvG üyesi oluşturur ve ona sahip olur. Yani bu anlamda dkvG'ye bir şey eklemez; ondan bir nesnenin sahibidir.

Farkındayım. Sadece bilgi.d'nin dosya dizin oluşturma gereksinimlerini karşılıyorum.

Şimdi bu sınıftan olan nesnelerin ikişer tane dkvG'si olur. Birincisi kalıtımla edindiği, ikincisi de bilgi'nin üyesi olan...

Evet kalıtımla elde etmemin nedeni super anahtar sözcüğü ile üst sınıfa erişip işlevlerini kullanabilmek için.

Tabii, yazdığınyer() derleyici hatası verecektir. Belki de bilgiler.yazdığınyer() demek istemişizdir. Ama o zaman sonuçta bilgiler'in içindeki dkvG kullanılır, kalıtımla edinilen değil.

bilgiler.yazdığınyer() demek istedim ama  forumun mesaj penceresinde kodları yazdığım için ne derledim ne hatasına baktım. Boşlukları ayarlamak bile zor oldu :-)

Zaten amacım bilgiler.dyi kullanmak, dkvG'yi kullama amacım yok.

Senin bunun doğru çözüm olduğunu söylemediğini biliyorum.  Ben gördüğüm ve anladığım kadarının açıklamasını yapıyorum.


Teşekkür ederim. Eğer açıklama yapmasaydınız ben herhalde şuan kod tekrarı yapacaktım sadece .


Şimdi bir de kullanıcı tarafından ele alalım. Bu sınıf tasarımını bir kenara bırakarak, kullanıcının nasıl bir kod yazmasını amaçlıyoruz?

Bütün özelliklerini göstermeyeceğim. Sadece veritabanı ile ilgili.
import dkvG;
void main()
{
    dkvG taban =new dkvG;
    taban.v_yarat("örnek");
    taban.v_yarat("ikinciörnek");
    //Diyelim ki programımız hangi veritabanı adını verdiğini merak ediyor
    taban.vt_adı_listele(); // döndürdüğü değer string[] türünde [örnek] [ikinciörnek] gibi.
}

Artık dkvG hangi veritabanını yazdığını biliyor. Bu dkvG içinde çok iyi. Neden mi ? Eğer veritabanı, tablo gibi şeyler silmek isterseniz dkvG oluşturduğu veritabanları listesine bakıyor. Eğer yoksa sildirtmiyor. Varsa siliyor.
Yani artık dkvG gidip sizin bilgisayarınızı tamamen silmeyecek. Böylece artık kodlarımı çalıştırmaktan korkmayacaksınız :-D

Şuan istediğimi yapacak olan dkvG'yi svn'ye aktardım.

Oluşturduğum  bilgi.d   :http://code.google.com/p/dkv/source/browse/trunk/dkvG/bilg…
Oluşturduğum  dkvB.d    :http://code.google.com/p/dkv/source/browse/trunk/dkvG/dkvB.d
Oluşturduğum  dkvG .d   :http://code.google.com/p/dkv/source/browse/trunk/dkvG/dkvG.d

Şuan istediklerimin hepsini yapamadım. Ama temelini attım. Artık istediğim şeyleri yapabilirim.

Tabii yazdıklarım iyi bir çözüm olmayabilir, o zamanda yaptıklarımı siler sizin yardımınızla daha iyisini yapmaya çalışırım.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay on 2010-03-14, 03:33:
Şuan bilgi.d sayesinde şunu yapacağım=> eğer dkvG ile bir şeyi silmek istiyorsanız dkvG'nin oluşturduğu dosyalara bakacağım ve böylece eğer dkvG oluşturmadıysa silmeyecek.

Kabul. Ama ben olsam bu bilgiyi de dkvG içinde tutardım.

Şimdi bir de kullanıcı tarafından ele alalım. Bu sınıf tasarımını bir kenara bırakarak, kullanıcının nasıl bir kod yazmasını amaçlıyoruz?

Bütün özelliklerini göstermeyeceğim. Sadece veritabanı ile ilgili.
import dkvG;
void main()
{
    dkvG taban =new dkvG;
    taban.v_yarat("örnek");
    taban.v_yarat("ikinciörnek");
    //Diyelim ki programımız hangi veritabanı adını verdiğini merak ediyor
    taban.vt_adı_listele(); // döndürdüğü değer string[] türünde [örnek] [ikinciörnek] gibi.
}

Yani kullanıcı açısından hiçbir fark yok. Eklediğin yeni sınıflar bütünüyle dkvG'nin olanakları. Tamam, herşey çalışıyorsa bizim bilgi.d'den haberimiz bile olmayabilir.

Ama bir de dkvB var. O da güvenlik istemediğimiz zaman kullanmak için...

Kodlara baktım. Beni rahatsız eden, dkvG'nin iki farklı dkvB'ye sahip olması. Bazı işler için birisi, bazı işlemler için de diğeri mi kullanılıyor? dkvB'nin üyeleri her zaman için doğru değerlere sahip olacaklar mı?

    bool değiştirildi_mi =true ;
    string eş[string][string][string][string];

dkvG'nin yaptığı işlemler, bu değişkenleri değiştirecek. İki dkvB'den birisinin değiştirildi_mi üyesi, diğeri tarafından bilinmeyecek. Beni endişelendiren o...

Belki de senin burada yapman gereken, bir arayüz (interface) tanımlamak:

interface dkvG_arayüz
{
    void işlem();
}
 
class dkvG_güvensiz : dkvG_arayüz
{
    void işlem()
    {
        // güvensiz işlem
    }
}
 
class dkvG_güvenli : dkvG_arayüz
{
    dkvG_güvensiz benim_dkvG;
 
    void işlem()
    {
        // denetimini yap; ondan sonra güvensiz olana havale et:
        benim_dkvG.işlem();
    }
}
 
void main()
{
    // Kullanıcı istediğini seçebilir; ikisi de dkvG_arayüz sınıfı gibi
    // kullanılabilir:
    dkvG_arayüz güvensiz = new dkvG_güvensiz;
    dkvG_arayüz güvenli = new dkvG_güvenli;
}

Anlaşılsın diye sonlarına _arayüz vs. yazdım. Yoksa arayüz sınıfının isminin dkvG olması yeter. Ondan türeyenlerin isimlerinin ise yaptıkları işi belirtir olmalarında yarar var.

(Bu arada, bu sınıf isimlerini daha kullanışlı yapabiliriz. Ben B ve G'nin ne anlama geldiğini bilmiyorum. :) Bilmek için de bir belge okumak zorunda kalmamalıyız. İsimler önemli.)

Ali
canalpay (Moderatör) #8
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İlk önce özür dileyerek başlıyorum. Ne yazık ki sınavlar başladı ve sınavlara çalışmam gerekiyor. Bu yüzden uzun uzun cevap veremeyeceğim.

Kodlara baktım. Beni rahatsız eden, dkvG'nin iki farklı dkvB'ye sahip olması. Bazı işler için birisi, bazı işlemler için de diğeri mi kullanılıyor? dkvB'nin üyeleri her zaman için doğru değerlere sahip olacaklar mı?

    bool değiştirildi_mi =true ;
    string eş[string][string][string][string];


dkvB her zaman doğru değerlere sahip olacak. Çünkü dkvG'nin dkvB'den edindiği eşleme tablosu string eş[''dkvözel''][string][string][string];

Ama kullanıcı ise şu eşleme tablosunu kullanacak: string eş[''kullanıcınınveritabanı''][string][string][string];

Yani hiç bir zaman yanlış bir değere sahip olamaz bence.

Ama siz bence programda çok güzel bir hata yakalamışsınız. Tebrik ederim. Bu hatanın tabiki bilgi.d ile alakası yok.

Hata:
 
bool değiştirildi_mi =true ;

Aslında olması gereken:

bool değiştirildi_mi[''kullanıcınınveritabanı''][''tablo''][''dosya'']
(Bu arada, bu sınıf isimlerini daha kullanışlı yapabiliriz. Ben B ve G'nin ne anlama geldiğini bilmiyorum.  Bilmek için de bir belge okumak zorunda kalmamalıyız. İsimler önemli.)

B G gibi şeyler eklememin nedeni birbirleriyle karışmaması için. B'nin anlamı bence => bilgi.d'yi çağrıştırıyor ve beceriksizin baş harfi :-)  G ise => Gelişmiş ve gelişmekte olan. Uzun uzun dkvGelişmiş yazmamamın nedeni ise sınıf adını boşuna uzun tutmamak için ve G ile başlayan başka sözcüklerde çağrıştırması için.

interface olayına hafta sonu bakacağım.

bilgi.d'yi direk olarak dkvB.d'ye ekleyemeyiz. Sadece aynı işi yapan uzun kodlar yazarız. Ve bence aynı hızda çalışacak, daha okunaklı kodlar yazmak yerine okunaksız uzun gereksiz kodlar yazmakta bir yazılımcı günahı :-)

Uzun uzun yazamadığım için üzgünüm. Hafta sonu yazacağım.
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Önce dersler! :)

Söylediklerini de anladım. Tamamen kendi işi için özel bir dkv'si oluyor...

Ali
canalpay (Moderatör) #10
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Söylediklerini de anladım. Tamamen kendi işi için özel bir dkv'si oluyor...

Evet. Sizce bir programcılık hatası var mı ? Yada interface ile mi yazmak daha doğru olur ?

Önerileriniz için gerçekten teşekkürler.
acehreli (Moderatör) #11
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bence şimdilik bir sorun görünmüyor.

Ali
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: Projeler dkv 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-10-20, 23:56:14 (UTC -07:00)