Pola desain OOP terbaik untuk urutan operasi


11

Saya sedang mengerjakan aplikasi, modul yang melakukan operasi keuangan berikut secara berurutan:

Ketika seorang pengguna meminta jumlah tertentu untuk ditransfer ke rekening banknya:

  1. periksa apakah ada transaksi yang dapat terjadi sekarang? (transaksi hanya dapat dilakukan selama periode waktu tertentu)
  2. periksa apakah pengguna telah meminta jumlah minimum untuk ditarik
  3. periksa apakah pengguna memiliki akun default

Hasil dari semua tindakan di atas harus dicatat.

Jika semua kondisi di atas memenuhi, transaksi dilakukan. Di masa depan, mungkin ada beberapa pemeriksaan tambahan.

Pola desain berorientasi objek mana yang paling cocok untuk kasus di atas?


3
Jangan pernah mencari pola desain untuk menyelesaikan masalah. Gunakan pola desain untuk mengomunikasikan solusi yang benar. programmers.stackexchange.com/questions/70877/... Ikuti prinsip SOLID dan Anda tidak akan salah.
pdr

2
Saya tidak setuju. Pola memiliki nama yang memudahkan komunikasi dan mereka juga harus digunakan untuk mengkomunikasikan solusi. Tapi saya tidak setuju dengan "Jangan pernah mencari pola desain untuk menyelesaikan masalah". Mereka tidak hanya menyelesaikan masalah spesifik, tetapi mereka juga menghadapi berbagai kekuatan dan kendala. Lihatlah "Proxy" dan "Dekorator". Mereka terlihat serupa tetapi memecahkan masalah yang berbeda. Jadi menurut saya, sebelum Anda menyelesaikan sendiri masalah Anda setidaknya harus melihat pola desain terkenal untuk mendapatkan keuntungan dari keduanya, pendekatan standar untuk memecahkan masalah, dan cara mudah untuk mengomunikasikannya.
Jonny Dee

10
Berikut adalah karakterisasi yang baik tentang apa pola itu: "Mereka [pola] memberikan solusi yang berfungsi, konkret, dan dapat beradaptasi untuk masalah yang berulang kali muncul dalam situasi tertentu selama pengembangan perangkat lunak, dari konteks organisasi ke konteks pemrograman." [POSA5, hlm. 30] Jadi dari sudut pandang ini, sangat jelas bahwa mencari pola sebagai solusi yang dapat diadaptasi adalah pendekatan ligitimate.
Jonny Dee

3
Apakah Anda meminta konstruksi berorientasi objek untuk menggambarkan pemrograman prosedural lama yang sederhana?
mouviciel

4
Ikuti prinsip KISS. Sejauh ini masalah Anda dapat diselesaikan dengan 3 "jika" pernyataan dalam satu metode. Jangan mencoba menggunakan pola desain hanya demi menjadi keren. Setiap kali Anda menulis kelas tambahan, selalu berpikir: Apakah saya benar-benar membutuhkannya?
Eiver

Jawaban:


13

Kedengarannya seperti apa yang Anda cari adalah Rantai Tanggung Jawab . Dalam hal ini Anda dapat memiliki kelas-kelas berikut:

  • TransactionValidatorBase kelas dasar abstrak
  • TransactionTimeValidator
  • TransactionAmountValidator
  • TransactionAccountValidator

Itu dirantai bersama untuk menerapkan namun banyak aturan yang Anda tentukan.

Bacaan Lebih Lanjut


11
Pemahaman saya adalah bahwa Rantai Tanggung Jawab lebih merupakan filter - yaitu kita turun rantai sampai kita menemukan seseorang yang dilengkapi untuk mengatasi tanggung jawab, maka "tautan" akan menangani tanggung jawab dan keluar. Salah satu kekurangan dalam COR dalam hal praktis adalah sulit untuk membuatnya mengembalikan nilai, yang sepertinya Anda perlukan untuk ini.
Amy Blankenship

Saya pikir Anda dapat memiliki Rantai R. tingkat satu. Saya tidak benar-benar berpikir sulit untuk mengembalikan nilai dari Rantai, dengan sedikit pengurangan. Setiap tingkat akan diminta untuk berkomunikasi dengan mengikuti antarmuka primitif tertentu, dan akan diminta untuk menerima input dari bawah, mengingat input tersebut sesuai dengan antarmuka primitif. Ketika kekayaan antarmuka dibutuhkan antara dua tingkat rantai yang lebih erat digabungkan, abstraksi dapat Poly-morphed untuk mendukung itu.
Andyz Smith

2

