Saya sarankan tidak melakukan keduanya.
Mencoba untuk menerapkan pelapisan teknis dengan struktur paket menyebabkan banyak keterjeratan dalam aplikasi Anda. Belum lagi fakta bahwa kami berusaha sangat keras untuk menyembunyikan segala sesuatu di balik antarmuka layanan dan hal pertama yang kami lakukan (kebanyakan karena pengemasan) adalah membuat semuanya menjadi public class
. Ini menjadi menyakitkan ketika ada pemisahan teknis antara a x.y.z.service
dan x.y.z.repository
paket, sekarang semuanya dapat mengakses repositori. Boom ada enkapsulasi Anda di dalam lapisan layanan.
Sebaliknya Anda harus mengikuti pendekatan yang lebih fungsional dan berbasis bawang merah ( arsitektur bersih , arsitektur heksagonal ). Ini juga sejalan dengan Prinsip Tanggung Jawab Tunggal (bila diterapkan pada suatu paket) dan juga sesuai dengan prinsip pengemasan
- Hal-hal yang berubah bersama dikemas bersama
- Benda-benda yang digunakan bersama dikemas bersama
Oliver Gierke telah menulis posting yang bagus tentang komponen pengemasan bersama di Jawa. Simon Brown telah menulis cerita yang lebih umum tentang masalah ini.
Saya akan berusaha keras untuk struktur paket inti seperti berikut ini untuk menampung inti aplikasi Anda:
x.y.z.area1
x.y.z.area2
Sekarang jika Anda memiliki antarmuka web yang Anda tambahkan, misalnya, web
sub paket, untuk layanan web ws
ataurest
paket hanya untuk menampungnya. Ini pada dasarnya terhubung ke inti.
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
Sekarang Anda dapat mempertimbangkan menggunakan kembali objek dari dalam inti Anda ke dalam lapisan lain, tetapi IMHO lebih baik menggunakan domain tertentu untuk lapisan itu. Seperti, seperti halnya dengan Object to SQL mapping ada (sering) ketidaksesuaian dalam apa yang ingin kita tampilkan di layar atau gunakan sebagai XML dalam layanan web dan bagaimana logika bisnis diimplementasikan. Bergantung pada kompleksitas bisnis dan domain web, Anda dapat menganggapnya sebagai domain masalah terpisah untuk dipecahkan yang perlu dihubungkan, pada dasarnya 2 berbeda konteks terikat yang berbeda .
Untuk menggunakan penawaran dari sumber CQRS
Tidak mungkin untuk membuat solusi optimal untuk mencari, melaporkan, dan memproses transaksi menggunakan model tunggal.
Jangan mencoba memasukkan semuanya ke dalam satu model (domain), pisahkan tanggung jawab. Anda mungkin berakhir dengan lebih banyak kelas (lebih kecil) tetapi pemisahan yang lebih bersih antara lapisan aplikasi Anda.
Catatan Akhir
Ingat, menciptakan arsitektur adalah menentukan timbal balik dari satu solusi ke solusi lainnya. Ini sangat tergantung pada kompleksitas domain dan terutama harus didorong oleh persyaratan fungsional aplikasi Anda. Namun itu dipengaruhi oleh kendala non-fungsional (kinerja, keamanan) dan lingkungan (bahasa untuk digunakan, platform, pengalaman). Dan arsitektur, seperti pengkodean, tidak pernah selesai setiap persyaratan baru dapat (dan mungkin harus?) Mengarah pada desain ulang aplikasi.
Penolakan
Ya saya juga mencoba untuk meletakkan semuanya dalam satu model, dan ya saya juga mencoba menggunakan pemisahan teknis dalam aplikasi saya. Namun setelah beberapa tahun pengalaman dalam membuat layering aplikasi terjerat (pada awalnya sepertinya ide yang baik, maka aplikasi mulai tumbuh ...) Saya pikir pasti ada cara lain.
Tautan
- Arsitektur Bersih, Paman Bob Martin
- Arsitektur Heksagonal (alias Port dan Adaptor), Alistair Cockburn
- Ups ke mana arsitektur saya pergi, Oliver Gierke
- Prinsip OOD, Paman Bob Martin
- Kesalahan saat menerapkan DDD, Udi Dahan
- Konteks Terikat, Martin Fowler
- Gaya Pengodean Arsitektur yang Jelas, Simon Brown
Buku
- Tumbuh Perangkat Lunak Berorientasi Objek, Dipandu oleh Tes
- Arsitektur Aplikasi Java: Pola Modularitas dengan Contoh Menggunakan OSGi (Robert C. Martin Series)
- Desain Berbasis Domain: Menangani Kompleksitas di Jantung Perangkat Lunak
- Arsitektur Perangkat Lunak untuk Pengembang
- Menerapkan Desain Berbasis Domain