命令鏈變成了與的自定義的預設模式,因為疊加方法是不持續的——每一個版本更新都會破壞某些功能,而合作夥伴則花費他們的升級預算來修復那些本應設計為向前兼容的自定義功能。CoC讓擴充套件可以藉由next()包裝基底方法,完全跳過疊加的舞蹈。
此機制需要一個小時來閱讀。三種失敗模式在生產中經常出現到足以記錄的程度.
陷阱 1: 當增強時忘記 next()
剛接觸協作協議的團隊經常編寫看起來像這樣的驗證擴展:
[ExtensionOf(tableStr(SalesTable))]
final class SalesTableExt_Extension
{
public boolean validateWrite()
{
if (this.CustomCheck == NoYes::No)
{
return checkFailed("Custom check failed");
}
return true;
}
}
錯誤:沒有next validateWrite() 的呼叫。基底方法從不執行,因此所有庫存驗證都靜默消失。僅運行自訂檢查路徑的單元測試會通過。遺失的基底驗證直到基底本應拒絕的數據成功傳遞到生產環境時才會浮現。
當意圖是添加邏輯而非替換時,先呼叫 next() 再合併結果:
public boolean validateWrite()
{
boolean ret = next validateWrite();
if (ret && this.CustomCheck == NoYes::No)
{
ret = checkFailed("Custom check failed");
}
return ret;
}
略過 next() 是有時合法的 - 但它應該是故意的、有註解的,並且需要被檢查。無意的略過是隱藏數據完整性錯誤的地方.
陷阱 2:選擇錯誤的生命週期鉤子
FormDataSource.init() 在記錄載入之前運行。擴展代碼那麼讀取this.cursor() 或假設記錄上下文會拋出錯誤或行為不可預測。發布動態過濾器的團隊通常會將邏輯放在 init(),因為那是他們看到的第一个鉤子,然後當用戶在空數據集打開表單時第一次導致崩溃。
表單級生命週期鉤子每個都有其目的:
-
init()- 表單級設置,尚未有數據 -
executeQuery()- 查詢構建之後,在獲取之前 -
active()- 在數據來源上記錄被激活後 - 事件前/後處理器在
executeQuery- 變更查詢的最潔淨方式,不覆蓋基本方法
從參數表中動態篩選,在 executeQuery 上的事件前處理器允許您使用事件參數中可用的數據上下文來修改查詢的範圍。無崩溃,無基本方法覆蓋,無脆弱的下游耦合。
避坑三:嘗試存取私有或受保護的成員
CoC擴充套件無法存取基底類別的私有或受保護成員。從疊蓋時代過渡過來的開發者會首先遇到這個問題:&O
[ExtensionOf(classStr(SalesLineType))]
final class SalesLineTypeExt_Extension
{
public boolean checkPrice()
{
// Compile error: _commonPricing is protected
return this._commonPricing.checkMyThing();
}
}
微軟的擴充套件框架文件記錄了四種選項:
- 可掛鉤的基本方法 - 如果私有的行為透過一個公開方法呈現,就呼叫那個方法
- 兄弟類別存取 - 偶爾一個公開類別會暴露足夠你所需要的
- 在透過args暴露資料的方法上的事件處理程序 - 最乾淨的路徑
- 透過LCS問題搜尋請求存取 - 微軟已回應合作夥伴在連續的 One Version 發布中所提出的許多成員申請.
伸手去尋求反覆思考是錯誤的答案。它有效,直到下一次編譯改變成員佈局,而你又回到了覆蓋層級的脆弱.
調試一個靜態擴展
最令人沮喪的CoC失敗是那個編譯、部署但在執行時什麼也不做的擴充套件。在可正常運行的F&O代碼庫的審查中出現的根原因:
-
[ExtensionOf]屬性指向了錯誤的目標 - 在formStr()/tableStr()/classStr()中出現了拼寫錯誤。 - 擴充套件類別沒有
final- CoC所必需的。 - 方法簽名不完全匹配 - 參數類型不匹配會靜默跳過。
- 包含擴展的模型不在目標環境的模型列表中。
基本診斷步驟:在方法頂部刪除 info("hit"),重新編譯,執行場景,檢查Infolog。如果沒有出現任何內容,則上述其中一項是錯誤的。
代碼審查作為保險
運作健康的F與O代碼庫的團隊會用一個PR時期的清單來處理CoC擴展:next()被正確調用,選擇了合適的生命週期鉤子,沒有嘗試訪問私有成員,透過SysTest進行單元測試覆蓋。每個PR的十五分鐘是保險政策,確保One Version更新不會變成週末停機。












