Lapisan layanan aplikasi memanggil fungsi database. Arsitektur yang buruk?


11

Skenario:

  • Stack: Java, Spring, Hibernate.
  • Model: Aplikasi Client-Server.
  • Pola: Model-View-Controller (MVC).

Kelas-kelas Lapisan Layanan memiliki tiga perilaku:

  1. Beberapa layanan memiliki aturan bisnis dalam metode dan mendelegasikan ketekunan ke aplikasi. Suka:

    EntityManager.save (entitas);

  2. Beberapa layanan cukup memanggil fungsi basis data (melewati parameter) Seperti:

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

  3. Beberapa layanan memiliki metode dengan kedua perilaku tersebut.

Pertanyaan saya:

  1. Apakah ada masalah dalam meminta layanan aplikasi memanggil - langsung - fungsi basis data? Bukankah ini dianggap praktik yang buruk? Apa yang akan menjadi model arsitektur yang berlaku untuk proyek seperti ini?
  2. Apakah ada masalah dalam memiliki campuran perilaku dalam layanan yang sama? Seperti transaksi dan konsistensi?
  3. Dalam hal pemeliharaan, apakah enkapsulasi ini membuatnya tidak jelas bagi pengembang bahwa ia juga harus mengubah fungsi dalam database? Bagaimana cara menghindarinya?
  4. Apakah skenario ini terjadi pada aplikasi lain di seluruh dunia atau itu hanya kesalahan arsitektur?

Pertanyaan ini serupa tetapi tidak persis sama .. softwareengineering.stackexchange.com/questions/180012/…
Jon Raynor

Jawaban:


7

Apakah ada masalah dalam meminta layanan aplikasi memanggil - langsung - fungsi basis data? Bukankah ini dianggap praktik yang buruk?

Saya pikir ada. Anda menempatkan pengetahuan tentang internal basis data ke layanan aplikasi. Mengubah database dengan cara apa pun (mengganti mesin penyimpanan atau bahkan mengubah nama bidang atau membuat indeks) mungkin mengharuskan Anda untuk mengubah layanan aplikasi dan itu melanggar SRP .

Apa yang akan menjadi model arsitektur yang berlaku untuk proyek seperti ini?

Lihat komentar di bawah.

Apakah ada masalah dalam memiliki campuran perilaku dalam layanan yang sama? Seperti transaksi dan konsistensi?

Saya tidak percaya ada masalah teknis, tapi ada yang logis. Anda hanya mencampur dua pendekatan dalam aplikasi sehingga tidak jelas, kurang terstruktur, sulit beradaptasi dengan perubahan. Lihat komentar di atas tentang melanggar SRP juga.

Dalam hal pemeliharaan, apakah enkapsulasi ini membuatnya tidak jelas bagi pengembang bahwa ia juga harus mengubah fungsi dalam database?

Tentu saja.

Bagaimana cara menghindarinya?

Tempatkan metode dan fungsi, yang secara langsung bekerja dengan basis data ke dalam tingkat abstraksi yang terpisah (baik itu lapisan DAO atau pola penyimpanan sederhana - tergantung pada kompleksitas aplikasi Anda)

Apakah skenario ini terjadi pada aplikasi lain di seluruh dunia atau itu hanya kesalahan arsitektur?

Saya pikir di dunia kita semuanya terjadi;)


Jika saya mengerti dengan benar, mungkin ada masalah teknis di mana jika pembaruan terjadi di fungsi / disimpan-procs dan juga melalui ORM, keadaan transaksi tertentu sangat sulit untuk dipikirkan. Meskipun aplikasi mungkin berfungsi dalam kondisi saat ini, perubahan kecil dapat menyebabkan beberapa masalah besar. Pengalaman saya dengan Hibernate adalah bahwa jika Anda tidak membiarkannya mengatur seluruh set tabel yang berfungsi, Anda akan memiliki banyak masalah yang mengganggu.
JimmyJames

jawaban yang bagus dan ringkas. SRP adalah hal pertama yang terlintas di pikiran saya ketika saya pertama kali melihat kode. Beberapa rekan kerja mengatakan bahwa metode ini tidak melanggar SRP karena faktanya hanya memanggil fungsi basis data. Tetapi beberapa fungsi itu memang memilih, menyisipkan dan memperbarui. Jadi itu melanggar atau tidak SRP? (mungkin ini sendiri adalah pertanyaan lain untuk dibahas secara terpisah?)
linuxunil

1
+1 untuk garis itu saya pikir di dunia kita semuanya terjadi;)
linuxunil

@linuxunil SRP harus dihormati di semua tingkatan arsitektur. Dalam kasus saya, saya maksudkan SRP pada tingkat layanan, bukan pada tingkat metode. @ JimmyJames Yap. Sebagian besar ORM tidak bekerja dengan baik dengan prosedur yang tersimpan. Tetapi kadang-kadang proses yang disimpan diperlukan.
Vladislav Rastrusny

3

Menurut apa yang Anda katakan ada lapisan layanan sehingga pola arsitektur yang tampaknya cocok adalah Layered Architecture. Referensi lebih lanjut

Ya itu biasanya merupakan praktik yang buruk untuk melakukan panggilan database langsung di lain dari pada lapisan akses data, dengan cara itu lapisan bisnis hanya mengakses abstraksi dari database.

Adapun perilaku pencampuran, menggunakan beberapa pola desain sebagai pola DAO atau pola Repositori dapat membantu mendelegasikan tanggung jawab itu sehingga meningkatkan kode itu.

Beberapa keuntungan menggunakan pola desain dan ORM adalah keterbacaan kode Anda enkapsulasi tanggung jawab jadi jika akses database Anda berubah lapisan bisnis Anda tidak boleh banyak berubah.


Tidak yakin mengapa ini tidak dipilih. Jawaban ini merekomendasikan pemisahan kode yang berhubungan dengan masalah yang berbeda . Terasa seperti kepala sekolah di sini ... tidak yakin apa itu ... Sobat. Kalau saja saya bisa memikirkan nama. +1 BTW
Greg Burghardt

Bukankah itu salah satu prinsip yang kuat?
J. Pichardo

3
Tidak The "S" di SOLID adalah S perapian di tungku Tanggung Jawab Kepala Sekolah (SRP). Tetapi Pemisahan Masalah, yang Anda rekomendasikan, adalah alasan yang sah untuk memisahkan logika layanan dari logika akses data. Jawaban lain oleh Vladislav menyebutkan Kepala Satu Tanggung Jawab. Sejujurnya, SRP dan Separation of Concern berjalan dengan baik, seperti anggur dan keju.
Greg Burghardt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.