İç İç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