Forum: Diğer Konular RSS
Kod Yazma Teknikleri
Girintiler ve Küme Parantezleri
Sayfa:  1  2  sonraki 
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Kod Yazma Teknikleri
Merhaba,

Bereketli bir başlıkta, (-bknz. ilgili konu) birden fazla konu çıkınca ayrı başlık açma gereği doğurdu. Aslında burada da birden fazla başlık (okunabilirlik, ekleme ve hatalardan arındırma kolaylığı) içeriyor. Crockford'un bu konuda JS üzerinden güzel bir vidyolu anlatımı var. Bulursam bu başlıkta nakledeceğim. Ama önce tartışmanın doğduğu satırlar ile başlayalım:
acehreli:
Salih Dinçer:
Ben genelde for'dan hemen sonra gelen if'lerde bile öncesine güzel parantez kullanmayıp tek satırlık for-if iş birliğini sanki tek komutmuş gibi temsil ederken sadece bir if için tek satır kullanmayıp altına girintili devam etmenizin kod yazma kolaylığı açısından sebebi nedir? <--- Farkındayım, çok uzun bir cümle oldu; işte kod yazarken sadeleştirmeye gayret ederim ama gel gör ki yazışırken uzatırım da uzatırım. Huy çıkmaz, can çıkarmış...:)
    if(len >= width)
        return s;
Başarılar...

Bunun kod kolaylığı açısından bir yararı yok. Olsa olsa okunaklılık açısından yararı olabilir. Programdaki diğer if'ler vs. bloklarını hep aşağıya alıyorlarsa gözümüz de kodu bakarken blokları orada ararlar. O yüzden tutarlı olmakta yarar var.

Yoksa satırın sonunda gizli kalmış oluyorlar.

    if (len >= width) return s;
    writeln("devam");

O kodu görünce writeln'ın if bloğu altında olduğu sanılabilir. Satırı girintili olmadığı için ise acaba boşluk mu unutuldu diye düşünülebilir. Tekrar if'e bakılır ve bloğunun aslında kendi satırında olduğu görülür.

Tutarlılık çok önemli olduğu için kendi adıma her zaman için küme parantezlerini de kullanırım:

    if (len >= width) {
        return s;
    }

Sonradan başka satır eklenecekse yeri hazırdır. Öteki türlü, return s aşağıya indirilmelidir.

Ama çok önemli değil tabii. Kişisel... :)

Ali
Sanırım herkesin kişisel bir takım alışkanlıkları var. Tabi standart değerler üzerinden kodlarımızı yayınlamak daha uygun olacaktır. Bu da bol bol güzel parantez kullanmak olsa gerek? Bu sayede düzeltmeler de kolay oluyor. Tam burada bir tecrübemi paylaşmak isterim:

Yazılım geliştirme aşamasında tüm satırların tek ekranda (PgUp/Down kullanmadan) durması için için mümkün olduğunca satırları birleştiriyordum. Ama bir keresinde  güzel parantez kullanmayıp;
- Tıpkı yukarıdaki if() gibi bir for() döngüsü kullandım,
- Döngüyü geçici olarak iptal etmek için altındaki ekrana yazma satırını // ile gizledim,
- Tabi derleyici sonunda noktalı virgül olmadığı için hata verdi, hadi tek karakterden ne olacak dedim ve geçtim...:)

Ama sonra o noktalı virgül unutuldu ve n'aptıysam kodu eski haline getiremedim. Çünkü gözüme hiç bir hata gözükmüyordu ve noktalı virgül yüzünden de masum döngümüz tek başına takılıyordu. Yani koda yavaşlık hariç hiç bir katkısı olmuyordu...

Bir de başka tartışma konusu da toplam (gerçek) satır sayısı olabilir. Hani şu kadar satır kod yazdık dediğimizde, aslında güzel parantez ve boş satırları dikkate aldığımızda, toplam satır sayısını bulmak için ikiye bölmek zannedersem daha doğrudur...:)

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Sanırım herkesin kişisel bir takım alışkanlıkları var.

Daha da önemlisi, çalışılan grubun kuralları var. Örneğin bizim firmada küme parantezsiz kod bloğu kullanılamaz.

- Tıpkı yukarıdaki if() gibi bir for() döngüsü kullandım,

Senin yazdıklarından esinlenerek küçük bir program:

import std.stdio;
 
void main()
{
    bool bir_kosul = true;
 
    if (bir_kosul)
        writeln("Koşul doğru");
 
    writeln("Devam ediyoruz");
}

