C# Mantıksal Hatalar

Muhammet Ali
9 Haziran 2015 Salı
0

Mantıksal hatalar, uygulamaların istenildiği gibi çalışmadığı zamanlarda meydana gelen hatalardır. Diğer hata türlerinin aksine bu hataları mesaj olarak almak imkansızdır. Mantıksal hatalar %100 yazılımcıdan kaynaklanır. Genellikle algoritmaların yanlış kurulmasından veya yanlışlıkla bir kod yazılmasından meydana gelir.Mantıksal hataları daha iyi anlamak için araba örneğine geri dönelim. Araba üretim bandından sağlıklı bir şekilde çıkar yani arabada bir derleme hatası yoktur. Motoru vardır, dört kapısı vardır,tekerleri vardır ve hepsi yerli yerindedir. (derleme hatalarının uygulamanın nasıl çalıştığıyla ilgilenmediğini hatırlayınız)  Ancak arabada bir problem vardır. Silecek çalıştırılmak istenildiği zaman arabanın kornası çalar. Bu bir çalışma zamanı hatası değildir. Çünkü araba çalışmamazlık etmez veya silecek çalıştırılmak istenildiğinde elektriğin fazla gelmesinden dolayı birden durmaz. Sorun sadece arabada bir parçanın istenildiği gibi çalışmamasıdır. Bunun muhtemel sebebi elektrikten sorumlu teknisyenin bir anlık dalgınlığı sonucu silecek kabloları ile elektrik kablolarını yanlış yerlere bağlaması olabilir, silecek kablosunun gevşek sıkılmasından dolayı kayıp kornaya değmesi olabilir, direksiyon içindeki kabloların yanlış bağlanmasından kaynaklanıyor olabilir ve bu gibi birçok farklı neden olabilir.Gerçek bir örnek vermek gerekirse:

decimal ortalama;

decimal sayi1;
decimal sayi2;

sayi1 = 10;
sayi2 = 30;

ortalama = sayi1 + sayi2;

MessageBox.Show(ortalama.ToString());

Bu kod 10 ve 30’un ortalamasını alıp bunu kullanıcıya göstermek amacı ile yazılmıştır. Ancak çalıştırıldığında görülür ki, ekrana 20 yerine 40 yazan bir mesaj kutusu çıkar. Bu kodlarda hiç bir şekilde derleme hatası yoktur. Her şey C# kurallarına uygun olarak yazılmıştır, tür dönüşümleri de doğru bir şekilde yazılmıştır. Kodda çalışma zamanı hatası da yoktur. Çünkü decimal veri tipi bekleyen değişkenlere doğru tipte veriler atanmıştır ve kullanıcıdan değer alınmadığı için başka bir koşul oluşması da söz konusu değildir. Ancak yine de uygulama doğru çalışmaz. Bütün sorun, yazılımcının ortalama işlemini yapan satırda (işaretli satır) toplamı ikiye bölmesini unutmasından veya yanlışlıkla silmesinden kaynaklanmaktadır.

