代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6350 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

13 | 接口规范,是协作的合约

范学雷 2019-02-01
一个软件项目,一般需要交付两类文档。一类文档是面向开发者的,另一类文档是面向最终用户的。这两类文档,由于面向用户的不同,无论是内容还是形式,都有巨大的差异。今天我们先来聊聊面向开发者的文档。下一讲中,我们再接着聊面向最终用户的文档。

区分外部接口和内部实现

为了便于维护和协作,一个软件通常被划分为几个不同的部分。比如我们通常使用的 MVC 架构,把软件分为模型(Model)、视图(View)和控制器(Controller)三个部分。这样做,可以降低复杂度,让程序结构更加直观。同时,这种架构也很容易对程序进行修改和扩展,并且可以重复利用基础的功能。
不同功能的分离,让程序员之间产生了分工,专业人员可以更聚焦于个人的专长领域。这是一个多赢的局面,也能让软件的质量得到提升。
既然有分工,就要有协作。MVC 架构把软件拆分为三块,是分工;而 MVC 模块之间的调用关系,就是协作。
一个好的软件设计,要区分外部接口和内部实现。外部接口,就是协作的界面,要简单规矩;内部实现,可以是千变万化的复杂小世界。
这种区分无处不在,即使是最普通的 API。比如我们常用的 InputStream,一旦我们获得这个对象实例,就可以调用它的 read() 方法。 我们不用去关心,它的底层实现是一个文件,一段内存,还是一个远程连接。InputStream 的接口定义只有十个方法,短短的 500 多行代码。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(7)

  • MOV AX,0
    关于更新接口的问题,我所知的做法一般有两种:
    1.对于外部部门调用的公开接口,如果有修改,需要提前知会各部门负责人。负责人委派一名同事进行对接,我们协调好接口规范整理出文档。在近期版本,上线这个新接口,但不马上废弃旧接口,只是标注@Deprecated。等待所有部门在后续版本替换完新接口后,检查接口调用情况,确认没有任何调用后进行移除;
    2.如果是作为开放平台公开出去的接口,或在更改接口实现逻辑前需要额外流程(比如DB变更、数据源切换等),需要加入类似如下的逻辑:
    if (isNewProcess()) {
         return executeByNewProcess();
    }
    return executeByOldProcess();
    目前公司是使用携程的Apollo配置中心实现公共配置,比如近期我们遇到一个查询会员账户总余额&积分统计的DB慢查询问题。我们将查询数据源改为从大数据获取,但是在大数据可能出错或挂掉的情况,就可能导致一系列问题。所以我在apollo配置了三个开关:
    a.所有数据从大数据获取(boolean)
    b.从大数据获取统计信息的商户ID(list)
    c.所有统计数据直接返回0的商户ID(list)
    容错性非常重要,如果大数据方面数据不可靠/接口挂掉,切到直查DB后,针对会员数很多的大商户,还需要直接返回0禁止DB的慢查询拖垮库。
    同理,开放平台的接口,如果修改在线上的应用具有不确定性,一定要有后手,可以换回旧逻辑。测试环境通过,并不代表线上也通过!

    作者回复: 非常棒的经验,多谢!

    2019-02-01
    12
  • 周锐
    提供/调用接口甩锅指南:
    1、提供接口:a、打印传入参数;b、对参数做验证,不合规就回抛异常;c、返回之前打印返回结果。
    2、调用接口:a、调用前打印调用参数;b、调用后打印返回结果。

    作者回复: 检查参数还不够吗?

    2019-02-01
    5
  • Sisyphus235
    接口规范是好事情,但是如果业务变动非常大且频繁,接口就需要不断修改,这样规范的接口反而带来很大开发消耗,或许接口规范也要根据实际情况灵活调整,必须写清楚的是传参,其他部分根据情况来使用。

    另外,使用类似于 Protocol Buffer 的工具不仅能让协作者清楚知道接口情况,且能 parse 和 unparse,避免很多接口错误。

    作者回复: 频繁变动的接口是个灾难。接口设计一定要舍得花时间。

    2019-05-22
    1
  • 彩色的沙漠
    App开发和后端交互,更多是接口的调用者。同时也是接口规范的参与者,因为不了解移动端的交互,我们作为调用者更清楚需要什么。
    2019-05-06
  • 小文
    唉 我做游戏开发的从没有写过这个东东

    作者回复: 忧桑,没接触过游戏开发,一点也不懂。游戏不开发公共接口吗?

    2019-02-18
  • 秦凯
    在接口申明中将“积雪”(节日)的样式作为配置参数,并且默认为不应用。只有当开发者主动配置时才会应用节日特效。并且将此特性记录到使用规范文档中供使用者参考,好让使用者可以清晰明了的使用API。

    作者回复: 这是一个好办法! "默认为不应用"是一个常用的解决兼容性问题的办法。

    2019-02-14
  • 逆风飞翔
    请问一下专栏内容有印象笔记版本吗

    作者回复: 我没用过印象笔记,应该没有这个版本。

    2019-02-01
收起评论
7
返回
顶部