Untuk masalah seperti ini Martin Fowler mengusulkan Pola spesifikasi :
... pola desain, di mana aturan bisnis dapat digabungkan kembali dengan merantai aturan bisnis bersama-sama menggunakan logika boolean.
Pola spesifikasi menguraikan aturan bisnis yang dapat digabungkan dengan aturan bisnis lainnya. Dalam pola ini, unit logika bisnis mewarisi fungsinya dari kelas spesifikasi agregat abstrak. Kelas Spesifikasi Komposit memiliki satu fungsi yang disebut IsSatisfiedBy yang mengembalikan nilai boolean. Setelah instantiasi, spesifikasi "dirantai" dengan spesifikasi lain, membuat spesifikasi baru mudah dipelihara, namun logika bisnis dapat disesuaikan. Lebih jauh lagi setelah instantiation, logika bisnis dapat, melalui metode invokasi atau inversi kontrol, dapat diubah kondisinya untuk menjadi delegasi kelas lain seperti repositori persistensi ...
Di atas kedengarannya agak tinggi-alis (setidaknya bagi saya), tetapi ketika saya mencobanya dalam kode saya itu berjalan cukup lancar dan ternyata mudah diimplementasikan dan dibaca.
Cara saya melihatnya, ide utama adalah "mengekstrak" kode yang melakukan pemeriksaan ke dalam metode / objek khusus.
Dengan netWorth
contoh Anda , ini bisa terlihat sebagai berikut:
int netWorth(Person* person) {
if (isSatisfiedBySpec(person)) {
return person->assets - person->liabilities;
}
log("person doesn't satisfy spec");
return -1;
}
#define BOOLEAN int // assuming C here
BOOLEAN isSatisfiedBySpec(Person* person) {
return Person != NULL
&& person->isAlive
&& person->assets != -1
&& person->liabilities != -1;
}
Kasing Anda terlihat agak sederhana sehingga semua cek terlihat OK untuk masuk dalam daftar polos dalam satu metode. Saya sering harus membagi lebih banyak metode untuk membuatnya lebih baik membaca.
Saya juga biasanya mengelompokkan / mengekstrak "spec" metode terkait dalam objek khusus, meskipun kasing Anda terlihat oke tanpa itu.
// ...
Specification s, *spec = initialize(s, person);
if (spec->isSatisfied()) {
return person->assets - person->liabilities;
}
log("person doesn't satisfy spec");
return -1;
// ...
Pertanyaan ini di Stack Overflow merekomendasikan beberapa tautan selain yang disebutkan di atas:
Contoh Pola Spesifikasi . Secara khusus, jawaban menyarankan Dimecasts 'Mempelajari Pola Spesifikasi' untuk panduan contoh dan menyebutkan makalah "Spesifikasi" yang ditulis oleh Eric Evans dan Martin Fowler .