Bu tür sorunlar için Martin Fowler, Şartname modelini önerdi :
... tasarım kuralları, böylece iş kuralları, boolean mantığı kullanılarak birlikte iş kuralları zincirlenerek yeniden birleştirilebilir.
Bir teknik özellik deseni, diğer işletme kuralları ile birleştirilebilen bir işletme kuralını ana hatlarıyla belirtir. Bu düzende, bir iş mantığı birimi işlevselliğini soyut toplam Kompozit Spesifikasyon sınıfından miras alır. Kompozit Spesifikasyon sınıfı, bir boolean değeri döndüren IsSatisfiedBy adlı bir işleve sahiptir. Örneklemeden sonra, özellik diğer özelliklerle "zincirlenir", böylece yeni özelliklerin kolayca bakımı yapılabilir, ancak özelleştirilebilir iş mantığı. Dahası, başlatmanın ardından iş mantığı, yöntem çağırma ya da kontrolün tersine çevrilmesi yoluyla, kalıcılık havuzu gibi diğer sınıfların delegesi olmak üzere devletini değiştirebilir ...
Yukarıda biraz kaş gibi geliyor (en azından benim için), ama kodumda denediğimde oldukça sorunsuz geçti ve uygulanması ve okunması kolaylaştı.
Gördüğüm gibi, ana fikir, kontrolleri özel yöntem (ler) / nesneler haline getiren kodu "çıkarmak".
Senin ile netWorth
örneğin, bu şöyle hakkında görünebilir:
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;
}
Durumunuz oldukça basit görünüyor, böylece tüm kontroller tek bir yöntemle düz bir listeye sığacak şekilde OK'a bakıyor. Daha iyi okumak için daha fazla yönteme ayrılmam gerekir.
Ayrıca, tipik olarak "spec" ile ilgili yöntemleri özel bir nesnede gruplandırıyorum / bununla birlikte, durumunuz tam olarak iyi görünmüyor.
// ...
Specification s, *spec = initialize(s, person);
if (spec->isSatisfied()) {
return person->assets - person->liabilities;
}
log("person doesn't satisfy spec");
return -1;
// ...
Yığın Taşması'ndaki bu soru yukarıda belirtilenlere ek olarak birkaç bağlantı önerir:
Teknik Özellik Örneği Örnek . Özellikle, cevaplar , bir örnek için adım adım “Spesifikasyon modelini öğrenme” konusunda Dimecasts'ı önermekte ve Eric Evans ve Martin Fowler tarafından hazırlanan “Spesifikasyonlar” belgesinden bahsetmektedir .