Alıntı:
> elimden geldiğince anlaşılır ama kaynakları iyi kullanan kodlar yazmaya gayret ediyorum
Ona dikkat ederken zamanından önce uygulanan eniyileştirme hatasına düşmemek de çok önemli. ("Premature optimization is the root of all evil.") Bu konu da çok geniş ama kodu istersek bin kat hızlandıralım, eğer o kod programa milisaniye katkıda bulunuyorsa o eniyileştirme yalnızca kodun anlaşılırlığını bozar.
Öncelikle şu ilkeler önemli:
-
Anlaşılır, temiz, bakımı kolay kod
-
Algoritma karmaşıklıklarına dikkat. Bunu bu konuda gördük: zaten sıralanmış bir dizide ararken gereksizce sırayla aramaya gerek yok; ikili arama da kullanılabilir. (Ama bu konuyu bulandırmak istemiyorum; sonunda bağlı liste ile karşılaştırırken dizimizde yine de sırayla arayabilirsiniz. Stroustrup farketmediğini söylüyor. İnanırım. :))
Alıntı:
> Örneğin basit şeyler için işlev yazıp return ile döndürmemeyi tercih ediyorum
Kodun anlaşılırlığı ve bakımı açısından işlevler ne kadar küçükseler ve ne kadar küçük kavramları temsil ediyorlarsa o kadar önemlidir.
Alıntı:
> Çünkü bunları bir döngü içinde çağırdığınızda ve döngüde binlerce kez tekrar ettiğinde yüksek hızlı bir işlemcide bile saniyeler ile ifade edilebilecek farklar oluşuyor.
Olabilir veya olmayabilir. Ölçmeden bilinemiyor. Derleyiciler bir çok eniyileştirme uygularlar. dmd henüz gcc kadar iyi değil ama bu bizim kodlama gücümüzü etkilememeli. dmd nasıl olsa gelişecek. :)
Kaldı ki, saniyeler, yanlış algoritma seçiminin yanında farkedilmeyecek kadar düşük hızlardır. Yanlış bir algoritma belirli N değerleri için göz açıp kapayana kadar kısa sürer ama N büyüdüğünde yüz yıllar kadar sürebilir. (Abartmıyorum.)
Örneğin elemanları sırayla gezmemizin gerektiğini varsayalım. Çalışanları baştan sona ilerleyerek maaşlarına %90 zam yapacağız... (İyiymiş! :-p) Bu işlem O(N)'dir. Yani N çalışan için N işlem.
Ek olarak, çalışanlara bir de ikramiye vereceğiz diyelim. (O daha da iyi: %200! :-p) O da O(N).
Burada tek foreach döngüsü kurup içinde hem zam yapılabilir hem de ikramiye verilebilir. İşlevin ismi ne olabilir? zamVeİkramiye()? Öyle bir şey...
Öte yandan iki farklı işlev yazabiliriz: zamYap() ve ikramiyeVer(). İki işlev durumunda iki döngü gerekir. Yani başından sonuna iki kere gitmek gerek. Karmaşıklığı nedir? Yine O(N). Bilgisayar bilimine göre hiçbir şey farketmez.
Evet, döngünün ilerletilmesi sırasında biraz zaman kaybı olur ama o nanosaniyelik bir işlemdir. Her çalışanın işlemi zaten mikrosaniye sürüyorsa, tek çalışanın işi bile bütün döngünün bin katı zaman almaktadır. Tek işlev kullanmak ne kadar anlamsız bir kazanç, değil mi?
Alıntı:
> Bunu 'insertInPlace()''da görüyoruz, meğer aynı şeyi yapıyormuşuz...:)
Standart kütüphaneler affedilebilir çünkü bin bir çeşit programa hizmet ediyorlar. Kodun okunaklılığından ödün verebilirler.
Alıntı:
> true/false deyimlerini elimden geldiğince her yerde kullanmayı seviyorum. Çünkü çok pratik ve anlamlılar. Üstelik bu işleve çok güzel oturdular.
Kabul ama oturmadıkları çok işlev de oluyor.
Alıntı:
> Türkçe'ye uygun doğru/yanlış ve evet/hayır gibi şeyler kullanabilseydik ne iyi olurdu.
Ancak yine değerleri 'evet' ve 'hayır' olan enum'larla olurdu.
Alıntı:
> Sanırım D'de makro (#define) olayı da yok, olur mu bilmem?
Yok.
Alıntı:
> Alıntı (Ali Çehreli):
> Bağlı liste linked list anlamında. Associative array'e eşleme tablosu dedik.
Hmm, sanırım bugüne kadar hiç bir dilde kullanmadığım için çok yabancıyım.
Ne iyi ki C++ ve D gibi üst düzey olanakları olan dillerde elle bağlı liste yazmak zorunda kalmıyoruz. Ama her programcının en az bir kere bağlı liste yazmış olması gerekir. ;) En temel veri yapılarındandır (topluluk).
http://en.wikipedia.org/wiki/Linked_list
Türkçesi de var:
http://tr.wikipedia.org/wiki/Ba%C4%9Fl%C4%B1_liste
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]