Takilmasinda sakinca yok, fakat sebebini aciklayamiyorsa cargo cult mensubudur, baska yerden duydugu seyi tekrarliyordur. Senior’lugu sadece isimde olabilir.
Normalde kodun yaptigi varsayimlari belgelemek, dogru olmasini bekledigimiz ama %100 emin olmadigimiz seyleri ozel durumlarda (mesela sistem patladiginda) kontrol etmek icin kullanilir. Surada da bir benzerini yazmisim: Assert deyimi nasıl kullanılır? - aib tarafından #9
Kullanim amaci ve sekli, her alet gibi, kullanana bakar. Mesela release edilecek versiyonlar once assert’ler acik release edilip, bir sure hic bir assertion error olusmuyorsa assert’ler kapali release edilebilir. Veya normalde kapali tutulup sorun cikinca acilabilir (detayli, “trace” log seviyeleri gibi).
Python dokumentasyonu da benzer bir sey soylemis. Ama “production’da kullanmamak” nedir? Onu, yukaridaki ornegi aciklarken yazacagim:
Fonksiyonun nasil kullanildigini goremiyoruz, ama kullanici girdisini dogrulayan bir kod olarak dusunelim. O zaman assertion yanlis hamle. Kullanicinin her zaman dogru degeri girmesini beklemiyoruz; validasyon fonksiyonunun var olma sebebi bu zaten. ValidationError
throw etmek veya False
veya hata stringi dondurmek gibi, validasyon sistemi tarafindan tanimlanmis bir hareket yapmak lazim.
v
’yi kullanan duz bir fonksiyon oldugunu dusunelim. Kullanici burada programci; yanlis deger vermesini bekleyebilir miyiz? Elbette; bu Python. Yine de fonksiyonun normal kullanimi dahilinde beklenen bir durum degil, istisnai bir durum. O zaman TypeError
, ValueError
, IllegalArgumentException
(Java) veya ArgumentException
(C#) gibi bir exception throw etmemiz lazim.
Peki nasil bir durumda assertion kullanmak dogru olurdu?
Mesela v
’nin 1
, 2
veya 3
oldugu kodda baska bir mekanizma tarafindan kontrol ediliyor olsaydi, normal kullanim ve hatta normal yazilim gelistirme surecinde bile baska bir deger beklemezdik. Yine de, baska bir deger oldugunda sacma sapan bir seyler yapacak olsak, veya yapmak uzere oldugumuz seyler kolayca anlasilmayacak, bulunmayacak tuhafliklara yol acacak olsaydi assertion kullanmak isteyebilirdik.
Bakayim, ben nerelerde kullanmisim:
- Capture edilen USB paketi parse edilirken; header’daki data size’in data’nin size’ina esit olmasi
- Isik konfigurasyon dosyasinda*; tup ayari tutan array’in boyutu tup sayisina esit, DMX evren numarasi evren sayisindan kucuk, adresi adres menzilinde.
- Birkac kullanimlik test script’inde; if dev is not None: print(“Unable to find device”) yerine.
None
’i dogrudan kullaninca cikan hata kod hatasina benziyor; aleti takmayi unuttuysam erken hata versin. - USB cihazdan gelen yanita bakarken; “cevap kodu” olarak belledigim 0xcb yerine baska bir sey gelirse. (Iki script ayni anda calisirsa birinin cevabi digerine gidebilir mesela. Veya belki cevap kodu sabit degildir, birkac biti bir ayara baglidir.)
En guzel ornek ilki sanirim.