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.