Bir posta kodunun kullanıldığı her yerde doğrulama mantığını koyarak DRY prensibini bozuyordunuz.
Öte yandan, birçok farklı ülke ve farklı posta kodu sistemleriyle uğraşırken, söz konusu ülkeyi tanımadığınız sürece posta kodunu doğrulayamazsınız. Bu yüzden ZipCode
sınıfınızın ülkeyi de saklaması gerekiyor.
Ancak, ülkeyi Address
(posta kodunun da bir parçası olan) hem de posta kodunun bir parçası olarak (doğrulama için) ayrı ayrı saklıyor musunuz?
- Bunu yaparsanız, DRY'yi de ihlal ediyorsunuz. Bunu DRY ihlali olarak adlandırmasanız bile (çünkü her bir örnek farklı bir amaca hizmet ediyor), yine de iki ülke değeri farklı olduğunda (yani mantıksal olarak asla ) olabilir.
- Veya, alternatif olarak, her zaman aynı olduklarından emin olmak için iki veri noktasını senkronize etmeniz gerekmekte, bu da verileri gerçekten tek bir noktada saklamanız gerektiğini, bu nedenle amacı yitirmenizi önermektedir.
- Siz yapmazsanız, o zaman bir
ZipCode
sınıf değil, bir Address
sınıf olacaktır string ZipCode
.
Örneğin, bir iş analisti ile posta kodu içeren bir dize yerine Posta Kodu hakkında konuşabilirim.
Bunun yararı, etki alanı modelini tarif ederken onlar hakkında konuşabilmenizdir.
Temelde, bir bilgi parçasının belirli bir değişken tipine sahip olduğu zaman, bir iş analistiyle konuşurken her nasılsa o tipten bahsetmek zorunda olduğunuz iddiasını anlamıyorum.
Niye ya? Neden sadece "posta kodu" hakkında konuşamıyor ve belirli bir türü tamamen atlıyorsunuz? Mülkiyetin türünün konuşmaya özelleştiği iş yerinde (teknik değil!) Analistle ne tür tartışmalar yapıyorsunuz?
Ben nereliyim, posta kodları her zaman sayısaldır. Yani bir seçeneğimiz var, onu bir int
veya bir olarak depolayabiliriz string
. Bir dize kullanma eğilimindeyiz, çünkü verilerde matematiksel işlem beklentisi yoktur, ancak hiçbir zaman bir iş analisti bana bunun bir dize olması gerektiğini söylemedi. Bu karar geliştiriciye bırakılmıştır (veya tartışmaya göre teknik analist olsa da, benim deneyimime göre nitty kumlu ile doğrudan ilgilenmiyorlar).
Bir iş analisti, uygulama yapması beklenenleri yaptığı sürece veri türünü önemsemez.
Doğrulama başa çıkması zor bir hayvandır, çünkü insanların beklentilerine dayanır.
Birincisi, ilkel takıntının neden önlenebileceğini göstermenin bir yolu olarak doğrulama argümanına katılmıyorum, çünkü (evrensel bir gerçek olarak) verilerin her zaman her zaman doğrulanması gerektiğine katılıyorum.
Örneğin, eğer bu daha karmaşık bir arama ise? Basit bir format kontrolü yerine, doğrulamanız harici bir API ile iletişim kurmayı ve cevap beklemeyi gerektiriyorsa ne olur? Uygulamanızı, ZipCode
başlattığınız her nesne için bu harici API'yi çağırması için gerçekten zorlamak istiyor musunuz ?
Belki de sıkı bir iş gereksinimi ve sonra elbette haklı. Ancak bu evrensel bir gerçek değil. Bunun bir çözümden çok daha fazla yük olduğu birçok kullanım durumu olacaktır.
İkinci bir örnek olarak, adresinizi bir forma girerken posta kodunuzu ülkenizden önce girmek yaygındır. Kullanıcı arabiriminde anında doğrulama geri bildirimine sahip olmak güzel olsa da, uygulama beni "yanlış" bir posta kodu biçiminde uyardıysa (kullanıcı olarak) bu benim için bir engeldir, çünkü sorunun asıl kaynağı (örn.) ülkem varsayılan olarak seçilen ülke değil ve bu nedenle yanlış ülke için doğrulama gerçekleşti.
Kullanıcıyı rahatsız eden ve gereksiz karışıklığa neden olan yanlış hata mesajıdır.
Nasıl sürekli onaylamanın evrensel bir gerçek olmadığı gibi, benim de örneklerim. Bu var içeriksel . Bazı uygulama alanları, her şeyden önce veri doğrulaması gerektirir. Diğer alanlar, öncelikler listesinde yüksek olan bir doğrulama yapmaz; çünkü beraberinde getirdiği güçlük, asıl öncelikleriyle çakışır (örneğin, kullanıcı deneyimi veya başlangıçta hatalı verileri kaydetme yeteneği; saklanmış)
Doğum Tarihi: Kontrol tarihinden önce ve bugünün tarihinden daha az olup olmadığını kontrol edin.
Maaş: Sıfıra eşit veya daha büyük olduğunu kontrol edin.
Bu doğrulamalarla ilgili sorun eksik, fazla veya çok daha büyük bir sorunun göstergesidir .
Bir tarihin, randevundan daha büyük olduğunu kontrol etmek gereksiz. Bakan, tam anlamıyla mümkün olan en küçük tarih olduğu anlamına gelir. Ayrıca, alaka düzeyini nerede çiziyorsun? Engellemenin DateTime.MinDate
ancak izin vermenin amacı nedir DateTime.MinDate.AddSeconds(1)
? Diğer birçok değere kıyasla özellikle yanlış olmayan belirli bir değeri şifreliyorsunuz.
Doğum günüm 2 Ocak 1978 (öyle değil, ama farz edelim ki). Ancak uygulamanızdaki verilerin yanlış olduğunu ve bunun yerine doğum günümün geçerli olduğunu söyleyelim:
- 1 Ocak 1978
- 1 Ocak 1722
- 1 Ocak 2355
Bu tarihlerin hepsi yanlış. Hiçbiri diğerinden daha "doğru" değil. Ancak validasyon kuralınız bu üç örnekten sadece birini yakalar .
Bu verileri nasıl kullandığınızın içeriğini de tamamen göz ardı ettiniz. Bu, örneğin bir doğumgünü hatırlatıcısı botunda kullanılıyorsa, doğrulamanın doldurulmasının belirli bir kötü sonucu olmadığından, onaylamanın anlamsız olduğunu söyleyebilirim.
Öte yandan, eğer bu bir devlet verisi ise ve bir kişinin kimliğini doğrulamak için doğum tarihine ihtiyacınız varsa (ve bunu yapmamanız kötü sonuçlara yol açar, örneğin birinin sosyal güvenliğini reddetmek), o zaman verilerin doğruluğu çok önemlidir ve tamamen veriyi doğrula Şu anda sahip olduğunuz önerilen doğrulama yeterli değil.
Maaş için, olumsuz olamayacağına dair bazı sağduyular vardır. Fakat gerçekçi olmayan saçma verilerin girilmesini bekliyorsanız, bu saçma verinin kaynağını araştırmanızı öneririm. Çünkü, duygusal veri girmek için güvenilmezlerse, doğru verileri girmeleri için onlara güvenemezsiniz .
Bunun yerine maaş, başvurunuz tarafından hesaplanırsa ve bir şekilde, negatif (ve doğru) bir sayı ile Math.Max(myValue, 0)
sonuçlanabilirse, doğrulama başarısız olmak yerine, negatif sayıları 0'a çevirmek daha iyi bir yaklaşım olacaktır . Çünkü mantığınız sonucun negatif bir sayı olduğuna karar verdiyse, onaylamanın başarısız olması, hesaplamayı tekrar yapmak zorunda kalacağı anlamına gelir ve ikinci kez farklı bir sayı ile geleceğini düşünmek için hiçbir neden yoktur.
Ve eğer farklı bir rakamla gelirse, bu yine hesaplamanın tutarlı olmadığını ve bu nedenle güvenilir olamayacağından şüphelenmenizi sağlar.
Bu, onaylamanın faydalı olmadığını söylemek değildir. Fakat anlamsız doğrulama kötüdür, çünkü hem bir sorunu çözmemek hem de insanlara yanlış bir güvenlik hissi vermek için çaba harcar.