İç İçe Yerel Bloklarda Aynı İsimli Değişkenler

advertisement
İç İçe Yerel Bloklarda Aynı İsimli Değişkenler
22-Mart-2009
Aşağıdaki kod parçası C/C++’da geçerli olduğu halde C# ve Java’da geçersizdir:
{
int a;
//...
{
long a;
//...
}
// C/C++’da geçerli Java ve C#’ta geçersiz!
}
C# ve Java'daki bu kuralın gerekçesi (rationale) nedir? Yanıt: Bilinçsiz ya da dalgın
programcıların hata yapmasını engellemek! Peki C/C++’da neden serbest? Yanıt:
C/C++ programcılarının bilinç düzeyi yüksek, onlar zaten bu tür hataları yapmayacak
derecede bilinçlidir!
Ben aslında bu gerekçelere katılmıyorum. İç içe bloklardaki bildirimlerin programlarda
böcek oluşturma potansiyeli düşük, fakat bu kuralın can sıkıcı olduğu pek çok
durumla karşılaşılıyor. Örneğin C#’da bir düğmeye basıldığında bir event metodunu
IDE yoluyla oluşturmak isteyelim:
private void button1_Click(object sender, EventArgs e)
{
//...
}
Burada try bloğu içerisinde bazı işlemler yapacak olalım:
private void button1_Click(object sender, EventArgs e)
{
try
{
//....
}
catch (Exception e)
// geçersiz!
{
//...
}
}
catch parametresinin ismini değiştirmek zorundasınız. Halbuki .NET yazım
geleneğine göre ilk akla gelecek isim e'dir. Uygulamada buna benzer can sıkıcı
durumlarla çok karşılaşılıyor.
Bu kuralın faydasından çok zararının olduğu kanısındayım. Bir uyarı yeterdi...
1
Kaan Aslan Blog Arşivi – www.kaanaslan.net
C = {C1, C2, C3, ....}
Derslerde C’nin sentaks kurallarını anlatırken aslında biz bu kümenin elemanlarını
yarı teknik, yarı sezgisel biçimde anlatırız. Peki geçerli bütün C programlarını nasıl
ifade edeceğiz? İşte bunun için bazı yöntemler kullanılıyor. Bir başlangıç
sembolünden hareketle dilin tüm elemanlarını veren bir gramer tanımlanabilir
(generative grammar). Dillerin standart dökümanlarında sentaks yapısını açıklamak
için kullanılan BNF ve türevleri bütün geçerli programları üreten bir otomattan başka
birşey değildir. Tabi bu konuda söylenecek daha çok şeyler var...
2
Kaan Aslan Blog Arşivi – www.kaanaslan.net
Download