程序员可以分为三个层次:普通程序员、工程师 、架构师
格式
1、格式的目的
(1)代码格式关乎沟通,而沟通是专业开发者的头等大事;
(2)选用一套管理代码格式的简单规则,然后坚持贯彻执行
(3)团队应该采用一致的格式规则
2、垂直格式
(1)名称应该简单且一目了然,最顶部应该给出高层次概念和算法,细节应该往下渐次展开
(2)在封包声明、导入声明和每个函数之间,都要有空白行隔开
(3)关系密切的概念应该相互靠近,除非有很好的理由,否则不要把关系密切的概念放到不同的文件中
(4)变量声明应尽可能靠近其使用的位置
(5)如果某个函数调用了另外一个,就应该把它们放在一起,而且调用者应该尽可能放在被调用者上面
(6)概念相关的代码应该放到一起,相关性越强,彼此之间的距离就该越短
3、横向格式
(1)应该尽量保持代码行短小,遵循无需拖动滚动条到右边的原则
(2)空格字符加强了分隔效果
对象和数据结构
1、数据抽象
(1)无需暴露数据细节,以抽象的形态表述数据
2、数据、对象的反对称性
(1)对象吧数据隐藏于抽象之后,暴露操作数据的函数
(2)数据结构暴露其数据,没有提供有意义的函数
(3)过程式代码(使用数据结构的代码):便于在不改动既有数据结构的前提下添加新函数
(4)面向对象代码:便于在不改动既有函数的前提下添加新类。
3、得墨忒耳律
(1)模块不应该了解它所操作对象的内部情况,例如面向对象编程,隐藏数据,暴露操作
(2)应当改写连串的调用
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
应该改成如下格式:
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
4、数据传送对象
(1)bean结构,拥有赋值器和取值器操作的私有变量
错误处理
1、使用异常而非返回码
2、先写Try-Catch-Finally语句
(1)在编写可能抛出异常的代码时,先写出Try-Catch-Finally语句
3、使用不可控异常
(1)可控异常的代价是违反开放封闭原则,得到一个从软件最底端贯穿到最高端的修改链
4、给出异常发生的环境说明
(1)你抛出的每个异常应该提供环境说明,以便于判断错误的来源和处所
5、依调用者需要定义异常类
(1)在应用程序中定义异常类,最重要的考虑是它们如何被捕获
6、定义常规流程
(1)特例模式:创建一个类或配置一个对象用来处理特例
7、别返回null值
(1)返回null值,基本上是给自己增加工作量,也是在给调用者添乱,只要一处没有检查null值,应用程序就会失控
(2)如果你打算在方法中返回null值,不如抛出异常,或者返回特例对象
(2)如果调用的某个第三方APi中可能返回null值的方法,可以考虑用新方法打包这个方法,在新方法中抛出异常或返回特例对象
return Collections.emptyList();
8、别传递null值
(1)除非API要求你向它传递null值,否则尽可能避免传递null值
throw InvalidArgumentException( "Invalid argument for ..."
(2)时刻记住参数列表中的null值意味着出问题,从而避免无心之失
边界
1、使用第三方代码
(1)第三方代码帮助我们在更少的时间内发布更丰富的功能
2、浏览和学习边界
3、学习性测试的好处不止是免费
(1)学习性测试能够帮助我们增进对API的理解
(2)当第三方程序包发布了新版本,我们可以运行学习性测试,看看程序包的行为有没有改变
4、使用尚不存在的代码
5、整洁的边界
(1)良好的软件设计无需巨大投入和重写,即可进行修改
(2)边界上的代码需要清晰的分割和定义了期望的测试
(3)依靠你能控制的东西,好过依靠你控制不了的东西,免得日后受它控制。
-------------------------------------------------------------------- end -------------------------------------------------------------------------------------