Görüldüğü üzere mantıksal hatalar oluştuğunda bir hata mesajı alınmaz. Ortada sadece yolunda gitmeyen bir durum vardır. Bu sorunun nereden kaynaklandığını bulmak ve onu gidermek yazılımcının görevidir. Mantıksal hataları yakalamak diğer hata türlerini yakalamaktan daha zordur.Yukarıdaki örnekte ortalama değişkeninin onlarca satır sonra başka bir matematik işleminde kullanıldığını düşünün. Ortalama değişkeni yanlış değer taşıdığı için o sonuç da hatalı çıkacaktır. Yine onlarca satır sonra bir önceki durumdan çıkan sonucun yine bir işlemden geçip, kullanıcıya gösterildiğini varsayın. Şansı yaver giderse kullanıcı bu durumu fark eder ve yazılımcıya haber verir. Yazılımcı hatalı sonuç veren satırın yakınlarında bile olmayan küçücük bir hatayı bulmak zorundadır. Peki, yüzlerce hatta binlerce satır kod arasından mesaj bile vermeyen küçücük bir hata nasıl bulunur? İşte bu “böcek ayıklama” sanatıdır.Debugging (Hata ayıklama) işleminin önce mantığını anlamanız gerekir. Şöyle bir örnek verilebilir:Evinizde uzun zamandır kullandığınız bir televizyonunuz var. İlk aldığınız günden beri kumandanızdan televizyonu kapatamıyorsunuz. Bir gün, bu durum canınıza tak ediyor ve problemi çözmesi için bir tamirci çağırıyorsunuz. Televizyon da yazılım projesi gibidir.  Nasıl bir yazılım projesi yüzlerce satır koddan oluşursa, televizyon da yüzlerce elektronik devreden oluşur. Televizyonun kumandadan kapanmama sorunu bu devrelerin herhangi birinden kaynaklanıyor olabilir. Tamirci bu problemi nasıl çözer? Önce belirttiğiniz durumu (televizyonun kumandadan kapanmama sorunu) kendisi test eder ve problemi kendisi de tasdikler. Sonra problemin neden kaynaklanabileceğini kabaca düşünür. Sorunun ya kumandada ya da televizyonda olduğunu düşünür. Kendisine daha kolay geldiği için kumandayı incelemeye başlar. Önce kapatma tuşuna basıldığı zaman elektrik verip vermediğine bakar. Eğer elektrik varsa bir sonraki adım olan bu elektriğin kızıl ötesi vericiye ulaşıp ulaşmadığına bakar. Bir sorun yoksa bir sonraki adım olan kızıl ötesi sinyalinin doğru bir şekilde vericiden çıkıp çıkmadığına bakar. Burada da bir sorun yoksa bir sonraki adım olan televizyondaki kızıl ötesi alıcının bu sinyali doğru bir şekilde alıp almadığına bakar. Burada da bir sorun yoksa bir sonraki adım olan alıcının televizyondaki elektriği kesmeye yarayan devreye elektrik akımı verip vermediğini kontrol eder ve nihayet alıcının elektriği veremediğini görür.Bu durumda bir sonraki adım olan alıcıyı açıp içini incelemeye başlar. Kumandadan değişik tuşlarına basarak çeşitli sinyaller gönderip her devrenin istenildiği gibi çalışıp çalışmadığını inceler.İncelemelerinin sonucunda elektrik olması gereken bir kabloda elektrik olmadığını görür. Kablo yanmıştır. Bu kabloyu yeni bir kablo ile değiştirir. Daha sonra kumandanın kapatma tuşuna basar ve artık problemin çözülmüş olduğunu görür.Tamircinin yaptıklarını özetleyelim:

1.  Kullanıcının söylediği durumun doğru olduğunu test etti.

2.  Sorunun nereden kaynaklanabileceğini tahmin edip, işe oradan başladı.

3.  Kumandanın tuşuna basılmasından başlayarak, adım adım tüm gerçekleşen işlemleri incele-
      di, her şeyin olması gerektiği gibi olduğundan emin oldu.

4.  Hatanın yerini tespit etti.

5.  Orada da adım adım inceleyerek hatayı buldu ve çözdü.

6.  Her şeyin artık olması gerektiği gibi olduğundan emin oldu.    

     Yazılım geliştirmede hata ayıklama bu örneğe çok benzer. Bir mantıksal hata varsa önce bu sorunun nerelerden kaynaklandığı tahmin edilir. Örneğin uygulamanın hesaplama kısmında bir hata varsa muhtemelen ilk olarak hesapla                            düğmesine basıldığı zaman çalışan kodlar incelenmeye başlayacaktır. Koda bakıldığında hatanın sebebini bulmak çok zordur. Bu tip hatalar,  çoğunlukla uygulama çalışırken bulunabilir.  Bu yüzden tam hesaplamanın başladığı yerde uygulama durdurulup, adım adım gerçekleşen işlemlerin takip edilmesi gerekir.Uygulamayı durdurmak ve sonra adım adım ilerletmek amacıyla değişkenlerin ve kontrollerin nasıl çalıştığını incelemek için Visual Studio bize debug araçlarını sunar. 

 



Yorum yaz