Pola yang benar di sini sangat tergantung pada konteks. Sebelum memilih pola tertentu yang harus saya patuhi, saya akan mencoba mencari tahu jawaban atas pertanyaan-pertanyaan itu:

  • Apakah diperlukan untuk membuat kombinasi berbeda dari (1,2,3) cek pada saat run-time?
  • Apakah mereka memerlukan variabel yang sama untuk melakukan tindakan mereka atau mereka sangat berbeda?
  • Seberapa tepat pesan kesalahan seharusnya?
  • Jika terjadi kegagalan, apakah pengguna mencoba lagi dari (1) langkah selalu?
  • Bagaimana konkurensi ditangani?
  • Apakah setiap metode menambahkan sesuatu ke permintaan atau hanya memvalidasi? (katakanlah ID akses default?)

Berdasarkan perasaan usus saya akan kode mereka sebagai metode biasa dengan parameter agregasi untuk kode kesalahan.

public void DoTransaction(IErrorAgregator error, TransactionRequest request)
{
    if(!IsTransactionInCertainTimePeriod(request, error)) return;
    if(!IsTransactionAmountInUserBounds(request, error)) return;
    if(!UserHaveDefaultAccount(request, error)) return;
    bankingTransactor.PerformTransaction(request);
}

Mungkin ide yang baik untuk meletakkan DoTransaction di antarmuka "ITransactionValidationStragegy" dan membuat layer tipe-super yang akan berisi kode boilerplate validasi.

Namun, dalam desain ini saya mengasumsikan bahwa logika validasi ditentukan pada waktu kompilasi.


2

Jika urutan langkah Anda sebagian besar melakukan tugas validasi (seperti yang terlihat Anda), tanpa mengubah input, saya benar-benar akan memikirkan pola "Rantai Tanggung Jawab", sebagaimana dijelaskan dalam jawabannya oleh @pswg

Tetapi karena pertanyaan Anda sedikit lebih umum, saya ingin menambahkan "Pemrosesan saluran pipa" juga, karena dengan yang ini, sebuah langkah akan menghasilkan output yang akan menjadi input untuk langkah berikutnya (sehingga mengubah input asli) .

Berikut adalah dua artikel tentang hal itu:
Pengumpulan pipa oleh Martin Fowler.
Lebih banyak diskusi teoretis tentang polanya


0

Sementara pola sudah disebutkan di sini, saya akan menyarankan Anda untuk berpikir tentang bagaimana Anda ingin menggunakan yang sama dalam aplikasi Anda, berdasarkan kerangka kerja yang Anda gunakan.

Misalnya, validasi yang ingin Anda lakukan, kemungkinan besar akan terus berubah seiring waktu berjalan (mungkin Anda ingin menambahkan validasi baru di masa depan yang membatasi transaksi hingga 10 hari). Selain itu, Anda mungkin tidak ingin melakukan validasi sebelum layanan bisnis aktual Anda atau kode integrasi masuk. Akan lebih baik, jika Anda dapat menambahkan validasi sebagai yang dapat dikonfigurasi.

Jika Anda menggunakan Struts, menggunakan pencegat mungkin ide yang bagus. Dalam hal musim semi, injeksi kacang sebagai ketergantungan memberi Anda lebih banyak fleksibilitas. Saran saya tidak hanya untuk melihat pola / idiom tetapi juga melihat kerangka kerja yang Anda gunakan untuk membangun aplikasi dan melihat seberapa baik Anda dapat memenuhi kebutuhan Anda dari sudut pandang futuristik.


-2

Menurut pemahaman saya apa pun yang diperlukan dapat dimasukkan ke dalam pola perintah seperti di bawah ini. Desain kelas dapat dilakukan seperti di bawah ini.

interface Transaction{
void performAction();
}

class Banking{

void moneyValidation(){
//Validate Here
}

void timeValidation(){
//validate Here
}
}

class TimeValidation implements Transaction{

public Banking bank;

public TimeValidation (Banking bnk){
bank=bnk;
}

void performAction(){
bnk.timeValidation();
}


class MoneyValidation Implements Transaction{

public Banking bank;

public MoneyValidation(Banking bnk;){
bank=bnk;
}

void performAction(){
bnk.moneyValidation();
}
}


class Control{

private List val_list=new ArrayList();

void storeValidation(Transaction trans){
val_list.add(trans);
trans.performAction(val_list.getFirstAndRemove());
}
}

//Same for other validation classes

Kelas Klien Anda akan berisi potongan kode berikut:

Banking bnk = new Banking();
MoneyValidation m_val = new MoneyValidation (bnk);
TimeValidation t_val = new TimeValidation (bnk);
Control ctrl = new Control();
ctrl.storeValidation(m_val);
ctrl.storeValidation(t_val);

Ini sesuai dengan pemahaman saya, dengan skenario yang telah diberikan di atas.


Itu buruk karena ketika validasi uang gagal, validasi waktu tidak berguna tetapi itu akan dilakukan
Ewoks
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.