public interface IDomainExtension extends IPlugable
软件是变与不变交融的艺术,变化带来发展,不变是本质;透过变化抓住不变,才是设计的根本.
扩展点,将原来静态的逻辑转为动态的逻辑,分离了(变化,不变),不变的是意图,变化的是在不同场景下如何达成意图.
通过扩展点这个表达业务意图(WHAT, not HOW)的接口,实现业务功能点的多态,解耦不同的变化,隔离变化.
定义扩展点接口,实际上是在做标准化,通过概念上剥离实现屏蔽(变化,细节),这是分层思想.
扩展点的本质是抽象,抽象的本质是识别问题本质,途径是主动忽略非本质细节.
对于第1个语义,预埋扩展点处要判断返回值是否null,null表示没有命中任何扩展点实现
如果觉得判空不优雅,也可以提供扩展点的兜底实现,这样预埋处就不必判空了
!!! ATTENTION !!!
扩展点方法的返回值必须是Java包装类或void,不能是int/boolean等primitive types,否则可能抛出NPE!
可以使用ExtensionMethodNPEEnforcer
自动检测,避免线上风险
class Test {
℗Test
void enforceExtensionMethodSignature() {
new ExtensionMethodSignatureEnforcer()
.scan(root)
.enforce();
}
}
扩展点方法的入参,有时候平台传递的是像Order
这样的大对象,但又担心BP擅自调用大对象的写方法产生unexpected side effect
,可以这样:
class Order implements IOrder {
private String orderNo;
private List<OrderLine> orderLines;
}
interface IOrder {
List<? extends IOrderLine> getOrderLines();
}
class OrderLine implements IOrderLine {
private String sku;
private BigDecimal qty;
}
interface IOrderLine {
String getSku();
BigDecimal getQty();
}
// 扩展点预埋
Order order = factory.create();
DDD.usePolicy(SomePolicy.class, ident).doSth(order);
// 扩展点实现
class DoSthExt implements IDoSthExt {
public void doSth(IOrder order) { // 扩展点方法暴露的是抽象的接口
// 只能根据平台的定义进行有限访问Order功能
}
}
限定符和类型 | 字段和说明 |
---|---|
static String |
DefaultCode
推荐使用:扩展点的默认实现对应的码,这样你就不用再定义了.
|
Copyright © 2020–2023. All rights reserved.