设计API时要区分其目标用户群
提供给客户端代码的API与为开发商提供的API是不同的。
1.API升级
(1)抛出异常模式,不太好,用户升级一次每个api需要写好几行代码
(2)
预留参数
设计时最好哪些不准备别人继承的类都用 final 修饰
2.合理分解API
一类供他人调用来完成某些功能(final类);一类供他人来扩展API的(预留参数)==>可读性和代码升级需要
面向对象的语言都有内聚性的倾向,查找资料时,可以方便看出。
(1)把有关联的方法放置在同一个类中
(2)对于一些无关的方法,决不能因为一时无法找到更合适的位置来放置,就随便放入与它们无关的地方
(3)把有关联的类放置在同一个包中
(4)把一些只有特殊场景下才用的到的类转移到其他地方
牢记: 使用API的人可能是多个不同的用户群
总结: 最好是把实现类分开放置在不同的包里,让用户很难找到这些类,也避免API用户有机会一下子拿到这么多的类
api和spi
如,具体实现放到它自己的模块里,然后通过独立的API进行版本控制
API: 用来供他人调用来完成某些功能的内容,API包中的类应该是自包含的,不会引入人很SPI包中的内容
SPI: 用来供他人来具体实现的内容
API分类
核心类型的API: 用户往往只关心类库提供了哪些功能,这个类库执行某些关键API
支持类型的API: 大量实用方法,让用户更容易使用,用户不一定用,只是为了让用户感到安慰,它们只是助手类,非必须内容
核心类型的SPI: 提供另一用户群使用接口,拓展类库功能。如果不允许外部提供拓展功能,则不需要提供这些内容
支持类型的SPI: 助手
这种方法很容易对API演进。