模块化函数、 错误处理实践、代码可读
http://www.yinwang.org/blog-cn/2015/11/21/programming-philosophy
过度工程:可用 再 重用、可测试。
1.模块化的函数,40行(笔记本屏幕不用滚动是50行。)
编译器做的事:自动的把小的函数内联(inline)到调用它的地方,所以根本不产生函数调用,也就不会产生任何多余的开销。
2.逻辑清晰
共同点少于它们的不同点:拆出函数比通用函数逻辑清晰。
共同点多于它们的不同点:辅助函数逻辑清晰。
3.避免全局变量 | 类成员通信,造成依赖
而要利用局部变量和参数通信。
可读性代码
代码一旦修改,注释就需要维护,所以要利用好程序语言提供的表达力。
1.有意义的名字
2.局部变量靠近使用它的地方,如同短距离的电路导线,易理解。
3.不要重用局部变量
4.复杂逻辑做成帮助函数。
写简单代码
1.取代foo(i++) 使用int t = i; i += 1; foo(t);
编译器做的事: 生成机器码,两种写法并无二致。
2.continue的条件取反,剔除continue。
写无懈可击的代码
1.保持if和else同在,而不是省略else依靠控制流。
2.函数式,只赋值一次。
1 String s; 2 if (x < 5) { 3 s = "ok"; 4 } else { 5 s = ""; 6 }
错误处理实践
1.早抛出晚捕获其实说的是,这里函数会throws异常,我们要去处理,如果只是catch,等下处理可能只是log下日志(当然这是必须的)而已。
更不能忽略掉直接抛出Exception,这是一个非常不明确的异常。(进一步说明 不抛异常的函数可能不好调试)
2.不要产生null指针,如果要表示出错,使用异常代替。
2.3 不要让null指针传播:Objects.requireNonNull(),抛NullPointerException让程序宕掉,态度是说了我的函数不让用null。
2.5 IDEA的做法是提供了@NotNull和@Nullable,直接抛IllegalArgumentException。
2.7 java8的做法提供了Optional,把检查和访问放一起的机制。 (不建议使用,很蹩脚)
Optional<String> found = find();
found.ifPresent(content -> System.out.println("found: " + content));
3.catch NullPointerException 不是容错,而是有人忘记检查合法性了。
4.容器list set array不要放null,完全可以filter掉null来表示没有。

浙公网安备 33010602011771号