İkisini de yapmamı öneririm.
Bir paket yapısıyla teknik katman oluşturmaya çalışmak, uygulamanızda çok fazla dolaşmaya yol açar. Bir servis arayüzünün arkasındaki her şeyi gizlemek için çok uğraştığımızdan bahsetmiyoruz ve yaptığımız ilk şey (çoğunlukla ambalajdan dolayı) her şeyi yapmaktır public class
. Bu, a x.y.z.service
ve x.y.z.repository
paket arasında teknik bir ayrım olduğunda ağrılı hale gelir , şimdi her şey depoya erişebilir. Boom orada servis katmanının içine giriyor.
Bunun yerine daha işlevsel ve soğan tabanlı bir yaklaşım izlemelisiniz ( temiz mimari , altıgen mimari ). Bu aynı zamanda Tek Sorumluluk İlkesine (bir pakete uygulandığında) ve ayrıca ambalajlama ilkelerine uygundur.
- Birlikte değişen şeyler birlikte paketlenir
- Birlikte kullanılan şeyler birlikte paketlenir
Oliver Gierke, Java'da birlikte paketleme bileşenlerine güzel bir yazı yazdı . Simon Brown bu konuda daha genel bir hikaye yazdı .
Uygulamanızın çekirdeğini tutmak için aşağıdaki gibi bir çekirdek paket yapısı için çaba göstereceğim:
x.y.z.area1
x.y.z.area2
Şimdi bir web arabiriminiz varsa, örneğin web hizmeti web
a ws
veya rest
paketin yalnızca bunu tutması için bir alt paket eklersiniz . Temel olarak çekirdeğe bağlanır.
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
Şimdi nesneleri çekirdeğinizden diğer katmanlara tekrar kullanmayı düşünebilirsiniz, ancak IMHO o katman için belirli bir etki alanı kullanmak daha iyidir. Tıpkı Object to SQL mapping'de olduğu gibi, ekranda göstermek veya web hizmetinde XML olarak kullanmak istediğimiz şeyde ve iş mantığının nasıl uygulandığı konusunda (genellikle) bir uyumsuzluk vardır. İşletmenin ve web alan adlarının karmaşıklığına bağlı olarak, bunları bağlanması gereken ayrı sorun alanları olarak düşünebilirsiniz, temel olarak 2 farklı sınırlı bağlam .
Bir CQRS kaynağından alıntı kullanmak için
Tek bir model kullanarak işlemleri aramak, raporlamak ve işlemek için en uygun çözümü oluşturmak mümkün değildir.
Her şeyi tek bir (alan adı) modele sokmaya çalışmayın, sorumlulukları ayırın. Muhtemelen daha fazla (daha küçük) sınıfla sonuçlanırsınız ancak uygulamanızın katmanları arasında daha temiz bir ayrım vardır.
Son Not
Bir mimari yaratmanın bir çözümün diğerine değiş tokuşuna karar verdiğini unutmayın. Bu, alan adının karmaşıklığına bağlıdır ve esas olarak uygulamanızın fonksiyonel gereksinimleri tarafından yönlendirilmelidir. Ancak işlevsel olmayan (performans, güvenlik) ve çevresel kısıtlamalardan (kullanılacak dil, platform, deneyim) etkilenir. Ve mimari, kodlama gibi asla bitmez, her yeni gereksinim uygulamanın yeniden tasarımına yol açabilir (ve belki de?).
feragat
Evet, aynı zamanda her şeyi tek bir modele koymaya çalıştım ve evet uygulamalarımda da teknik bir ayırma kullanmaya çalıştım. Ancak dolaşık uygulama katmanı oluşturmada birkaç yıllık deneyimden sonra (ilk başta iyi bir fikir gibi görünüyor, sonra uygulama büyümeye başlıyor ...) Başka bir yol olması gerektiğini düşündüm.
Bağlantılar
- Temiz Mimari, Bob Martin Amca
- Altıgen Mimari (diğer bir deyişle Limanlar ve Adaptörler), Alistair Cockburn
- Maalesef mimarim nereye gitti, Oliver Gierke
- OOD İlkeleri, Bob Martin Amca
- DDD, Udi Dahan uygulanırken yapılan hatalar
- Sınırlı Bağlamlar, Martin Fowler
- Mimari Olarak Belirgin Kodlama Stili, Simon Brown
Kitabın
- Testler Rehberliğinde Büyüyen Nesneye Dayalı Yazılım
- Java Uygulama Mimarisi: OSGi Kullanan Örneklerle Modülerlik Desenleri (Robert C. Martin Serisi)
- Etki Alanında Tasarım: Yazılımın Kalbinde Karmaşıklıkla Mücadele
- Geliştiriciler için Yazılım Mimarisi
- Etki Alanına Dayalı Tasarımın Uygulanması