|
Yazılım Günlüğü |
|
[25/7/2005] Dün
gece kaç gündür
scrumdevelopment grubunda süregiden bir
tartışmayı okumaya başladım: Critical Chain yani Kritik Zincir yönetimi
ve bunun yazılım projelerinde kullanılması. ~o~ [3/7/2005] Longhorn ile registry ve dosya sisteminde de transaction bağlamında işlem yapmak mümkün olacak. ~o~ [3/7/2005] C# 2.0’da özellik (property) okuyucu ve yazıcıları (getter ve setter) için farklı erişim modları tanımlayabiliyorsunuz. Yanılmıyorsam bu C# 1.0’da yoktu. Şöyle ki: public Person Owner { get { return _owner; } internal set { _owner = value; } } Bu özellik sayesinde daha estetik bir API tasarımı yapmak mümkün. Örneğin her şahsın bir araba koleksiyonu olsun: public class Person { private CarCollection _cars; public CarCollection Cars { get { return _cars; } } } Her araba da sahibini tanısın: public class Car { public Person Owner { . . } } Sunduğumuz API ile bir araba bir şahsın araba koleksiyonuna eklendiğinde, arabanın da sahibini tanımasını şu şekilde gerçekleştirilebilir: Person p = new Person("Ali"); for (int j = 0; j <5; j++) { Car c = new Car("Ford", 1900+j); p.Cars.Add(c); c.Owner = p; } Burada tek sorun, API’ımızı kullanan kişinin p.Cars.Add(c) ve c.Owner = p; satırlarını sürekli beraber kullanmayı hatırlamasının gerekmesi. Sonra, arabayı listeden çıkardığında da Owner‘ı tekrar null olarak ataması gerekecek. İşte burada internal ile bir çözüm geliştirebiliriz, bu durumda CarCollection sınıfımız şöyle olacaktır: public class CarCollection { private List<Car> _elements = new List<Car>();
private Person _owner;
public CarCollection(Person owner) { _owner = owner; }
public void Add(Car car) { this._elements.Add(car); car.Owner = _owner; }
public void Remove(Car car) { this._elements.Remove(car); car.Owner = null; } } } Şahıs sınıfında public Person(string name) { _cars = new CarCollection(this); } Araba sınıfında da public Person Owner { get { return _owner; } internal set { _owner = value; } } şeklinde bir kod yazacağız. Böylece API’ımızı kullanan üçüncü şahıslar Owner’a değer atayamayacak, onu sadece okuyabilecekler. Yani p.Cars.Add(c); gibi tek satırla hem araba şahsın araba koleksiyonuna eklenmiş olacak, hem de araba’nın sahibi otomatik olarak atanmış olacak. API’ımız kullanan kodun her seferinde p.Cars.Add(c); c.Owner = p; çiftleri halinde kod yazması gerekmeyecek. Zaten c.Owner = p; gibi bir kod da her zaman derleyici hatası verecek. Bu yaklaşım eğer bir sınıf kütüphanesi geliştiriyorsak çok faydalı. Yok eğer bizim geliştirdiğimiz sınıfları kullanan diğer kodlar da bu sınıflarla aynı assembly (.dll ya da exe) içindeyse, internal anahtar sözcüğü tüm assembly için geçerli olduğundan onlar da Owner’a değer atayabileceklerdir. C#’da, C++’daki gibi friend anahtar kelimesi olmadığından bu tip çözümler sadece sınıf kütüphaneleri geliştirdiğimizde faydalı oluyor. Tüm kod şöyle oluyor: public class Car { private string _make; public string Make { get { return _make; } set { _make = value; } }
private int _model; public int Model { get { return _model; } set { _model = value; } }
public Car(string make, int model) { _make = make; _model = model; }
private Person _owner; public Person Owner { get { return _owner; } internal set { _owner = value; } } }
public class CarCollection { private List<Car> _elements = new List<Car>();
private Person _owner;
public CarCollection(Person owner) { _owner = owner; }
public void Add(Car car) { this._elements.Add(car); car.Owner = _owner; }
public void Remove(Car car) { this._elements.Remove(car); car.Owner = null; } }
public class Person { private CarCollection _cars ; public CarCollection Cars { get { return _cars; } }
private string _name; public string Name { get { return _name; } set { _name = value; } }
public Person(string name) { _cars = new CarCollection(this); _name = name; } }
Örnek kod: Person p = new Person("James"); for (int j = 0; j < 10; j++) { Car c = new Car("Ford", 1900+j); p.Cars.Add(c); Console.WriteLine(c.Owner.Name); } ~o~ [21/6/2005] Scrum ve diğer
güncel meselelerden biraz olsun uzaklaşalım.
~o~ [1/6/2005] Planlanandan önce Scrum kursumuza kavuştuk.
Niyetim daha sonraları Ken Schwaber'den almaktı bu kursu ama şirketteki
başka ekipler lokal bir kursa yazılınca, onlarla ileride fikir alışverişinde
bulunabilir, tecrübelerimizi paylaşabiliriz diyerek biz de
yazıldık. ~o~ [23/5/2005] Bugünlerde kapamalarla ilgili bir çok blog görünüyor. Nedir kapamalar? (Closure : kapama) Kapamalar, Ruby gibi dillerle gündeme geldi – eminim yeni bir kavram değiller, hatta Lisp’de bloklar olarak biliniyorlarmış. C# ile anlatmaya çalışırsak, bir yönteme bir parça kodu parametre olarak geçmek için kullanılan dil yapıları kapamalar. C# bunu anonim metodlarla destekliyor. C günlerinden kalanlara fonksiyon işaretçileri dersek sanırım birşeyler çağrıştıracak. Örnekte geciken siparişleri bulmak için önce ‘klasik’ foreach bloğuyla, sonra da kapama ile bunu nasıl yaptığımızı gösteriyoruz. List<Siparis> siparisler = new List<Siparis>(); /// Siparis ekle, cikar, vs... /// ...
// Geciken siparisleri bildik yolla bul! List<Siparis> gecikenSiparisler1 = new List<Siparis>(); foreach (Siparis s in siparisler) { if (s.Gecikti) gecikenSiparisler1.Add(s); }
/// Geciken siparisleri kapama ile bul! List<Siparis> gecikenSiparisler2 = siparisler.FindAll(delegate(Siparis s) { return s.Gecikti; });
Burada FindAll() yöntemine parametre olarak verdiğimiz kod parçasına kapama diyoruz. Nerelerde kullanılabileceği konusunda hala şüphelerim var, liste işlemlerinde faydası olduğu bariz, ama daha az kod yazmaya falan yaramıyor. Performansına dair hiçbir iddia da yok. Biraz daha oynamak gerekecek sanırım. Okuması biraz zor olabilir, hele içice kullanılmaya başlarsa. C dilinde sevmediğim yön tüm fonksiyon işaretçilerinin içice kullanıldığı kodları okumak zorunda kalmaktı. ~o~ [17/5/2005] Uzun bir aradan sonra tekrar bloglamaya
devam ediyoruz. Tatil, projedeki yoğun günler ve
süreç değişiklikleri. Eğer
bu yönde ilerlemeye devam edersek, yakında Scrum ile
denemeler yapmaya başlayacağız.
Umarım bu devam eder, ben de buradan size
tecrübelerimi anlatmak fırsatı
bulurum. ~o~ [15/3/2005] Sanal PC konusunda yeni bir hamle de mikroişlemci üreticilerinden geliyor. Intel ve AMD de bu konuda çalışmaya başlamışlar. ~o~ [27/2/2005] Biraz da haftasonu havasına uygun bir not
düşelim. Don Box
blogunda çocuklarına hangi dili öğretse onu düşünüyor. Sorusuna bir
hafta olmadan yüzü aşkın cevap gelmiş. Siz ne dersiniz? :) ~o~ [27/2/2005] Teknoloji benim gibileri heyecanlandırmaya
devam ediyor. Dün nasıl çalıştığıma bir baktım da, nereden nereye gelmişiz.
Senaryo şöyle: Elimde bir ofis PC'si, bir de dizüstü bilgisayar var.
Elimdeki prototip için çeşitli programların ve sunucuların hem üretim
versiyonlarına hem de betalarına bakıyorum. Önce üzerinde XP çalışan ofis
PC'sine,
sanal PC üzerinde çalışan bir Windows 2000 Server kurdum, bir-iki betayı
oraya yükledim. O da yetmedi başka bir sunucuya da Windows 2003 Server ve
başka betalar. Şimdi elimde dört tane işletim sistemi var. Sonra eve geldim.
Dizüstüm ADSL'e kablosuz erişim noktasından bağlanıyor. ADSL üzerinden de
şirketin sistemine güvenli bir şekilde bağlandım. Sonra ofisteki PC'lere
Remote Desktop üzerinden girdim, ofiste gibiyim, o sunucuların
işlemcilerinden rahatlıkla faydalanıyorum. Dizüstümde Visual Studio yavaş
çalıştığından kodlamayı ve hata ayıklamayı ofis bilgisayarında yapıyorum.
Remote Desktop bu kadar hızlı bir tecrübeyi bana sağlıyor. Elimin altında
dört tane bilgisayar, bir yandan da TVde müzik kanalları arasından bir
şeyler seçmeye çalışıyorum. ~o~ [26/2/2005] Microsoft, MSDN'de Indigo için bir giriş makalesi yayınladı. Indigo XML ve Web Hizmetleri üzerinden hem .NET sistemleri arasında hem de .NET ve J2EE sistemleri arasında çalışma birliğini (interoperability) gerçekleştirmeyi hedefliyor. ASMX, Remoting, Enterprise Services veya MSMQ gibi teknolojilerle çalıştıysanız, Indigo bir sonraki adım. ~o~ [8/2/2005] Bugün video ile XP ve birim test geliştirilmesiyle ilgili yeni bir video sayfası daha gözüme ilişti. Kent Beck'in yaklaşık bir saatlik sunumunu ve Google'daki XP tecrübelerini bu adresten dinleyebiliyorsunuz. ~o~ [29/1/2005] Internet altyapısı hızlandıkça teknik
bilgilere sözlü ya da görüntülü olarak erişmek de mümkün oluyor. Uzun uzun
makaleler okumaktansa da sunucuyu dinleyebileceğiniz bu tip eğitimlerin
makale okumaktan kimi açılardan faydalı olduğunu düşünüyorum. Örneğin
konuşmacının nerelere vurgu yaptığını direk takip edebiliyorsunuz. ~o~ [13/1/2005] UML'in emektarlarından
Grady
Booch'ın hesaplarına göre 1945'ten bu yana 750 milyar satır kod yazılmış.
Bunların bir kısmı kullanılmadı bile tabii. Her satırın 100 ila 200 dolar
arasında maliyeti olduğunu hesaplıyor Booch. ~o~ [12/1/2005] Java ya da C# ile çalışanlar Collection sınıflarının faydalarından haberdardırlar. Ancak bu sınıfların bir sorunu fazlasıyla esnek olmalarıdır. Örneğin bir diziyi (array) tanımlarken o dizide hangi tip veri saklayacağınızı belirtebilirsiniz. String[] stringArr = new String[5]; Fakat, bir ArrayList tanımlarken bunu
belirtemezsiniz.
~o~ [31/12/2004] Kullanım Kolaylığı Yazılım alanında hobi olarak takip ettiğim alanlardan birisi kullanım kolaylığı (usability). Son günlerde RSS okuyucusu olarak kurduğum Mozilla Thunderbird beni bu konuda çok eğlendirdiği için onunla ilgili notlarımı paylaşayım sizlerle.
Gördüğünüz gibi sol taraftaki Folders kısmında en üstte takip ettiğim günlükler görünüyor. Peki programı yeni kurmuş birisi olarak yeni bir günlüğü daha listenize eklemek istediniz diyelim. Ne yaparsınız doğal olarak? News & Blogs’un üzerine gider ve farenize sağ tıklarsınız değil mi? (Evet, daha burada Microsoft kullanıcısı olduğum belli oldu belki de :) Ama yine de dinleyin derim.)
Hmmm, yeni bir günlük ekleyeceğiz ama nasıl ekleyeceğiz şimdi. İnsanın gözü ‘ New’ ya da ‘Add’ gibi bir şey arıyor. New Folder var, onu bir deniyorum ama oradan pek bir şey çıkmıyor. Halbuki Local Folders’ın üzerinde sağ tıklasam hemen yeni bir klasör açmak mümkün olacaktı:
Denemeye devam, şimdiden bir kaç defa tıkladık, daha yeni kurduk programı halbuki. İlk sağ tıklamaya geri dönüp bu sefer Manage subscriptions’ı deniyoruz, ilk sırada o var çünkü. Şöyle bir şey geliyor karşımıza:
Burada da Add demeli herhalde. Bir daha tıkladık,
Hah, buraya RSS için URL gireceğiz! (Aslında bir şey girmeden de OK diyebilirsiniz, program hiç şikayet etmiyor!) Tamam, şimdi oldu. Burada OK diyeceğiz, sonra RSS Subscriptions sayfasında da OK diyeceğiz. İlk seferinde hep doğru seçimleri yapabilirseniz 5 tıklamada işinizi görebilirsiniz. Halbuki yeni klasör açmak iki tıklamada yapılabiliyor. Hmmm, demek ki diyorum bu RSS okumaya göre değil pek. Peki e-posta için mi tasarlanmış daha çok? Belki de öyledir. Adres defterine bir göz atalım:
Orada da pek umut yok. Personal Address Book üzerinde sağ tıkladığınızda ilk sırada Properties geliyor, pek sık kullanılan bir şey olsa gerek, deneyelim:
Evet, değiştirememeniz için gri olarak yazılmış bir isim, ama o da ne? Buna rağmen OK ve Cancel düğmeleri var. Belki de gri olmasına rağmen değiştirilebiliyordur, deneyelim. Yok, olmuyor. Hmmm! Çok eğlenceli doğrusu :)Tamam, bu özellikleri belki bu Mozilla halkı hep böyle en üste koyuyordur menülerde, belki ben abartıyorum. Mozilla yazılımı pek kullanmadım bugüne kadar. Bir bakalım.
Burada en sonda Properties.Bir de klasörlere bakalım:
Burada da en sonda. Neyse, bedava program bulmuşuz beğenmiyoruz. Ayıp oluyor. Neyse, maksadım eleştirmek değil, açık kaynak kod tartışması yapmak da değil. Kullanım kolaylığı konusuna dikkat çekmek istedim. Bu konu ilginizi çekiyorsa, birikimini paylaşan ustalardan Joel Spolsky’in sitesini tavsiye edebilirim. Arşivinde çok keyifle okuyacağınız makaleler ve kitabından bir kaç bölüm bulunuyor. Şöyle demiş usta: “Eğer bir program kullanıcının onun çalışmasını beklediği şekilde davranıyorsa, o programın arayüzü iyi tasarlanmış demektir.” ~o~ [30/12/2004] Blog'un Yükselişi ve 2005 ~o~ [25/12/2004] Yazılım dünyası değişiyor. Bundan belki beş
sene önce eski uygulamalara rahatlıkla kem gözle bakılabilir, bazıları 'yeniden
yazılır', bazıları da çöpe atılırdı. Belalı bir kod size devredildiğinde
'biz bunu yeniden yazalım' falan diyebilirdiniz, işinizden de olmazdınız.
~o~ [22/12/2004] Merhaba, Bugünden itibaren teknoTürk'te bir yazılım günlüğü tutmaya başlıyorum. Göze çarpan yeni bir şeyi paylaşmak, üzerinde düşündüğüm konularda konuşabilmek, sorular sorabilmek, bir yerde sesli düşünebilmek için faydalı olacağını düşünüyorum bunun. Ayrıca yazılım dünyasına yeni gelenlere, ya da dışarıdan ilgi duyanlara da gündemimize bir göz atmak imkanı verecektir muhtemelen bu günlük. Aklımda .NET, tasarım kalıpları, yazılım metodolojileri gibi konular var. Umarım keyifli tartışmalar da yapabiliriz. Bunun için sitemizde teknik bazı iyileştirmelere ihtiyacımız var ama o zamana kadar yorumlarınızı keremkiziltunc@hotmail.com adresine yollayabilirsiniz.
|