สำหรับปัญหาประเภทนี้ Martin Fowler เสนอรูปแบบข้อมูลจำเพาะ :
... รูปแบบการออกแบบโดยกฎธุรกิจสามารถรวมกันใหม่ได้โดยการรวมกฎธุรกิจเข้าด้วยกันโดยใช้ตรรกะบูลีน
รูปแบบข้อมูลจำเพาะเค้าร่างกฎธุรกิจที่สามารถใช้ร่วมกับกฎธุรกิจอื่น ๆ ในรูปแบบนี้หน่วยของตรรกะทางธุรกิจสืบทอดการทำงานของมันจากคลาสรวมข้อมูลจำเพาะเชิงนามธรรม คลาสข้อมูลจำเพาะคอมโพสิตมีหนึ่งฟังก์ชันที่เรียกว่า IsSatisfiedBy ที่ส่งคืนค่าบูลีน หลังจากสร้างอินสแตนซ์สเปคคือ "ถูกล่ามโซ่" พร้อมรายละเอียดอื่น ๆ ทำให้สเปคใหม่สามารถบำรุงรักษาได้อย่างง่ายดาย นอกจากนี้เมื่อการสร้างอินสแตนซ์ตรรกะทางธุรกิจอาจผ่านวิธีการภาวนาหรือการผกผันของการควบคุมมีการเปลี่ยนแปลงสถานะของมันเพื่อที่จะกลายเป็นตัวแทนของชั้นเรียนอื่น ๆ เช่นพื้นที่เก็บข้อมูลการติดตา ...
เสียงเหนือคิ้วเล็กน้อย (อย่างน้อยสำหรับฉัน) แต่เมื่อฉันลองในรหัสของฉันมันก็ค่อนข้างราบรื่นและกลายเป็นเรื่องง่ายที่จะนำไปใช้และอ่าน
วิธีที่ฉันเห็นมันเป็นแนวคิดหลักคือการ "แยก" รหัสที่จะตรวจสอบลงในวิธีการเฉพาะ / วัตถุ
ด้วยnetWorth
ตัวอย่างของคุณสิ่งนี้อาจมีลักษณะดังนี้:
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;
}
กรณีของคุณจะค่อนข้างง่ายเพื่อให้การตรวจสอบทั้งหมดดูตกลงเพื่อให้พอดีกับรายการธรรมดาภายในวิธีการเดียว ฉันมักจะต้องแบ่งวิธีการเพิ่มเติมเพื่อให้อ่านดีขึ้น
ฉันยังมักจะจัดกลุ่ม / แยก "ข้อมูลจำเพาะ" วิธีการที่เกี่ยวข้องในวัตถุเฉพาะแม้ว่ากรณีของคุณดูตกลงโดยที่
// ...
Specification s, *spec = initialize(s, person);
if (spec->isSatisfied()) {
return person->assets - person->liabilities;
}
log("person doesn't satisfy spec");
return -1;
// ...
คำถามที่กองมากเกินนี้แนะนำให้เชื่อมโยงน้อยนอกเหนือจากการอย่างใดอย่างหนึ่งดังกล่าวข้างต้น:
ข้อมูลจำเพาะแบบตัวอย่าง โดยเฉพาะอย่างยิ่งคำตอบแนะนำDimecasts 'การเรียนรู้รูปแบบจำเพาะสำหรับคำแนะนำของตัวอย่างและกล่าวถึง"รายละเอียด" กระดาษเขียนโดยเอริคอีแวนส์และมาร์ตินฟาวเลอร์