8.3.2 構建組合行為
在清單 8.11 中,驗證最低收入和當前工作最小年份的檢查和報表函式中,有明顯的重複。這些檢查有類似的結構:都檢查客戶的某一屬性是否小於最小的允許值。
■ 檢查不同的屬性。
■ 使用不同的最小值。
■ 有略微不同的訊息。
要更簡潔地寫出**,我們可以建立乙個函式,取這三個不同的部件作為其引數值,並返回 clienttest 記錄。當我們建立檢查列表時,用不同的引數值呼叫這個新函式兩次,建立兩個類似的檢查。清單 8.13 顯示額外的函式(lessthantest),以及建立檢查列表的新方法。
listing 8.13 creating similar tests using a single function (f# interactive)
> let lessthantest readfunc minvalue propertyname =
let report client =
printfn "checking '%s' of '%s' failed (less than %d)!"
propertyname client.name minvalue
;; val lessthantest : (client -> int) -> int -> string –> clienttest
> let tests =
[ (lessthantest (fun client -> client.income) 30000 "income")
(lessthantest (fun client -> client.yearsinjob)
2 "years in the job")
(* more tests... *) ];;
val tests : clienttest list
像往常一樣,這個型別簽名告訴我們很多關於這個函式的資訊。lessthantest 函式返回值為 clienttest,包含了檢查和報表函式。檢查是用三個引數值生成的:
1 讀客端的乙個數字屬性
2 指定必需的最小值 (在本例中,表示收入或年數)
3 描述屬性 (用於報表檢查)
這段**首先宣告乙個巢狀函式 report,取客戶作為引數值,列印檢查未通過的原因。這個函式還使用 lessthantest 函式的引數值,這意味著,當 report 作為結果的一部分返回時,所有這些引數將捕獲在乙個閉包中。當構建乙個將返回的記錄值時,我們指定 report 作為這個函式值的一部分,第二部分寫成內嵌的,使用 lambda 函式。
使用函式的元組或記錄,在函式式程式設計中很常見,它反映了 f# 的開發風格。但在 c# 中,我們將使用不同的方法來實現這個示例。讓我們看一下,在開發過程中,還要考慮如何在 c# 中實現這個示例,並改善當前的 f# 版本。
8 3 2 構建組合行為
8.3.2 構建組合行為 在清單 8.11 中,驗證最低收入和當前工作最小年份的檢查和報表函式中,有明顯的重複。這些檢查有類似的結構 都檢查客戶的某一屬性是否小於最小的允許值。檢查不同的屬性。使用不同的最小值。有略微不同的訊息。要更簡潔地寫出 我們可以建立乙個函式,取這三個不同的部件作為其引數值,並...
8 3 3 1 C 中的組合行為
8.3.3.1 c 中的組合行為 這一章,我們首先看到的是用c 寫的示例,宣告只有乙個方法的介面表示檢查,然後,為了更方便的方法寫 我們使用了函式 和 func 委託 如果我們想要實現處理兩個函式的程式,就像現在用 f 所做的,可能會立即轉回介面。在 c 中,使用介面肯定要比使用元組或類,以函式作為...
使用組合自定義行為
如果您的設計依賴於繼承,則需要找到一種方法來更改物件的型別以更改其行為。對於組合,您只需要更改物件使用的策略 想象一下,我們的經理突然變成了按小時計酬的臨時雇員。您可以通過以下方式在程式執行期間修改物件 in program.py from hr import payrollsystem,hourl...