Etki alanında veri kalıcılığı katmanına karşı mimari doğrulaması temiz mi?


13

Temiz bir şekilde çalışıyorum ve sonuç olarak, yazılımı nasıl tasarladığım ve yazdığım konusunda büyük ölçüde yeniden düşünüyorum.

Hala güreştiğim bir şeyim var, "bazı öğelere yapılan güncellemeleri kaydetme, ilk yükleme" gibi görüntüleme / düzenleme iznine sahip olduğum öğelerin tüm listesi, bu öğenin listede olduğunu onaylayın, ve öğe kategorisinin şu anda kullanımdan kilitli olmadığından (ve diğer kurallar vb.) ".. çünkü bu (karmaşık ancak atipik olmayan) bir iş kuralıdır ve bu nedenle iş mantığını zorlamak yerine uygulama etki alanında ele alınmalıdır. db / süreklilik katmanı.

Ancak bana öyle görünüyor ki verimli bir şekilde bu koşulları kontrol etmek için en iyi uygulama etki alanına tüm verileri yüklemek yerine, iyi hazırlanmış bir db sorgusu ile ele alınacaktır ...

Erken optimizasyon olmadan, önerilen bir yaklaşım veya bu soru ile ilgili Bob amcası makaleleri nelerdir? Yoksa "bir sorun haline gelene kadar etki alanında doğrulama" derdi ??

En temel kullanım durumlarından başka herhangi bir şey için iyi örnekler / örnekler bulmakta gerçekten zorlanıyorum.

Güncelleme:

Merhabalar, cevaplar için teşekkürler. Daha net olmalıydım, uzun süredir (çoğunlukla web uygulaması) yazılım yazıyordum ve toplu olarak tanımladığınız tüm konuları kesinlikle deneyimledim ve katılıyorum (arka uçla doğrulayın, müşteri verilerine güvenmeyin, genel olarak konuşursak) ham verimliliği sadece gerektiğinde kovalayın, ancak mevcut olduğunda db araçlarının gücünü vb. onaylayın) ve "N-katlı uygulamalar ile dev bir yağ kontrolörü oluşturmak" kod trendlerini geliştirmek için "hepsini bir araya getirin" ve şimdi temiz / tek sorumluluk tarzını vb. gerçekten sevmek ve araştırmak, temel olarak son zamanlarda projeler geliştikçe ve daha fazla müşteri gereksinimleri ortaya çıktıkça oldukça karmaşık ve yaygın olarak dağıtılmış iş kurallarına dönüşen birkaç projenin sonucu olarak.

Özellikle, iş kurallarının çoğunun temelde gördüğünüz her örnekten çok daha karmaşık olabileceği müşteriye yönelik ve dahili kullanım işlevselliği için REST apisleri oluşturma bağlamında Temiz stil mimarisine bakıyorum (Clean / Hex mimarisi adamları tarafından bile).

Bu yüzden gerçekten temiz ve bir REST api birlikte nasıl oturup, bu günlerde gördüğünüz çoğu MVC şeyler gelen istek doğrulayıcıları (örn. .NET FluentValidation kitaplığı) nerede, ama nerede çoğu hakkında soruyordu (ve açıkça belirtmek için başarısız) sanırım "doğrulama" kurallarım çok fazla değil "bu 50 karakterden daha az bir dizedir" ama daha fazla "ilgili kullanıcı nesnesini / etkileşimi çağıran bu kullanıcı, ilgili bazı nesnelerin şu anda Takım X tarafından kilitlendiği göz önüne alındığında bu veri toplama üzerinde bu işlemi gerçekleştirebilir mi? ayın sonlarına kadar vs vs "... iş alanı nesnelerinin ve alan adı kurallarının LOTS'unun geçerli olduğu bu türden derinlemesine doğrulamalar.

Bu kuralları her bir usecase-interaktörüne (FluentValidator projesinden esinlenerek ancak daha fazla iş mantığı ve veri erişimi dahil) eşlik etmek için belirli bir Validator-nesne türüne çevirirsem, doğrulama işlemini bir Ağ Geçidi gibi ele almalı mıyım? Bu doğrulamaları bir ağ geçidine (yanlış olduğunu düşünüyorum) vb.

