概念介绍
在Lattice框架里,有一个叫做“能力(Ability)”的名词。 这里,我就这个名词做下我的理解。
《吕氏春秋·适威》:“民进则欲其赏,退则畏其罪,知其能力之不足也!”
方纪 《三峡之秋》二:“ 长江蕴藏着无限丰富的水能; 三峡 形成了天然的水利枢纽。这在我国的建设事业中,有可能变成一种巨大的能力。”
毛主席在《纪念白求恩》中写道:“一个人能力有大小,但只要有这点精神,就是一个高尚的人。”
领导在平台开工会中提到:“一个平台能力有大有小,但只要架构优秀并持续改进,就是一个有希望的平台”
从上面的名家言论中可以看出,能力是对人、物等特定载体在某些场景下所表现出的一组行为的描述。
打个比方,我们在谈到“人”这个能力载体时,我们会说:
- 人具备改变世界的能力
- 人具备繁衍后代的能力
- 人具备扯淡的能力
- 相声演员(人的实例)具备说学逗唱的能力
- 体育运动员(人的实例)具备跑跳的能力
- .............
能力的特征
如果我们再进一步细分,人这个载体又是由头、躯干、四肢、经血、脉络以及各种内脏组成。这些不同的部件,也可以做为一个载体提供一些更加细分、具体的能力。 比如,手这个载体,虽然他不具备繁衍后代的能力。但是手的能力有:可以弯曲的能力、可以负重的能力。 手弯曲的行为有手腕弯曲、手指弯曲,手的负重行为可以有以手掌方式负重、手指方式负重。 手这个部件的能力以及其行为虽然很有限,但是配合起来可以完成俯卧撑,最终支撑并实现了人类繁衍更加重要能力的实现。
所以,能力是可聚合的
说到了能力的行为,行为应该可以扩展的,扩展后的行为可以做更多的之前做不到的事。比如挠痒这个行为。其实挺简单,基本的挠痒动作就是用手去抓嘛,能抓得到的地方就去抓好了。但对于抓不到的地方,那怎么办? 你至少有两种选择:
- 换个行为,改用“蹭”,找个地方对准痒处使劲蹭..
- 还是用“挠”这个行为,不过得扩展一下手,在配合使用“不求人”完成对痒处的“挠”
所以,能力的行为是可扩展的
刚刚提到的手的能力及其行为,都原生的,与生俱来的。但是,我们是可以通过给人增加外挂,增加一些原本不具备的能力。比如,给眼睛配上夜视眼镜,人就具备了如猫一样可以夜视行为。 夜视眼镜的载体是眼睛,对看这个行为进行了扩展,从而使人具备夜视的能力。
所以,某些能力不一定是原生的,是可以通过工具后可叠加的
有时,你在某个方面可能真的很牛逼。比如,你唱歌很好、舞跳得棒、乒乓球也是一把好手。 可是,在程序员的世界里,你说了,大家也不见得会在意和记住。 但你不说,你就很有可能失去一次和女神一起去嗨歌的好机会。
所以,能力是一定要可呈现的,至少是对特定的场景/视图
如果能理解上面的概念,那么在回过头来看Lattice中关于能力接口的定义。
在Lattice中,我们定义了能力接口 IAbility,其接口定义有两个泛型,第一个是能力载体(AbilityTarget),另一个是能力的行为(也叫可扩展点 IExtensionPoints)。
public interface IAbility<AbilityTarget,
ExtensionPoints extends IExtensionPoints> {
/**
* check whether the target is current ability will support.
* @param bizCode the business unique code.
* @param target the target object.
* @return true or false.
*/
public boolean
supportChecking(String bizCode, AbilityTarget target);
/**
* get the extension points' realization by business code.
*
* @param bizCode business code.
* @return the ExtensionPoints realization.
*/
public ExtensionPoints getExtensionPoints(String bizCode);
}
IAbility能力中有两个关键的方法,一个是 supportChecking。 是用来检查在特定的业务约束下(bizCode),对于特定的载体,本能力是否支持?简单的打比方:
- 看”这个行为,去问“手”这个载体,应该得到false的结果
- “看”这个行为去问“眼睛”,应该得到true的结果
另一个方法是 getExtensionPoints() 获取行为的实例。 比如:
- 针对眼睛这个载体获取出 EmptyEyeExtension,那么就代表没有可用行为,比如盲人
- 针对眼睛这个载体取出的是基本实现 NormalEyeExtension,那么就可以完成基本看的行为
- 针对眼睛这个载体取出的是增强版 EnhancedEyeExtension,那么就可以完成夜视行为
关于如何具体定义一个能力的样例,可以参考 《Quick Start》
2022-11-22 at 下午10:36
这个是我看到对“能力”讲解最透彻的一篇文章。之前看ThoughtWorks出的《现代企业架构白皮书》,里面也有提到“基础能力”、“能力组件”,那些还是比较业务化的描述,总感觉没能理解到位。
受益??
2023-03-21 at 下午3:09
不知道我的理解对不对,看完lattice的全部案例后,我感觉基于lattice开发的软件最牛逼的地方就是会很内聚,lattice把能力的行为 和 载体的行为分离,载体不需要担心能力需不需要加强,也不需要知道能力加强到什么程度,决定他是否加强以及加强的强度全部沉到下层了。 正如这篇文章所说,载体拥有看的行为,但看的能力的强度并不取决于载体。结合这篇https://www.ryu.xin/2021/07/20/bad-code/ 一起看有很深的理解。
2023-12-11 at 下午1:21
最新的api我看泛型已经没有载体了,以及配的这张图说实话没有看懂,能在图上标注一下吗?