模块化函数、 错误处理实践、代码可读

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来表示没有。

 

posted @ 2018-03-27 10:46  chenhui7373  阅读(251)  评论(0)    收藏  举报