Başvuru için ben gibi çeşitli makaleleri kapalı gidiyorum bu , ama Mattia çok doğrulama ele almaz.

Ama sanırım sorumun kısa cevabı, kabul ettiğim cevaba çok benziyor: "Asla kolay değil ve duruma bağlı".


2
Genellikle "doğru" olmak ile "pratik" olmak arasında bir fark vardır. Seçim göz önüne alındığında, hangisini tercih edersiniz?
Robert Harvey

"Tüm öğelerin listesini yükle" bir iş kuralı gibi görünmüyor, uygulama ayrıntılarına çok fazla dalmış gibi görünüyor. Bir db sorgusu kullanarak, hiçbir şey yüklemeden kuralı yerine getirebiliyorsanız, kural neden "yükle" diyor?
Monica

Yanıtlar:


32

Veri girişinin onaylanması, herkesin onu saf ve temiz hale getirmeye başladığı ve (bu konuda akıllılarsa) sonunda vazgeçtiği şeylerden biridir, çünkü rekabet eden birçok endişe vardır.

  • Kullanıcı arabirimi katmanı, kullanıcıya gerçek zamanlı geri bildirim sağlamak için istemci sayfasında / formunda bazı doğrulama formları yapmalıdır. Aksi takdirde, kullanıcı ağ üzerinden bir işlem yayınlarken geri bildirim beklemek için çok zaman harcar.

  • İstemci genellikle güvenilir olmayan bir makinede (örneğin, neredeyse tüm web uygulamalarında) çalıştığından, bu doğrulama yordamlarının, kodun güvenilir olduğu sunucu tarafında yeniden yürütülmesi gerekir.

  • Bazı doğrulama biçimleri girdi kısıtlamaları nedeniyle örtüktür; örneğin, bir metin kutusu yalnızca sayısal girişe izin verebilir. Bu, "sayısal mı?" UI kısıtlamaları atlanabileceğinden (örneğin Javascript'i devre dışı bırakarak), bir yerlerde arka uçta birine ihtiyacınız olacaktır.

  • UI katmanı, sistemi enjeksiyon saldırılarına veya diğer kötü amaçlı veri girişi biçimlerine karşı yalıtmak için hizmet çevresinde bazı doğrulama formları (örn. Bir web uygulamasındaki sunucu tarafı kodu) yapmalıdır. Bazen bu doğrulama kod tabanınızda bile olmayabilir, örn. ASP.NET istek doğrulaması .

  • Kullanıcı arabirimi katmanı, yalnızca kullanıcı tarafından girilen verileri iş katmanının anlayabileceği bir biçime dönüştürmek için bazı doğrulama biçimleri yapmalıdır; örneğin, "6/26/2017" dizesini uygun saat dilimindeki DateTime nesnesine dönüştürmelidir.

  • İş katmanı çoğu doğrulama biçimini yapmalıdır, çünkü hey, iş katmanına, teoride aittirler.

  • Bazı doğrulama biçimleri, özellikle referans bütünlük denetimleri gerektiğinde (örn. Bir durum kodunun 50 geçerli durum listesinde olmasını sağlamak için) veritabanı katmanında daha etkilidir.

  • Eşzamanlılık endişeleri nedeniyle bazı doğrulama biçimleri bir veritabanı işlemi bağlamında gerçekleşmelidir, örn. Benzersiz bir kullanıcı adı ayırmak atomik olmalıdır, bu nedenle bazı kullanıcılar işlem yaparken yakalamaz.

  • Bazı doğrulama biçimleri yalnızca üçüncü taraf hizmetleri tarafından gerçekleştirilebilir; örneğin, posta kodunun ve şehir adının bir araya getirildiğini doğrularken.

  • Sistem genelinde, kod kusurlarının varlığında makul hata modları sağlamak için birden çok katmanda boş denetimler ve veri dönüştürme denetimleri oluşabilir.

Bazı geliştiricilerin iş katmanındaki tüm doğrulama kurallarını kodlamaya çalıştıklarını gördüm ve daha sonra diğer katmanların iş kurallarını ayıklamak ve farklı bir katmandaki doğrulamayı yeniden yapılandırmak için çağırmasını sağladım. Teoride bu harika olurdu çünkü tek bir hakikat kaynağı elde edersiniz. Ancak, bu yaklaşımın çözümü gereksiz yere karmaşıklaştırmaktan başka bir şey yaptığını hiç görmedim ve genellikle çok kötü bitiyor.

Bu nedenle, doğrulama kodunuzun nereye gittiğini anlamaya çalışırken kendinizi öldürüyorsanız, orta derecede karmaşık bir soruna bile pratik bir çözümde tavsiye olun, doğrulama kodu birkaç yerde sona erecektir.


Kullanıcı arayüzünün tüm kullanıcıların geri bildirimlerini yönettiğini düşünüyorsanız, doğrulama denetiminin çoğunu veritabanında zorlayabilir ve yalnızca yapamayacağınızı iş katmanında tutabilirsiniz. Çok ayrıntılı bir mesaj sorunlarını gideren tam bir arka uç API'si tasarlarsanız sorun ortaya çıkar.
Walfrat

2

Doğrulama, iş katmanının bir parçasıdır.

Mesele şu ki: DAO'lardaki iş mantığı, DAO kavramını geçersiz kılacaktır. Daha yüksek bir katmanda doğrulama yapmak, başka bir kullanıcı tabanından ticari işlemleri çağırırsanız gereksiz doğrulama ile sonuçlanır.

Belki kullanıcı arayüzünde bir miktar güvenlik değerlendiriyorsunuz. Ancak, güvenli etki alanı nesneleri önemli işi yapacakları için bu isteğe bağlıdır. Kullanıcı arayüzünde, oturum açmış olan kullanıcının sahip olduğu izinlere bağlı olarak Bileşenler görünür veya görünmez olur. Ancak bu kullanıcı deneyiminin sadece bir parçasıdır. Kullanıcının, izin verilmeyen bir eylemi gerçekleştirmeye çalıştığı her seferinde güvenlik istisnalarına girmesini istemezsiniz.


2

Doğrulama karşısında kimin ne yaptığını görmek için bakış açınızı kontrol etmek isteyebilirsiniz. DB ile çalıştığınızı bildiğiniz DB mi? Yoksa bir hizmet mi (DB operasyonları tarafından desteklenip kontrol ediliyor). Projemde her toplama kökü onu okuyabilen grupların bir listesi ve değiştiricilerin bir listesi var. Kod, kullanıcının görebileceği belirli bir kök veya köklerin listesini aradığında, tüm ayrıntılar, kullanıcı kimliğini alan bir hizmetin ve kutucuğun “blah” ile başladığı yer gibi arama bağlamının ekstra bölümlerinin arkasına gizlenir. Kod, DB'nin kullanıcı gruplarının okuyucu gruplarında var olup olmadığını görmek için var olan bir denetim gerçekleştirmesini umursamıyor. Yalnızca, yalnızca sözleşme ile tanımlanan hizmetin ne sağladığına bağlı olarak, içeriği olan veya olmayan bir liste bekler.

Bu, tüm katmanlar için geçerlidir. Doğrulamanın tekdüzeliği anahtardır. Doğrulamanızın çoğunu mümkün olduğunca alana koyun. API'nizle ilgili kısıtlamaları iade edin. Ben sonum X kütüphanesinden veya Z depolamadan değil, hizmetten gelen kısıtlamaları düşünmüyorum.


0

Bazı doğrulama mantığı en basit ve en açık şekilde bir veritabanı sorgusu şeklinde ifade edilirse, devam edin, cevabınız var. Ancak verimlilik , yalnızca bilinen bir performans sorununuz varsa endişe kaynağı olmalıdır, aksi takdirde erken optimizasyondur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.