Bagaimana cara memisahkan bagian aplikasi perangkat lunak yang berbeda?

9

Saya merancang aplikasi baru yang berhubungan dengan banyak logika bisnis.

Untuk menghindari keterikatan biasa antara berbagai lapisan aplikasi yang sering menyusup ke sistem seperti itu dari waktu ke waktu, saya ingin menerapkan pemisahan yang bersih dari keprihatinan sejak awal. Secara garis besar saya ingin memisahkan:

  • lapisan presentasi
  • lapisan logika bisnis
  • penyimpanan data dan lapisan ketekunan

Pertanyaan yang paling saya perjuangkan adalah bagaimana sebenarnya mengimplementasikan perilaku di tepian dengan bersih, terutama antara bisnis dan lapisan data. Saya telah melihat terlalu banyak aplikasi di mana lapisan data menyerahkan objek ORM ke lapisan inti, secara efektif menyambungkan logika bisnis ke ORM.

Haruskah saya mengonversi objek ORM ke beberapa format serial (JSON?) Dan kemudian membatalkan deserialize di lapisan bisnis menjadi struktur data internal ke lapisan itu? Bukankah itu banyak overhead?

Bagaimana Anda menerapkan pemisahan kekhawatiran untuk aplikasi berukuran sedang? Ada saran?

BM
sumber
3
Apa itu objek ORM? ORM biasanya memetakan data ke objek domain yang tidak tergabung erat dengan lapisan akses data, sehingga seharusnya tidak ada masalah dalam meneruskan ini ke lapisan bisnis. Tentu saja infrastruktur ORM itu sendiri tidak boleh diteruskan ke lapisan bisnis.
JacquesB
Saya melihat banyak kelas pembuatan otomatis ORM yang memetakan skema database 1: 1, misalnya article.getId(), article.getTimestamp()dll. Pemetaan ini tampaknya lebih sering daripada tidak spesifik untuk ORM yang digunakan.
BM
Anda mungkin harus mengganti ORM. ORM mana yang Anda gunakan?
JacquesB
Belum memutuskan ORM untuk proyek ini, tapi saya sudah bekerja dengan beberapa: SQLAlchemy, SQLObject, Django ORM, Propel, ...
BM
1
Anda menemukan saran terperinci tentang ini di deskripsi Paman Bob tentang Arsitektur Bersih . Paragraf "melintasi batas" dan "Data apa yang melewati batas" persis berurusan dengan masalah Anda.
Doc Brown

Jawaban:

5

Selalu ada sesuatu dari penggabungan logis antara logika bisnis dan database. Upaya Anda harus difokuskan pada pencegahan penggabungan fisik .

Misalnya, ambil aturan bisnis yang sangat mendasar bahwa setiap pengguna harus memiliki ID pengguna yang unik. Anda dapat mencoba untuk menegakkan aturan itu di lapisan bisnis, tetapi akan selalu ada beberapa skenario di mana beberapa pengguna dapat mencoba ID pengguna yang sama pada saat yang sama, dan satu-satunya tempat di mana Anda dapat memeriksa keunikan dan memesan ID pengguna dalam suatu cara atom ada di database.

Sekarang, lapisan bisnis tidak perlu mengetahui nama tabel atau kolom, atau bahkan pengguna disimpan dalam database (mereka bisa, misalnya, disimpan di Active Directory, bukan untuk aplikasi intranet). Hanya lapisan akses data yang harus mengetahuinya. Tetapi untuk menghabiskan banyak usaha untuk memutuskan skema dari aturan bisnis mungkin merupakan usaha yang sia-sia.

John Wu
sumber
guids telah ada beberapa saat sekarang
Ewan
4

Pastikan objek Model Bisnis Anda ada di pustaka mereka sendiri yang tidak mereferensikan ORM atau klien basis data.

Gunakan pola Repositori dan hanya antarmuka referensi ke repositori dalam kode utama Anda.

Memiliki pustaka repositori beton yang benar-benar terpisah khusus untuk datalayer yang merujuk pustaka antarmuka, pustaka model bisnis dan klien basis data.

Ewan
sumber