我將抽象的意圖,以便它並不重要它是如何實現的,還是怎麼着源代碼的組織。在基本層面上,您擁有的是一組檢查器,生成一系列失敗解釋。
的僞代碼將主要是:
let reasons be a new, empty collection of failure reasons
let checkers be the list of relevant checkers
for each checker in checkers
if checker passes, continue
if checker fails, add explanation to reasons
if number of reasons is zero,
voucher is valid, success
if number of reasons > zero,
the voucher is invalid, format each element in reasons for display to the user
有了這個邏輯,不要緊的跳棋是如何組織的,只要他們能夠獲得通過的這部分代碼在一個列表。你可以有一個單一的方法與許多檢查,可能會增加很多原因。你可以有許多類,每個檢查器列表中有一個實例。至關重要的是,實際的檢查人員與此邏輯脫鉤,隨時可以使用不同的檢查人員(考慮業務規則變化或不同地區的不同規則)。
根據您的語言,這至少會涉及抽象用於檢查者的類型。
從那開始。如果您發現相同的數據庫查詢,則開始考慮用於運行檢查程序集的緩存。
至於跳棋是如何在源級別上組織的......沒關係。只有抽象纔會。一旦你提供了一個可以隱藏起來的抽象級別,細節就相當靈活了。
優點:
- 執行檢查不關心實際的,具體的檢查(這可能會改變根據業務規則)位。
- 無論您想要如何組織跳棋,您都可以組織跳棋:在一個源文件中一起定義跳棋,或者根據其他方案進行分組。它還允許自由分離出一個檢查器來進行測試。
- 集合和漂亮的格式化只需執行一次,無論檢查的類型或數量如何。
缺點:
- 這需要時間的前期做設計抽象的一份體面的工作。這可能會在稍後得到回報。
- 有一層間接性可能使其更難以理解,並追查正在進行的實際檢查。靈活性不利於可理解性。這些是你必須考慮的情況。在我看來,優惠券的規則似乎是隨着時間的推移可能會改變的東西,這裏的抽象並不難理解,所以我認爲這是值得的。
我花時間在Java中編寫了一個例子,但它確實沒有增加太多。如果試圖從抽象的角度思考,實際的機制並不重要。