指挥链遂为 F&O 定制之常式,盖因覆盖之法不可久持——每版本之更迭辄损物,而伙伴耗其升级之资,修定制之失,然此失本宜于设计即具前瞻相容之能。CoC 乃使延展之法裹本法以 next(),全可免覆盖之舞。
此机制需时方解,生产中常现三弊,足为文牍。
警兆一:增扩之际,遗忘next()
初涉CoC之队,常作验证之延,其式若此:
[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()有时是正当的——然则当为有意为之,当加注释,当经审查。无心之跳,乃数据完整性之虫所藏身也.
陷坑二:选用不当之生命周期钩子
FormDataSource.init() 运行于记录载入之前。扩展代码若欲读取this.cursor()或假定记录上下文将抛出异常或行为不可预测。常将逻辑置于动态过滤器中发送的团队init()盖彼乃初见之钩,故用户初以空数据启表,即遭崩溃。
表单级生命周期钩子各有所司:
-
init()- 表层之设,尚无数据 -
executeQuery()- 查询成,取之前 -
active()- 载籍既立, - 事前事后之应于
executeQuery- 变更查询之至净也,不夺其本。
动态筛选于参数表,executeQuery 之事前应,可变查询之界域,以事由所引之数据境。无崩坏,无本法之夺,无脆弱之下游耦合。
第三患:觊觎私或受护之属
CoC扩展不得访问基类的私有或受保护成员。开发者自叠加时代迁移至F。&先击此:
[ExtensionOf(classStr(SalesLineType))]
final class SalesLineTypeExt_Extension
{
public boolean checkPrice()
{
// Compile error: _commonPricing is protected
return this._commonPricing.checkMyThing();
}
}
微软之扩展框架载四途:
- 可钩基础法 - 若私行显于公法,则唤之.
- 兄弟类通. - 间有公类显所需之足.
- 于法设应于引以显之. - 最洁之径.
- 经 LCS 事寻求之. - 微软应伙伴之请,于屡次"One Version"发布中增开众多成员.
求诸反思,非正途也。其效仅及于下次编译,成员布局一变,复归层叠之脆弱.
疑无声息之扩展,其调试之难
最令人沮丧之CoC失败,乃扩展者编译部署,然运行时一无所为。其根源见于有效F&O代码库之评审:
-
[ExtensionOf]属性指向错误之目标——formStr()/tableStr()/classStr()之中误字。 - 扩展之类别非
final——此乃CoC所必需。 - 方法之签署不吻合——参数之类型不协则默然过之。
- 含有延展之模,非目标境之模列所载。
初诊之步:于法首弃 info("hit") ,再编译,演试其境,察Infolog。若无物显,则前述者有误。
代码之审,如保赤之诚。
之团队,治与之码仓,则视CoC之延展,若持献审之清单:next()之呼名得宜,生命周期之钩择当,无私成员之探,以SysTest覆单元之测。每献审十五分钟,乃保险之策,使一版之更不化周末之废。












