- Konu sahibi
- #1
Ruby’de sık yapılan hataları önlemek için önce verinin türünü ve olası boş değerlerini belirleyin, ardından koşulların ve koleksiyon işlemlerinin beklediğiniz sonucu üretip üretmediğini küçük testlerle doğrulayın. Özellikle
Ruby’de koşul içinde yalnızca
Benzer biçimde
İki tamsayının bölünmesi her zaman ondalıklı bir sonuç üretmez:
Bir diziyi dönüştürürken
Aşağıdaki varsayımsal örnek, kullanıcıdan gelen puan metnini doğrular ve geçerli puanların ortalamasını hesaplar.
Terminalde dosyanın bulunduğu dizinde
Değişiklik yaptıktan sonra normal girdinin yanında boş listeyi,
nil ile false ayrımına, tamsayı bölmesine ve hata yakalarken asıl sorunu gizlememeye dikkat edin.Koşullarda değerleri doğru yorumlayın
Ruby’de koşul içinde yalnızca
nil ve false yanlış kabul edilir. Örneğin 0, boş metin ve boş dizi doğru kabul edilir. Bu nedenle if ad koşulu, adın boş bir metin olmadığını kanıtlamaz. Boş metni de reddetmeniz gerekiyorsa bunu ayrıca sınayın; yalnızca boşluk içeren metnin de geçersiz sayılmasını istiyorsanız önce strip ile kenar boşluklarını temizleyin.Benzer biçimde
deger || varsayilan ifadesi, değer nil veya false olduğunda varsayılanı kullanır. false geçerli bir ayarsa, onu korumak için yalnızca nil durumunu ayrı kontrol edin.&. güvenli çağrı operatörü, alıcı nil olduğunda metodu çağırmadan nil döndürür. Ancak yanlış türde bir nesnenin ilgili metoda sahip olmaması gibi diğer hataları çözmez. Ayrıca zorunlu bir değerin eksikliğini sessizce saklamak yerine, gerektiğinde eksikliği açıkça bildirmek daha uygundur.Dönüşümleri ve koleksiyon sonuçlarını sınayın
İki tamsayının bölünmesi her zaman ondalıklı bir sonuç üretmez:
5 / 2 sonucu 2 olur. Ondalıklı sonuç gerekiyorsa işleme uygun biçimde en az bir değeri dönüştürün; örneğin 5.to_f / 2 sonucu 2.5 verir. Para hesaplarında ise kayan noktalı sayıların hassasiyet sınırlarını dikkate alın; gereksinime göre kuruş gibi en küçük birimi tamsayıyla tutmayı veya uygun bir ondalık gösterimi kullanmayı değerlendirin.Bir diziyi dönüştürürken
each ile map arasındaki farkı gözetin. each elemanlar üzerinde işlem yapar ve özgün diziyi döndürür; map ise bloktan dönen değerlerle yeni bir dizi oluşturur. Yeni değerleri saklamak istiyorsanız map sonucunu bir değişkene atayın. Her iki durumda da blok içinde ayrıca değişiklik yapan bir işlem kullanıp kullanmadığınızı kontrol edin.Aşağıdaki varsayımsal örnek, kullanıcıdan gelen puan metnini doğrular ve geçerli puanların ortalamasını hesaplar.
puanlar.rb adlı dosyaya kaydedin:
Ruby:
def ortalama(girdiler)
puanlar = girdiler.map do |girdi|
Integer(girdi, 10)
rescue ArgumentError, TypeError
raise ArgumentError, "Geçersiz puan: #{girdi.inspect}"
end
return nil if puanlar.empty?
puanlar.sum.to_f / puanlar.length
end
p ortalama(["5", "2"])
p ortalama([])
Terminalde dosyanın bulunduğu dizinde
ruby puanlar.rb çalıştırıldığında sırasıyla 3.5 ve nil görülmesi beklenir. İlk sonuç ondalıklı ortalamadır; ikincisi, boş listede hesaplanacak ortalama olmadığını gösterir. "iki" gibi geçersiz bir metin verilirse yöntem hata üretir. Bu örnek puanların yalnızca tamsayı olduğunu varsayar; izin verilen puan aralığını ayrıca doğrulamaz.Hataları gizlemeyin, sınırları test edin
rescue kullanırken yalnızca işlem için beklenen hataları ve onları nasıl ele alacağınızı belirleyin. Her hatayı yakalayıp sessizce nil döndürmek, geçersiz girdiyi ve programlama hatalarını aynı sonuç gibi gösterebilir. Yukarıdaki örnek dönüşüm hatasını açıklayıcı bir hataya çevirir; çağıran kod bu hatayı kullanıcıya uygun biçimde gösterebilir. Hatanın ayrıntılarını kaydederken parola, erişim belirteci veya kişisel veri içeren girdileri kayda yazmayın.Değişiklik yaptıktan sonra normal girdinin yanında boş listeyi,
nil değerini, geçersiz metni ve iş kuralları açısından sınır değerlerini de deneyin. Bir testin geçmesi yalnızca sınanan durumun beklenen sonucu verdiğini gösterir; tüm girdilerin doğru işlendiğini kanıtlamaz. Beklenmeyen sonuçta önce girdinin türünü ve ilgili metodun döndürdüğü değeri kontrol edin; tanılama için eklediğiniz geçici çıktıları işiniz bitince kaldırın.