Uygulama hizmet katmanı veritabanı işlevlerini çağırıyor. Kötü mimari mi?


11

Senaryo:

  • Yığın: Java, Bahar, Hazırda Bekletme.
  • Model: İstemci-Sunucu Uygulaması.
  • Desen: Model-Görünüm-Denetleyici (MVC).

Hizmet Katmanı sınıflarının üç davranışı vardır:

  1. Bazı hizmetler, iş kuralı yöntemlerine sahiptir ve kalıcılığı uygulamaya devreder. Sevmek:

    EntityManager.save (entity);

  2. Bazı hizmetler bir veritabanı işlevini çağırır (parametreleri iletir)

    CallableStatement cls = con.prepareCall ("{call databaseFunction (args)}");

  3. Bazı hizmetlerin her iki davranışı da içeren yöntemleri vardır .

Sorularım:

  1. Uygulama hizmetlerinin doğrudan veritabanı işlevlerini çağırmasında herhangi bir sorun var mı? Bu kötü uygulama olarak görülmüyor mu? Böyle bir projeye uygulanabilir bir mimari model ne olurdu?
  2. Aynı hizmette davranış karması oluşturmada herhangi bir sorun var mı? İşlemler ve tutarlılık gibi?
  3. Bakım durumunda, bu kapsülleme geliştiriciye veritabanındaki işlevleri de değiştirmesi gerektiğini belirsizleştiriyor mu? Bundan nasıl kaçınılır?
  4. Bu senaryo dünyadaki diğer uygulamalarda mı meydana geliyor yoksa sadece mimari bir hata mıydı?

Bu soru benzer ama tam olarak aynı değil .. softwareengineering.stackexchange.com/questions/180012/…
Jon Raynor

Yanıtlar:


7

Uygulama hizmetlerinin doğrudan veritabanı işlevlerini çağırmasında herhangi bir sorun var mı? Bu kötü uygulama olarak görülmüyor mu?

Bence orada. Uygulama hizmetine veritabanı iç bilgileri hakkında bilgi veriyorsunuz. Hiçbir şekilde veritabanı değiştirme (saklama motorunu değiştirme veya hatta bir alan yeniden adlandırma veya dizini oluşturma) uygulama hizmeti değiştirmenizi gerektirebilir ve bu ihlal SRP .

Böyle bir projeye uygulanabilir bir mimari model ne olurdu?

Aşağıdaki açıklamaya bakınız.

Aynı hizmette davranış karması oluşturmada herhangi bir sorun var mı? İşlemler ve tutarlılık gibi?

Teknik bir sorun olduğuna inanmıyorum, ama mantıklı bir sorun var. Uygulamadaki iki yaklaşımı karıştırmanız, belirsiz, daha az yapılandırılmış, değişikliklere uyum sağlamasını zorlaştırıyor. SRP'yi ihlal etme hakkındaki yukarıdaki yorumlara da bakın.

Bakım durumunda, bu kapsülleme geliştiriciye veritabanındaki işlevleri de değiştirmesi gerektiğini belirsizleştiriyor mu?

Elbette öyle.

Bundan nasıl kaçınılır?

Veritabanıyla doğrudan ayrı bir soyutlama düzeyine çalışan yöntemler ve işlevler yerleştirin (bir DAO katmanı veya basit bir havuz deseni olsun - uygulamanızın karmaşıklığına bağlıdır)

Bu senaryo dünyadaki diğer uygulamalarda mı meydana geliyor yoksa sadece mimari bir hata mıydı?

Bence dünyamızda her şey olur;)


Doğru anlarsam, işlevlerde / depolanmış proc'larda ve ayrıca bir ORM aracılığıyla güncellemeler oluyorsa, belirli bir işlemin durumlarının gerekçelendirilmesi çok zor olduğundan teknik bir sorun olabilir. Uygulama şu anki durumunda çalışabilse de, küçük bir değişiklik bazı gerçekten büyük sorunlara dönüşebilir. Hibernate ile yaşadığım deneyim, birlikte çalıştığı tüm tabloları yönetmesine izin vermezseniz, çok fazla can sıkıcı sorununuz olacak.
JimmyJames

güzel ve özlü cevap. SRP ilk koda baktığımda aklıma gelen ilk şeydi. Bazı iş arkadaşları, yöntemin yalnızca veritabanı işlevini çağırması nedeniyle SRP'yi ihlal etmediğini söylüyor. Ancak bu işlevlerden bazıları seçer, ekler ve günceller. Yani SRP'yi ihlal ediyor mu yoksa ihlal etmiyor mu? (belki de bu ayrı ayrı tartışmak için başka bir soru?)
linuxunil

1
Bu çizgi için +1 sanırım dünyamızda her şey olur;)
linuxunil

@linuxunil SRP'ye mimarinin tüm seviyelerinde saygı gösterilmelidir. Benim durumumda yöntem düzeyinde değil, hizmet düzeyinde SRP demek istedim. @ JimmyJames Yep. ORM'lerin çoğu saklı yordamlarla iyi çalışmaz. Ancak bazen depolanmış süreçler gereklidir.
Vladislav Rastrusny

3

Söylediklerinize göre bir hizmet katmanı var, bu yüzden uygun görünen mimari desen Katmanlı Mimari. Daha fazla referans

Evet, veri erişim katmanı dışında doğrudan veritabanı çağrıları yapmak genellikle kötü bir uygulamadır, bu şekilde iş katmanı yalnızca veritabanının bir soyutlamasına erişir.

Karıştırma davranışlarına gelince, DAO kalıbı veya Depo kalıbı olarak bir tasarım kalıbı kullanmak, sorumlulukların bu kodu geliştirerek temsil edilmesine yardımcı olabilir.

Bir tasarım deseni ve ORM kullanmanın avantajlarından bazıları, kodunuzun okunabilirliğidir, böylece veritabanı erişiminiz değişiyorsa, iş katmanınız çok fazla değişmemelidir.


Bunun neden aşağı oy verildiğinden emin değilim. Bu yanıt , farklı endişelerle ilgilenen kodların ayrılmasını önerir . Burada programlama prensibi gibi geliyor ... ne olduğundan emin değilim ... Adamım. Keşke adı düşünebilseydim. +1 BTW
Greg Burghardt

Sağlam ilkelerden biri değil mi?
J.Pichardo

3
Hayır. SOLID'deki "S", S ingle Sorumluluk İlkesi'dir (SRP). Ancak, önerdiğiniz Endişelerin Ayrılması, hizmet mantığını veri erişim mantığından ayırmak için geçerli bir nedendir. Vladislav'un ​​diğer cevabı Tek Sorumluluk Müdürü'nden bahsediyor. Açıkçası, SRP ve Endişelerin Ayrılması şarap ve peynir gibi birlikte iyi gider.
Greg Burghardt
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.