Yazar: CTO - Zafer GÜREL
Bir yazılımcı arkadaşımla beraber, yazdığı kodları gözden geçiriyorduk.
Üzerinde durduğumuz noktalardan biri, bir formdaki alana girilebilecek bir değerin doğrulanmasıydı. Seçeneklerimizi değerlendirme sürecini bu yazıda paylaşmak istiyorum.
İki kuralımız vardı ilgili değer için:
Pozitif tamsayı olmalı.
Bir ayda olabilecek en fazla saat sayısını (31x24=744) aşamaz.
Doğrulamayı iki şekilde yapabileceğimizi düşündük.
Bu arada; bu kontrol, hem istemci hem de sunucu tarafında yapılsa da sadece istemci tarafında Javascript ile nasıl yapıldığını paylaşacağım. Bu vesileyle form alanlarına girilen değerlerin sunucu tarafında da kontrol edilmesi gerektiğini belirtelim.
1. Sadece Düzenli İfade (regular expression) ile Doğrulama
Aşağıdaki gibi bir düzenli ifade yazdık:
const re=/^0*((74[0–4])|(7[0–3]\d)|([0–6]?\d{1,2}))$/;
Bu kodu aşağıdaki ufak kod ile test ettik ve çalıştığını doğruladık.
const test_data = ["749", "0", "9", "15", "99", "105", "543", "699", "600", "-1", "00744", "yazi", "a12"];
test_data.forEach(n => console.log(n + " " + re.test(n)));
Not: Bu kodları, tarayıcınızın geliştirici araçlarındaki konsolda deneyebilirsiniz.
2. parseInt ve Düzenli İfade Karışımı
Javascript’te bir String nesnesini sayıya çeviren bir metot var: parseInt.
Bu metodu kullanarak da aşağıdaki çözümü geliştirdik:
const validator = n => (/^\d+$/.test(n) && parseInt(n) <= 744 && parseInt(n) > 0);
Test etmek için de yine test_data’dan faydalanıyoruz:
test_data.forEach(n => console.log(n + " " + validator(n)));
İki yöntemi karşılaştırabilmek için aşağıdaki kodu kullanabiliriz:
// test verisi
const test_data = ["749", "0", "9", "15", "99", "105", "543", "699", "600", "-1", "00744", "yazi", "a12"];// kullanacagimiz duzenli ifade
// ^ kelime başını, $ kelime sonunu ifade eder.
// Daha fazla bilgi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressionsconst re=/^0*((74[0–4])|(7[0–3]\d)|([0–6]?\d{1,2}))$/;// validatorler
const validator_re = n => re.test(n);
const validator_parseInt = n => (/^\d+$/.test(n) && parseInt(n) <= 744 && parseInt(n) > 0);// testi başlatalım
console.log("Sayı\tparse\tregexp");
test_data.forEach(n => console.log(n + "\t" + validator_parseInt (n) + "\t" + validator_parseInt(n)));
Sonuç olarak iki metodun da eşit sonuçları verdiğinden emin olduk.
Hangi Yöntemi Seçmeli?
Ama hangisini kullanmak daha iyi olur?
İkinci yöntemin (parseInt) daha iyi olduğuna karar verdik. Bunun sebebi, ikinci yöntem için yazdığımız kod çok daha okunaklı.
Düzenli ifadeler, öğrenilmesinin çok fayda sağlayacağını düşündüğüm çok güçlü bir araç ancak ifade kompleksleşmeye başlayınca yazılan ifadenin anlaşılabilirliği ve bakımı (kapsamadığı durumlarda ifadeye ek yapmak gibi) zorlaşıyor.
6 ay sonra aynı koda dönen yazılımcının kendi yazdığı kodun inceliklerini hatırlamakta zorluk çektiği gerçeğinden yola çıkarsak önceliklerimizden biri okunabilirlik. Seçenekleri değerlendirirken performans ve güvenlik anlamında bir endişemiz olmadığı için kazanan ikinci yöntem oldu.
Bu yazımda düşünce pratiğimizi paylaşmaya çalıştım. Umarım faydalı olmuştur.
Comments