- Döngüyü geçici olarak iptal etmek için altındaki ekrana yazma satırını // ile gizledim,

Tamam:

import std.stdio;
 
void main()
{
    bool bir_kosul = true;
 
    if (bir_kosul)
        // writeln("Koşul doğru");
 
    writeln("Devam ediyoruz");
}

"Devam ediyoruz"un nasıl if'in altına çekildiğini farkettiniz mi?

- Tabi derleyici sonunda noktalı virgül olmadığı için hata verdi, hadi tek karakterden ne olacak dedim ve geçtim...:)

D çok yardımcı olark buna izin vermez:

    if (bir_kosul)
        ;             // <-- DERLEME HATASI 

Bir de başka tartışma konusu da toplam (gerçek) satır sayısı olabilir. Hani şu kadar satır kod yazdık dediğimizde,

Benim için hiçbir önemi olmayan bir ölçü o. Andrei geçen sene bizim firmada D konuşması yaptığında ayaküstü sohbet sırasında "sizin kod kaç satır?" diye sordu ve bilmediğime şaşırdı. Aslında "hiç kimse bilmiyor" diye eklediğine bakarsak kendisi azınlıkta olmalı. ;)

Ali
zafer #3
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben ilgili konudada belirtiğim gibi bunun kişisel bir seçim olduğunu ve kendimizi çok sıkmaya gerek olmadığını düşünüyorum.

Benim gibi tek başına kodluyorsan, sana hangi yazım daha rahat hissettiriyorsa onla devam etmelisin. Ali gibi bir ekip
içinde çalışıyorsan zaten kodlamanı yönlendirecek ekip kuralları mevcuttur. Yada ddili.org gibi bir sitenin açık kaynak projelerinde yer alıyorsan zaten sitenin bir kodlama standartı (http://ddili.org/wiki/index.php?title=Kodlama_Standard%C4%B1) vardır ve sende ona göre kodlama yaparsın.

Diğer taraftan tabiki tavsiye edilen yöntemlerden birini kullanmak yukarıdaki hataların en aza inmesi için iyi bir seçim olacaktır.
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Öncelikle Wikimiz olduğunu bilmiyordum (görmemişim!); teşekkürler Zafer...:)

Grup kuralları hiyerarşi gereği daha önemli. Sanırım bir süre sonra da alışıyor ve kişisel tercihlerinize baskın geliyordur. Dünya genelinde de bu güzel parantezlerin fazlalığından çoğunluğun tercihi anlaşılıyor...

Peki kendinize özel teknikleriniz var mı? Aslında bu aşağıdaki gibi kendimden verdiğim örnek gibi de olması şart değil. Örneğin hata bulmak için aralara sıkıştırdığınız açıklamalarınıza mı yoksa Debugger'in verdiği bilgilere mi güvenirsiniz? Öyle ya, çok yakın bir zaman önce yazdığımız kodun amacını/sebebini hatırlamamız bile vakit alabiliyor...:)

//maskInitialize();/*    
    do
    {
        Console.Write("{0}\t", k);
        Console.ReadKey();
        k = bwSieve.bwTren(xVagon, 'd');
    }
    while (k < 79);//*/ 
C#'dan örnek verdiğim için kusura bakmayınız. Burada benim sıklıkla kullandığım şöyle bir şey var: //*/

Görevi, üst satırdaki fonksiyonu iptal ettiğimde alttaki test kümesini açması ve işi bittiğinde de eski haline getirdiğinizde (iki delete tuşu) anında koddan çıkması. Bunu karışık bir şekilde (birden fazla) çeşitli yerlerde kullanarak daha etkili örnekler var. Tamamen sizin ihtiyaçlarınıza kalmış.

Gerçi günümüz IDE'leri çok şahane şeyler başarıyor. Sanırım buna benzer yetenekli görevleri kullandığınız yazılma küme küme yaptırabiliyorsunuz. İşte, bu da sizinle paylaşmış olduğum bir alışkanlığım...:)

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bahsettiğim vidyoyu (Douglas Crockford / JavaScript: The Good Parts) buldum:
http://open.bilgi.edu.tr/freedays_2009/index.php?p=videos

Ben oradaydım...:)

