Thread overview
Interface içindeki sınıfların ortak adres havuzu
January 13, 2013

Commands.d dosyası

module Commands;

interface Command{
	void run();
}
class htmlprint : Command{
	private:
		string html;
	public:
		this(string html){
			this.html = html;
		}
		void run(){
//script.d dosyasındaki output stringi ~= this.html;
		}
}

Script.d dosyası:

class Script{
string output;
....
}

Şimdi script.d gibi birçok dosyam var benim ve bunların hepsinde ortak olan bazı şeyler var output gibi html çıktısını tutan. Ama bunların hepsi nasıl ortak olacak en doğru yol nedir? Bunu daha öncede sormuştum kusura bakmayın ama sanırım sorunu tam dile getiremedim.

Zekeriya

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

January 13, 2013

Ne kadar doğru bilmiyorum ama pool diye bir d sınıfı oluşturdu bütün global olacak olan şeyleri burada tutuyorum. Daha sonra ana sınıfımdan poolu sınıfını çağırıyorum ve diğer d dosyalarında linkIt diye bir fonksiyon tanımladım ve o d dosyalarını çağırırdıktan sonra poolu referans olarak linkIt e atıyorum bu sayede global yapmak istediğim şeyleri diğer sınıflar tarafından erişilebilir yapıyorum.

Zekeriya

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

January 13, 2013

Neyse ki D'de global değişken yok. En dışarıda, modül düzeyinde tanımlanmış olan değişkenler oluyor. Böyle değişkenlerin farklı modüllerde bulunmaları ile hepsinin aynı modüle taşınmış olmaları arasında fark göremiyorum.

Eğer karşılaşırsan, asıl sorun, herkesin elinin herkesin cebinde olmasından kaynaklanacak. Değişkenlerin sahiplikleri gibi bir kavramdan söz edilemeyecek ve değişkenlerin mutlak değişmezlikleri sağlanamayacak. ("Mutlak değişmez"i invariant'ın karşılığı olarak kullanıyorum.)

Örneğin, programdaki bir dörtgenin enini ve boyunu tutan iki değişken olsun ve bu iki değişkene onlarca modül tarafından erişilebiliyor olsun:

// Bir modül içindeyiz
import dortgen;
/* ... */
   dortgen.en = 100;
   dortgen.boy = 200;

   writeln(dörtgeninAlanı());    // dortgen modülü tarafından en * boy diye
                                 // hesaplanıyor olsun. (Tabii çok daha
                                 // karmaşık da olabilir.)

İlerideki bir zamanda dörtgeninAlanı() işlevinin programda farkedilecek kadar yavaşlık oluşturduğunu varsayalım. Artık o her çağrıldığında en*boy hesabının yapılması yerine, en'in veya boy'un değiştiği her yerde alanın bir kere hesaplanması ve dortegen.alan değişkenine yazılması düşünülsün.

Eğer her modül dortgen.en ve dortgen.boy değişkenlerine erişmişse her birisine gidip en veya boy değiştiğinde bir de onun değiştirilmesi gerekir:

   dortgen.en = 100;
   dortgen.boy = 200;
   dortgen.alan = dortgen.en * dortgen.boy;

Tabii bu sefer de alan'ı herkese açmış olduğumuz için o değişkenin değiştirilmesinin sonuçlarına da dikkat etmek gerekir:

   dortgen.alan /= 2;
   // mutlak değişmezi korumak için diğer ikisini nasıl değiştirsek acaba?

dortgen modülünün en, boy, ve alan değişkenleri arasındaki ilişkiye o modülün bir mutlak değişmezi denir. Mutlak değişmezler genel erişime açılamazlar. Modül tarafından sahiplenilmeli ve korunmalıdır.

Not: Yukarıda modül için söylediklerim sınıf ve yapılar için de aynen geçerli. Her tür kendi mutlak değişmezini korur.

Bu konu şu bölümde Dörtgen isimli bir yapı üzerinde geçiyor:

http://ddili.org/ders/d/nitelikler.html

Ama asıl şu bölüme ait olan bir kavram:

http://ddili.org/ders/d/invariant.html

Tabii o iki bölümde anlatılan olanakları kullanmak şart değil. Amacım, mutlak değişmez kavramını anlatabilmekti. Bir de şurada:

http://ddili.org/ders/d/sarma.html

Herkesin erişebildiği değişkenlerin başka bir sorunu da birden fazla iş parçacığı gibi durumlarda ortaya çıkabilir. Eğer bir değişkene yapılan yazma erişimi denetim altına alınacaksa, yani aynı anda tek iş parçacığının yazması garanti edilecekse bunun için kilit gibi olanaklar kullanmak gerekebilir. Değişkene erişim herkese açıksa kilitlenmesi de ayrıca sorun olur.

Aslında bu gibi kavramları anlamanın en iyi yolu deneyerek görmektir. :) Ne yazık ki kadar söz edilse boş oluyor. Ayrıca senin programında bunların hiç önemi bile bulunmayabilir. Bunlar genel kavramlar. Senin özel durumun için bütünüyle gereksiz olabilir ve senin tasarımını gereksizce etkileyebilir.

Ek olarak, tabii ki bu kaygılar her dildeki tasarımları etkiler; D'ye özgü değil...

Ali

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