Bir zamanların efsane çizgi dizisidir Pokemon. 2000’lerin başında tüm dünyada popüler olmuş, pek çok çocuğun hayal dünyasında yer etmişti. Geçtiğimiz yıllarda ise Pokemon GO oyunuyla yeniden gündeme gelmiş ve tüm dünyada adeta çılgınca oynanmıştı. İnsanlar ellerinde telefonlarla sokak sokak Pokemon yakalamaya çalıştı uzun süre. Mobil cihazlar ve bilgisayarların hareketsizliğe alıştırdığı bir zamanda, insanların Pokemon GO sayesinde sokaklara çıkması, yürümeyi teşvik etmesi de oyuna gelen olumlu yorumlardandı. Tüm dünyada bir döneme damgasını vuran, kıyafetleri, oyuncakları, çıkartmaları yapılan Pokemon, Japonca’da “cep canavarları” anlamına gelen “Poketto Monsuta” ifadesinin kısaltılmış halidir aslında. Çizgi filmdeki karakterlerin amacı ise bulunabilecek tüm Pokemon’ları yakalayıp Pokedex’i tamamlamak ve en güçlü Pokemon eğitmeni olmaktır.
Peki tüm bunların yazılımla ne ilgisi var? Yazılım geliştirmenin önemli konularından biri de kuşkusuz hata ve istisna yönetimidir (error and exception handling). Yaşanabilecek olumsuzlukları önceden öngörüp gerekli önlemleri almak yazılım geliştiricilerin sorumluluklarındandır.
İstisna yönetiminde genel istisna (generic exception) kullanarak her istisnayı yakalamaya çalışmak Pokemon Yakalama (Pokemon Catching) olarak da tanımlanıyor. Yaygın kanaate göre ve en iyi uygulama (best practice) bakımından genel istisna (generic exception) kullanıp her türlü hata ve istisnanın aynı şekilde yakalanması istenmeyen bir durum aslında. Kod analizi yapan pek çok araç da bu tür kullanımlar için kod kalitesine eksi puan yazıyor. Bazı özel şartlar dışında her istisnanın ayrı ayrı yakalanması ve yönetilmesi öneriliyor.
Bu noktada hata ve istisnanın farkına da kısaca değinmek gerekebilir;
Hata, kullanıcı beklenmeyen bir işlem gerçekleştirdiğinde ortaya çıkan kritik bir durumdur. Genellikle düzeltilemeyen sistem düzeyindeki sorunları ifade eder.
İstisna ise programın yürütülmesi sırasında meydana gelen ve normal akışı bozan bir olaydır. Genellikle geliştirici tarafından yakalanıp yönetilebilen uygulama düzeyindeki anormalliklerdir.
Konuya tekrar dönecek olursak Pokemon yakalama için söylenebilecek tek artı, kod karmaşıklığını azaltmasıdır denebilir.
Örneğin ArgumentNullException, WebException, InvalidCastException, OutOfMemoryException, DivideByZeroException olmak üzere yakalanması gereken beş istisna olsun, bu durumda bunları yakalamak için önümüzde iki seçenek vardır:
try {
// do something
} catch(ArgumentNullException e) {
…
} catch(WebException e) {
…
} catch(InvalidCastException e) {
…
} catch(OutOfMemoryException e) {
…
} catch(DivideByZeroException e) {
}
ya da
try {
…
} catch(Exception e) {
…
}
Şüphesiz ikinci seçenekte yazması son derece kolay bir kod parçası görüyoruz. Pokemon yakalamanın bunun dışında bir artısı bildiğim kadarıyla yok.
Özellikle büyük ölçekli yazılımlarda, on binlerce satırlık kodların olduğu durumlarda karmaşıklıktan uzak sade ve okunabilir bir kod son derece önemlidir. Bu açıdan bakıldığında Temiz Kod (Clean Code) yaklaşımı gereği ikinci seçenek daha tercih edilebilir gibi görünebilir. Fakat burada durum biraz farklıdır. Temiz kod pahasına güvenlikten ödün verilemez. Zira Pokemon yakalama metoduyla tüm istisna türleri yakalandığında güvenlik zafiyetlerine, kontrol edilemeyen hatalara yol açabilmektedir.
Pokemon yakalama yoluyla genel istisna kullanımı The Common Weakness Enumeration (CWE) listesine 397 numarasıyla alınmıştır ve kullanımı önerilmez. Bu liste, kar amacı gütmeyen, mühendislik ve teknik rehberlik amacıyla oluşturulmuş Amerika merkezli bir kuruluş olan Mitre tarafından yönetilir. Yazılım güvenlik açıkları düzenli olarak tespit edilip yıllık olarak duyurulur ve CWE listesi güncellenir. Söz konusu liste yazılım kalitesini ölçümleyen sistemlerin önemli referans noktalarından biridir. Bu açıdan yazdığımız kodların güvenliğinden ödün vermek istemiyorsak Pokemon yakalama kullanımından mümkün olduğunca kaçınmakta, her istisnayı sorgusuz sualsiz yakalamaya çalışmamakta fayda var.
Pokemon yaklaşımının tam karşısında ise Yoda yaklaşımı yer alır. Star Wars’ın bilge karakteri Yoda’nın “do or do not there is no try” sözünden hareketle kodunuzda try-catch bloklarına yer yoktur.
Ebette yazılım dillerinin izin verdiği imkanları yerli yerinde kullandığımız sürece bir sakınca yok, dikkat edilmesi gereken nokta ne yapıyorsak yapalım, bilerek yapalım, farkında olarak yapalım. Pokemon yakalamak istiyorsak da Yoda’nın felsefesine kulak vermek istiyorsak da nedenlerini ortaya koyarak, sonuçlarını bilerek hareket ettiğimiz sürece kodumuzun kalitesinden ödün vermemiş oluruz.
Kaynaklar
- https://cwe.mitre.org/data/definitions/397 [Erişim tarihi: 25.09.2023]
- https://samate.nist.gov/SSATTM_Content/papers/Seven%20Pernicious%20Kingdoms%20-%20Taxonomy%20of%20Sw%20Security%20Errors%20-%20Tsipenyuk%20-%20Chess%20-%20McGraw.pdf [Erişim Tarihi: 22.09.2023]
- https://www.infoworld.com/article/2073800/beware-the-dangers-of-generic-exceptions.html [Erişim Tarihi: 22.09.2023]
- https://doc.casthighlight.com/alt_genericcatches-avoid-generic-catch/#:~:text=In%20almost%20all%20cases%2C%20it’s,in%20app%2Dlevel%20error%20handling. [Erişim Tarihi: 29.09.2023]
- https://softwareengineering.stackexchange.com/questions/164256/is-catching-general-exceptions-really-a-bad-thing [Erişim Tarihi: 29.09.2023]
- https://everything2.com/title/Yoda+Exception+Handling [Erişim Tarihi: 29.09.2023]
- https://www.siberguvenlik.web.tr/index.php/2022/05/30/mitre-attck-framework-nedir/ [Erişim Tarihi: 30.09.2023]