很少有人能够以合理的方式来分析一个新API。没有人在学习使用一个API的时候,去尽力理解该API背后的设计思路。现实正是如此:现在的开发人员想的是在无需理解所有内容的情况下,尽快完成他们的工作,如果他们使用的API能够完成他们的工作,就不会花时间来深入思考这个API。 在本书第1章中提到的那些经验主义哲学家,如果看到了这种情况,想必会非常自豪。不需要花费大量时间来思考、学习和理解相应的内容,开发人员就可以通过尝试调用API中的某个方法来测试是否可以完成其目的。如果测试结果正确,开发人员就会很开心。如果测试结果不正确,开发人员就会继续调用别的方法。NetBeans开发人员把这种开发方式称为经验主义编程方式(empirical programming):先用一个API做个实验,如果不成功,就再试一下别的。经验第一,然后才是深入了解。不过有时候,并不需要深入了解。 因此这就对API的结构提出了要求。API必须是自描述的,即用户无须任何文档就可以正确使用该API。这样的API能引导用户利用其提供的各种功能和元素来轻松地完成任务。用户在编写代码的时候,能很容易找到解决方案。IDE能够提供各种提示,但都应该是与主题相关的,且不会将用户引入歧途。只有这样,凭经验去使用API才能成功。 返回值不能为空 我必须承认,相比去深入理解某个用到的API,我也更喜欢这种“经验式编程”,特别是调用那些有返回值的方法时。 在Java语言中,null值是一个非常特殊的东西。任何一个变量类型都可以通过obj=null的方式被赋成null。当调用这个对象方法或者访问其字段的时候,就会抛出一个NullPointerException。在一个表现良好的程序中,应该避免出现这种问题。开发人员可以在调用对象方法或者访问对象字段时之前,先通过obj!=null来避免出现这种问题。但这样做会使代码变得非常零乱,而且难以阅读。 这样导致了某些程序员都把null作为一个异常值,在设计库的时候,他们都会尽可能地避免使用null。经常会在Javadoc中看到这样的说明文字:“这个方法永远都不会返回null。”NetBeans项目组把这个规则作为一个默认的规则:除非一个方法中声明了它可以接受null作为参数,或者允许方法的返回值为null,否则这个方法就不能接受一个为null的参数,也不会返回一个为null的值。 虽然,不管文档中对一个方法承诺了多少这方面的内容,但还是会发现有大量的代码对返回值是否为null进行检查。这些检查的结果值不能是false,但开发人员不能确定,尤其在没有阅读相关文档的时候。 这是一种防御性的经验主义编程方式,我经常也会使用这种编码方式。这样做可以保证程序运行时的安全而不出乱子。很容易就可以检查出null值,然后结束执行,而不是等程序发布给了成千的用户,再莫名其妙地抛出一个NullPointerException异常。 有时,创建能够复制和容易修改的示例代码,对那些第一次试用一个API的程序员是很有帮助的。如果这些示例代码能够包含API常用的功能,那么这个试用者会觉得这样的API比较容易使用。然后,要深入API编写代码就会复杂一些,而且可能还需要读上一些文档才行。这可以接受。如果某个人投入了一些时间和精力来试用某个API,并完成了任务,那么他对这个API的态度就会变得积极主动。此时,他会感觉这个API很有用,自然愿意花费一些时间来阅读相关文档,并发现API提供的一些其他功能。 我们总是使用“经验主义编程方式”,每一个API都需要支持这种类型的用户。如果一个API的方法名称、类名称以及方法的组合处理都能够帮助开发人员正确地编写代码,那么即使第一次使用该API的开发人员也能正确地使用该API,并愿意多知道一些关于此API的内容。
软件框架设计的艺术——2.4 经验主义编程方式
书名: 软件框架设计的艺术
作者: [捷克] Jaroslav Tulach
出版社: 人民邮电出版社
原作名: Practical API Design: Confessions of a Java Framework Architect
译者: 王磊 | 朱兴
出版年: 2011-3
页数: 388
定价: 75.00元
装帧: 平装
丛书: 图灵程序设计丛书
ISBN: 9787115248497