Konu belki JS (malum büyük ustanın konusu!) ve güvenlik üzerinden işleniyor ama kesinlikle çok aydınlatıcı. Küme mevzuları, gelenekler ve olası hatalardan bahsediliyor. Boş bir vaktinizde (örneğin şu Pazar günü) izlemenizi öneririm. Sanırım sitede bir yerlerde Türkçe alt yazılı olanı da vardı. Ayrıca sunumun benzer vidyoları ve PPT dosyası sitesinde mevcut...
He delivers a clear, concise tutorial on object-oriented JavaScript and closures. The most satisfying piece to me was his clear explanation of why right-curlies ("block {" all on the same line) is the only acceptable style in JavaScript.

Tune in to the video below, and follow along with the presentation. It's enjoyable and enlightening. What a great combination. Thanks, Doug!
Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-02-04, 21:29.
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
D Dili'nde başka bir teknik de assert() kullanmak imiş. Bunu bir çok yerde görüyorum. İlk başlarda anlam veremiyordum ama kesinlikle çok faydalı bir şeymiş. Peki bu ifadeler kodda bir şişkinliğe veya yavaşlığa neden oluyor mu?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ali bey C++ için bazı programcıların kodlarının üçte birinin assert ifadelerinden oluştuğunu söylemişti. Hatta assert kullanmayanları dövüyorlarmış! :)

Diğer hata yakalama olanaklarından farkı kullanıcının değil de programcının hatalarını yakalamak için kullanılır. Programda denenmesine gerek bile olmayacak kadar emin olduğumuz ifadeleri test ederken assert kullanırız.
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Üçte birini ben söylemişsem abartmışım! :-p Evet, assert çok yararlıdır.

assert'ün arkadaşı std.exception.enforce da çok yararlı. Bazen kullanımları birbirine karışabiliyor:

  • assert programcıyı (kendimizi) denetlemek için kullanılır. O yüzden Erdem'in "denenmesine gerek bile olmayacak kadar emin olduğumuz ifadeleri test ederken assert kullanırız" sözü çok doğru. ;) Çünkü program hataları doğru olduğunu düşündüğümüz yerlerde ortaya çıkabilirler.

O yüzden assert'ler in, out, invariant, ve unittest gibi bloklara uygunlar.

  • enforce ise işlevin kullanıcısını denetlemek için kullanılırlar. Kullanıcı kendimiz de olabiliriz, yazdığımız bu kütüphaneyi kullanan başka bir programcı da olabilir. enforce aslında bir koşulu denetleyip hata atmakla aynı şeydir:

    if (boş_mu()) {
        throw new Exception("Boşken çağıramazsınız");
}

Onun yerine:

    enforce(!boş_mu(), "Boşken çağıramazsınız");

Bazen enforce ile denetlenmesi gereken durumlar in bloklarına yazılabiliyor. Bu hataya ben de düşüyorum.

Hangisini kullanmak gerektiğini şöyle belirleyebiliyoruz: in, out, ve invariant blokları dmd'nin -release seçeneği kullanıldığında koddan çıkartılıyorlar. (Galiba assert'ler de öyle? Denemek gerek. Ama assert(false) özeldir ve hiçbir zaman koddan çıkartılmaz.)

Programın doğruluğundan emin olup -release ile kullanıma sunduğumuzda bile uygulanmasını istediğimiz denetimler için enforce kullanmalıyız; diğerleri için assert.

Ali
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Enforce'u bilmiyordum, teşekkürler...

Aslında ben ne C'de ne de başka bir dilde bu tür özel şeyleri hiç kullanmıyorum. Bu durumda dayak yiyeceklerin önde geleni olmalıyım...:)

Bunun yerine #define ve derleyici ifadelerini kullanıyorum. Duruma göre 'test block'ları iptal oluyor ve derlenmiyor. Hatta sadece hata denetlemesi için değil ekrana görüntü veren bazı satırları bu şekilde aç kapa yapabiliyorum. Geçici çözümleri ise yukarıdaki gibi satır gizleme yöntemi kullanıyorum.

Peki D'de define gibi şeyler var mı? Ben görmedim de belki başka şekilde kullanılıyordur.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Peki D'de define gibi şeyler var mı? Ben görmedim de belki başka şekilde kullanılıyordur.

Bjarne Stroustrup makroları C++'a hiç almak istememiş ama haklı nedenlerle başaramamıştır. D'de makro yoktur. Şunlar varken makro gerekmiyor:

  • şablonlar

  • alias

  • immutable

  • version()

  • debug()

  • static if()

  • mixin (şablon ve dizgi)

  • vs. (?) :)

