Jump to page: 1 2
Thread overview
March 13, 2010

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.)

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

March 13, 2010

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();
   }
}

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

March 13, 2010

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

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

March 13, 2010

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

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

March 14, 2010

Alıntı:

>

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.

Alıntı:

>

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.

Alıntı:

>

Ş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.

Alıntı:

>

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.

Alıntı:

>

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 .

Alıntı:

>

Ş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/bilgi.d
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.

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

March 13, 2010

Alıntı (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?

Alıntı:

>
> 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.

Alıntı:

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


Tamam, kendi üyesini kullanıyor.

Alıntı:
>
>

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...

Alıntı:

>
>     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

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

Alıntı (canalpay:1268562807):

>

Ş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.

Alıntı:

>

Alıntı:

>

Ş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

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

İ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.

Alıntı:

>

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'']
Alıntı:

>

(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.

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

March 16, 2010

Alıntı:

>

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.

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

March 16, 2010

Önce dersler! :)

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

Ali

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

« First   ‹ Prev
1 2