Peki sizce hangisini kullanalım?
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
| Thread overview | |||||||||
|---|---|---|---|---|---|---|---|---|---|
|
February 17, 2011 Aynı işi, hesaplayarak veya switch kullanarak yapan iki işlev | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Peki sizce hangisini kullanalım? -- | |||
February 17, 2011 Aynı işi, hesaplayarak veya switch kullanarak yapan iki işlev | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Kadir Can | **Çok emin olmadan: Peki sizce hangisini kullanalım? Ali Beyinki hızı önemsemediğimiz zaman daha iyi. Hız işini en sona bırakmak her zaman daha iyidir. İlk önceliğimiz hatasız çalışan kod. Daha sonra hız.(Web için genelde tersi olur tabiki bu durum. Önemli olan sistemi şişirmeyen hızlı kodlar. Tam doğru çalışmasada olur. En güzel örnek cache sistemi. Mysql ile site her güncellendiğinde bağlantı kurulmaz. Çünkü bu hız kaybıdır. Yanlış ve eksik bilgi verme pahasına bu yapılır.) Ancak D dilinde bu projede herhalde hız en son bakacağımız işlemdir. Ben daha kolay kod yazmak pahasına katlarca yavaş çalışacak kod yazdım bu proje için. Yani web için belki Kadir'in dediğine karşı çıkamayız ancak genell konuşursak tabiki Ali Beyin dediği daha doğru. Ancak Ali Beyin verdiği kod yeterli değil.
Ya düzeye 12 dersek. Bir kontrol şart. Buda kodu biraz daha Kadirin koduna yaklaştırıyor. Ancak hala Ali Beyin dediği hala daha doğru. -- | |||
February 17, 2011 Aynı işi, hesaplayarak veya switch kullanarak yapan iki işlev | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Can Alpay Çiftçi (canalpay) | Not bunları iki tarafında eksilerini ve artılarını göstermek için söylüyorum. Yoksa bende tamamen Ali Bey gibi düşünüyorum. Ek olarak: Alıntı (acehreli): >Bunlara rağmen tek satırlı işlev bana daha doğru geliyor. Sanırım bunun nedenini buldum: Tek satırlı işlevde kodun işleyip geçtiği tek bir yol var (single code path). Düzey değeri ne olursa olsun hep aynı kod işletiliyor. Bunun çok güzel bir yanı, işlevin tamamının denenebilmesi için tek birim testinin yetmesidir. Ancak şu kod bence:
tek yol bile bizi bir kere doğru yola çıkarsada bir daha çıkaracağını kesinleştirmediğini kanıtlıyor. İşin kötüsü ancak biz doğru yola çıkabileceğimizi sanıyoruz! Tabi burada illaki her iki biçimde de hatalardan arındırarak doğru bir biçimde yazabiliriz. Ancak ya daha karmaşık yerlerde? Tabi ayrıca switch ile kullandığımızda kodun nasıl biçimleneceği derleyiciye değil tamamen bize kalacak. Açık ve net! -- | |||
February 17, 2011 Aynı işi, hesaplayarak veya switch kullanarak yapan iki işlev | ||||
|---|---|---|---|---|
| ||||
HTML belgelerindeki gibi başlıkları üretirken bir kaç işlevle karşılaştık. (Başlık düzeyinin yasal aralığının [1,6] olduğunu biliyoruz; bunun dışındaki değerler konusunu aşağıda gözardı ediyorum.) Benim yazdığım bir işlev şuna benzemişti:
Sonraki sohbetler sırasında to!string'in iki kere çağrılmasının gereksiz olduğunu farkettim ve işlevi şöyle yazdım:
Kadir Can ise switch deyimini seçmişti. Onunkinden uyarlıyorum:
(Lütfen önceki işlevin char[] döndürdüğüne, sonrakinin ise string döndürdüğüne fazla dikkat etmeyin; o konular kafamda hâlâ bulanık. :) Bu konular üzerinde daha çok düşünmek gerekiyor. C++'taki ilkeler D'ye bire bir uygulanamıyor. :-/) Beni bu yazıyı yazmaya iten neden, neden benim switch yöntemini aklıma bile getirmemiş olmamdı. Hangi yöntem daha iyi? switch yöntemi case durumlarının sayısı az ise kullanılabilir ama bu durumda 6'dan fazla olmadığını biliyoruz. Onun için bu konuda bir sakınca bulunmadığını düşünebiliriz. switch yöntemi daha hızlıdır çünkü düzey değerini string'e dönüştürmez; düzey dizgileri "" ve "" gibi hazır olarak beklemektedirler. (Uyarı! Uyarı! Uyarı!: Bu gibi küçük hız tasalarını lütfen önemsemeyin. Sohbet sırasında tamam ama öncelikle okunaklı, değiştirilebilen, kolayca anlaşılan, güzel kod yazmalıyız; ondan sonra ve ancak yavaşlık getirdiği kanıtlanırsa böyle konuları düşünmeliyiz.) Bunlara rağmen tek satırlı işlev bana daha doğru geliyor. Sanırım bunun nedenini buldum: Tek satırlı işlevde kodun işleyip geçtiği tek bir yol var (single code path). Düzey değeri ne olursa olsun hep aynı kod işletiliyor. Bunun çok güzel bir yanı, işlevin tamamının denenebilmesi için tek birim testinin yetmesidir. switch kullanan işlevde ise 6 farklı yol var. Altı adet test yazmadan her tarafının doğru işlediğinden emin olamayız. (Zaten o kodda bilerek bir hata bıraktım: 6 numaralı düzeyin açma parantezi "" olarak yazılmış. O hatanın birim testi ile yakalanabilmesi için testte 6 değerinin kullanılmış olması gerekir.) Bunu kesinlikle bir eleştiri olarak yazmadım. Gerçekten neden tek satırlı işlevin omur iliğim düzeyinde :) daha üstün geldiğini anlamak istedim. Tek satırlı işlev şu ilkeleri izliyor:
Sonuncu maddeyi daha önce bir kaç ortamda duymuştum. TDD (test driven development) denen kodlama yönteminde kod yazılmadan önce kodun birim testleri yazılır. Kod, ancak o birim testlerini geçmek için yazılır. TDD ilkesine bağlı kalınarak yazılan kodların yazılımcılık açısından daha üstün oldukları görülür: az hatalıdır, kolay değiştirilebilir, kolay anlaşılır, vs. Ali -- | ||||
February 17, 2011 Aynı işi, hesaplayarak veya switch kullanarak yapan iki işlev | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Kadir Can | switch yöntemi aklıma bile gelmediği için az kodlu olanı yeğlediğimi anlamış oldum. :D Eğer çok daha fazla case satırı olsaydı ısrarcı da olurdum ama programcıya kalmış bir durum... Ali -- | |||
February 17, 2011 Aynı işi, hesaplayarak veya switch kullanarak yapan iki işlev | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Can Alpay Çiftçi (canalpay) | Can, yine anlamadım. :) Tek birim testinin yetmediğini mi söylüyorsun? Katılırım. Benim söylemek istediğim, tek yol bulunduğu için tek birim testinin işlevin tamamını işletmiş olacağıydı. İçinde koşullar ve döngüler bulunan işlevlerde ise birden fazla yol bulunduğu için her akışı denemek için birden fazla test yazılması gerekir. Bütün söylemek istediğim oydu. Ali Not: Bu arada tek satırlı işlev dediğim halde, to!string'i bir kere çağıran ve 'etiket' değişkenini tanımlayan işlevi yeğliyorum. Çünkü
-- | |||
February 17, 2011 Aynı işi, hesaplayarak veya switch kullanarak yapan iki işlev | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Eğer düzey değerinin yasallığından bahsediyorsan, onu bu yazıyı kısa tutmak için gözardı etmiştim: Alıntı (acehreli): >(Başlık düzeyinin yasal aralığının [1,6] olduğunu biliyoruz; bunun dışındaki değerler konusunu aşağıda gözardı ediyorum.) Tabii ki o işin doğru olarak halledilmesi gerekiyor. Ama bu iki işlevi de aynı derecede etkileyen bir iş olduğu için boşverdim. Ben olsam şurada gösterildiği gibi yazarım: http://ddili.org/forum/thread/471
Ali -- | |||