Contoh di bawah ini sepenuhnya buatan dan satu-satunya tujuan adalah untuk menyampaikan maksud saya.
Misalkan saya memiliki tabel SQL:
CREATE TABLE rectangles (
width int,
height int
);
Kelas domain:
public class Rectangle {
private int width;
private int height;
/* My business logic */
public int area() {
return width * height;
}
}
Sekarang anggaplah saya memiliki persyaratan untuk menunjukkan kepada pengguna luas total dari semua persegi panjang dalam database. Saya bisa melakukannya dengan mengambil semua baris tabel, mengubahnya menjadi objek dan beralih di atasnya. Tapi ini terlihat bodoh, karena saya punya banyak dan banyak persegi panjang di meja saya.
Jadi saya melakukan ini:
SELECT sum(r.width * r.height)
FROM rectangles r
Ini mudah, cepat dan menggunakan kekuatan basis data. Namun, ia memperkenalkan duplikasi logika, karena saya juga memiliki perhitungan yang sama di kelas domain saya.
Tentu saja, untuk contoh ini duplikasi logika tidak fatal sama sekali. Namun, saya menghadapi masalah yang sama dengan kelas domain saya yang lain, yang lebih kompleks.
sumber
Jawaban:
Seperti yang ditunjukkan lxrec, ini akan bervariasi dari basis kode ke basis kode. Beberapa aplikasi akan memungkinkan Anda untuk menempatkan logika bisnis semacam itu ke dalam Fungsi dan / atau kueri SQL dan memungkinkan Anda untuk menjalankannya kapan saja Anda perlu menunjukkan nilai-nilai itu kepada pengguna.
Kadang-kadang mungkin tampak bodoh, tetapi lebih baik untuk kode kebenaran daripada kinerja sebagai tujuan utama.
Dalam sampel Anda, jika Anda menunjukkan nilai area untuk pengguna dalam formulir web, Anda harus:
Itu bodoh untuk hal-hal sederhana seperti yang ada di sampel, tetapi mungkin perlu untuk hal-hal yang lebih kompleks seperti menghitung IRR dari investasi klien dalam sistem perbankan.
Kode untuk kebenaran . Jika perangkat lunak Anda benar, tetapi lambat, Anda akan memiliki peluang untuk mengoptimalkan di tempat yang Anda butuhkan (setelah profil). Jika itu berarti menyimpan beberapa logika bisnis dalam database, biarlah. Itu sebabnya kami memiliki teknik refactoring.
Jika menjadi lambat, atau tidak responsif, Anda mungkin harus melakukan beberapa optimasi, seperti melanggar prinsip KERING, yang bukan merupakan dosa jika Anda mengelilingi diri Anda dari pengujian unit yang tepat dan pengujian konsistensi.
sumber
Anda mengatakan bahwa contohnya adalah buatan, jadi saya tidak tahu apakah yang saya katakan di sini sesuai dengan situasi Anda yang sebenarnya, tetapi jawaban saya adalah - gunakan lapisan ORM (Object-relational mapping) untuk menentukan struktur dan kueri / manipulasi dari database Anda. Dengan begitu Anda tidak memiliki logika duplikat, karena semuanya akan ditentukan dalam model.
Misalnya, menggunakan kerangka Django (python), Anda akan mendefinisikan kelas domain persegi panjang Anda sebagai model berikut :
Untuk menghitung total area (tanpa pemfilteran) Anda akan mendefinisikan:
Seperti yang disebutkan orang lain, Anda harus terlebih dahulu kode untuk kebenaran, dan hanya mengoptimalkan ketika Anda benar-benar menemui hambatan. Jadi, jika di kemudian hari Anda memutuskan, Anda benar-benar harus mengoptimalkan, Anda bisa beralih ke mendefinisikan kueri mentah, seperti:
sumber
Saya telah menulis contoh konyol untuk menjelaskan sebuah ide:
Jadi, jika Anda memiliki beberapa logika:
Anda dapat menggunakannya kembali di kelas domain:
Atau di lapisan sql-generation Anda:
Dan, tentu saja, Anda dapat mengubahnya dengan mudah. Coba ini:
sumber
Seperti yang dikatakan @Machado, cara termudah untuk melakukannya adalah menghindarinya dan melakukan semua pemrosesan Anda di java utama Anda. Namun, masih mungkin untuk memiliki basis kode dengan kode yang sama tanpa mengulangi diri Anda dengan membuat kode untuk kedua basis kode.
Misalnya menggunakan roda gigi memungkinkan untuk menghasilkan tiga cuplikan dari definisi umum
cuplikan 1:
cuplikan 2:
cuplikan 3:
dari satu file referensi
sumber