多项目公共代码抽离时改造Foo接口迁移ContractFoo方案咨询
解决方案
核心思路是给ContractFoo增加泛型参数,解除它和业务侧特定Foo接口的强绑定,即可将无业务依赖的泛型版本迁移到公共库中。
步骤1:定义公共库中的泛型ContractFoo
在Project Common中定义泛型接口,不需要依赖任何Project A、B的业务类型:
interface ContractFoo<T> { fun screen(to: T.() -> Unit) }
步骤2:业务项目绑定本地Foo类型
Project A、B各自绑定泛型参数到本地的Foo接口即可,原有Foo接口不需要做任何修改,业务侧调用逻辑也基本不需要调整:
Project A侧适配代码
// 原有Foo接口保持不变 interface Foo { fun screen1InProjectA() fun screen2InProjectA() } // 用类型别名绑定泛型,兼容原有调用逻辑 typealias ContractFoo = ContractFoo<Foo>
Project B侧适配代码
// 原有Foo接口保持不变 interface Foo { fun screen1InProjectB() fun screen2InProjectB() } // 同理绑定本地Foo类型 typealias ContractFoo = ContractFoo<Foo>
可选优化:增加泛型上界做统一约束
如果后续两个Foo接口有可抽离的公共方法,可以先在Project Common中定义基础父接口,再给ContractFoo的泛型加上界:
// Common中定义公共父接口 interface BaseFoo { // 两个Foo共有的方法可以抽离到此处 } // 给泛型加上界约束 interface ContractFoo<T : BaseFoo> { fun screen(to: T.() -> Unit) }
之后Project A、B的Foo接口继承BaseFoo即可,可进一步规范业务侧的类型定义。
该方案完全符合依赖倒置原则,公共库不需要依赖上层业务项目,同时支持后续其他业务项目复用ContractFoo,只需绑定自身的业务类型即可,扩展性极强。
内容的提问来源于stack exchange,提问作者Praveen P.
相关产品推荐
相关产品推荐

