Memiliki sedikit perdebatan tentang struktur proyek awal (menggunakan Maven / Eclipse) untuk aplikasi Java besar.
Pilihan 1:
entities (i.e. the whole database using Hibernate classes-first)
services (i.e. sets of read/write operations on the entities)
app (perhaps split up more further down the line)
Pilihan 2:
area1-entities
area1-services
area1-app
area2-entities
area2-services
area2-app
...
(where area1, area2 etc. are functional areas of the system)
Opsi 2 jelas akan menghasilkan lebih banyak proyek / modul Maven dan berarti kelas-kelas yang akan menghasilkan basis data didistribusikan di antara beberapa proyek. Adakah yang bisa menyarankan pro / kontra dari setiap pendekatan?
Jawaban:
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 ax.y.z.service
danx.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
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:
Sekarang jika Anda memiliki antarmuka web yang Anda tambahkan, misalnya,
web
sub paket, untuk layanan webws
ataurest
paket hanya untuk menampungnya. Ini pada dasarnya terhubung ke inti.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
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
Buku
sumber