Ali
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şimdi örneklere baktım da harikaymış, teşekkürler...
version(build){
    debug{
        pragma(link, "dwtd.lib");
        pragma(link, "dwtextrad.lib");
        //pragma(link, "dparser/dparser.lib");
    }else{
        pragma(link, "dwt.lib");
        pragma(link, "dwtextra.lib");
        //pragma(link, "dparser/dparser.lib");
    }
    pragma(link, "phobos.lib");
}else{
    debug{
        pragma(lib, "dwtd.lib");
        pragma(lib, "dwtextrad.lib");
    }else{
        pragma(lib, "dwt.lib");
        pragma(lib, "dwtextra.lib");
    }    
    pragma( lib, "uuid.lib");
}
Ama sanki bunlar birden fazla dosyadan oluşan IDE ile tasarlanan projeler için. Yoksa tek dosyalı şeylerde kullanabilir miyiz?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Benim deneyimim yok ama pragma(link) eskiymiş. pragma(lib) kullanılabilir:

pragma(lib, "abc");
 
void main()
{}

Programın abc kütüphanesiyle bağlanması gerektiğini kaynak koda ekleyebilmek güzel. Öyle bir kütüphane bulunmadığında da bağlayıcı hata veriyor:

/usr/bin/ld: cannot find -labc

Ali
Avatar
Salih Dinçer #13
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Artık çok güzel şeyler var; eskiyi hatırlarım böyle miydi!

NYP (OOP) bile tek başına büyük bir nimet. Aslında her şey derleyici ile bizim aramızda gelişen gösterim teknikleri...

Yoksa olayı basit (clear~simple) olarak değerlendirdiğimizde değişen belki de çok bir şey yok. Tıpkı D'de birden fazla mantık sıralamalı (örn. if(s=="a"||s=="b"||s=="c") sorgu ile switch() kullanmanın assembly kodu karşılığında hiç bir farkı olmaması gibi...

Bu arada, az önce şurada çok güzel bir örnek ile karşılaştım. Aslında "while(i < j) i = 2 * i;" satırını şöyle ifade edebilir ama siz de dahil anlamak için uzun çaba sarf etmeniz gerekebilir...:)
while (
i     <
j     )
i     =
2     *
i     ;
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj 2 defa değişti; son değiştiren: Salih Dinçer; zaman: 2012-03-10, 00:54.
Avatar
Salih Dinçer #14
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bugün MVC yapısında kod yazmaya karar verdim...

Çünkü üzerinde çalıştığım projede gerekli görünüyordu! Kod örneklerini araştırırken yeni bir şey (çift nokta ile işlev işaretleme) keşfettim; herhalde bu sayede, uygulama dosyaları gereksiz yere şişmemiş oluyor:
// This implements an improved algorithm of Guenter Stertenbrink's suexco.c
// (http://magictour.free.fr/suexco.txt).
 
import core.stdc.stdio: puts, fgets, stdin, putchar;
import core.stdc.string: strlen;
Kaynak: http://codepad.org/RejDPkGh/fork <-- bu kodun ne işe yaradığını bilmiyorum, hiç sormayın...:)

Ekleme: Bugün Ali Hocam /*...*/ açıklama imlerini de sorunsuz bir şekilde içine alan /+ ... +/ imlerinden bahsetti ki tam da beyin kavrulduğu sırada (brain stroming) imdata yetişti yani ferahlatıcı yeni çözümlerden (cozzz, beyni kurtardık  :-D) biri oldu...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-03-10, 00:57.
acehreli (Moderatör) #15
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
herhalde bu sayede, uygulama dosyaları gereksiz yere şişmemiş oluyor

Programın büyüklüğüne etkisi olduğunu sanmıyorum. Phobos modülleriyle deneyebilirsiniz. Bu olanağın amacı, global isim alanının kirletmemek ve olası isim çakışmalarının olasılığını azaltmaktır. Her iki modül de Üçgen diye bir tür tanımlasa ve biz her iki modülü de programımıza eklesek, programda Üçgen dediğimizde derleyici hangisini kasdettiğimizi anlayamaz. Seçerek import bunu azaltıyor.

Ali

Not: Senin söylediğin daha çok "brain fried"a benziyor. :) "Brain storming" hani toplantılarda sıkılmadan saçma gibi gelse de fikirler ortaya atarak birlikte çözüm bulma olayı.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 19:27:53 (UTC -08:00)