uazw blog / 总结

工程实践四总结

2015-06-02 posted in [总结]

foreword

很想说一下, 这次工程实践也是一个人做下来, 从前台到后台,以前觉得这是一件多么让人骄傲的事,
但现在看来,太过于愚蠢, 诚然现代框架的很大一块目的是为了简化开发难度, 但是即使一个小项目
在一个人头上也是很重,而且个人认为注重 的开发,是野蛮的,而开发应该是注重 的开发是优雅的。
但是即使如此我也觉得自己开始接触一些最佳实践。

best practice

测试推动开发

测试不是一个表面过程

由于我对TDD仍然不熟悉,所以并没有选择TDD来开发,而仍然先写好功能然后经行测试,在这里最重要的是
单元测试不是一个只是流程,而是一个对代码质量的重要保证, 在这里单元测试应该较为完备。

  • 正确逻辑的测试
  • 错误操作的测试
  • 异常抛出的测试

测试很有意思的是当测试的情形越多,那么就越能保证代码能在各种环境得到预期结果。 但当测试不够完备时,
基于这些代码构建更大代码,出现错误的时候,仍然要回头去看测试过的代码 并且很有有可能改变实现,
导致以前的代码无法通过测试,陷入死循环。

测试代码不是没用的代码

在最初开发生涯中,我讨厌测试,觉得是没用的代码,在随后的开发经历告诉我,测试代码应该是作为
API作者和使用者之间的文档,即通过看测试代码就可以知道代码的基本使用方式,既然测试作为了文档,
那么花精力在测试代码上,实现阅读性好,清晰。在另一方面,我们也可以用很有优秀的框架。

  • Junit
  • spring-test

Lazy vs Eager

当出现这个选择时,很多时候顶着为了效率,直接选择用lazy,然后视图处理的时候为了获取数据,又得加上一个
OpenSessionInViewFilter。这种方式好与坏我并没有测试过,只是觉得不够优雅。 那么怎么考虑这个问题呢?

  1. 可以考虑一次性加载的数据的数目,较小的话可以完全的用Eager。
  2. 第二如果映射的另一边是值对象可以完全的开启二级缓存,即使比较大的数目也应该不是什么问题(未测试,只是提供思路

Java 8的运用

java8中最让人耀眼的是lambda的加入,和方法应用(method reference),有了这两个利器以后我们可以减少一部分模板代码。

这可能是我们会遇到的一种情况,很明显这代码在形式上实在太重复了, 那我们该怎么样来改变呢?

//in method A
Entity entity = EntityRepository.findByName(String name); 	//find entity
entity.changePassword(xxx);  							    //make some change

//in method B
Entity entity = EntityRepository.findByName(String name); 	//find entity
entity.changeSex(xxx);  									//make some change

这里是另一段代码

//helper
public <T> void helper(String name, T t, BiComsumer<Entity, T> func) {
	Entity entity = EntityRepository.findByName(String name); 
	func.accept(entity, t);
}

// in method A
helper(name, String password, Entity::changePassword);

// in method B
helper(name, Sex sex, Entity::changeSex);

perfect!

anti-pattern

Optional

在 Java8中同样也引入了Optional类,我认为Optional是一种更好的空对象(Null Object)但是由于
我并没有仔细研究Optional的语义, 最佳实用时,在项目中滥用,导致了更多的模板代码。

待学习

测试的分区

我提出这一问题在于,在测试中我们需要不同的层,为了更快的测试,进行不同的配置,(例如在测试服务层的时候
为了快速可能需要用到内存数据库或者用集合(stub?)来取代实际生产中用到的Mysql之类的RDBMS。那么自然我们
需要用一种方式来快速切换配置,在spring-test中看到@Profiles这一选项但是由于时间关系,没有深入学习。

前端开发

很难想象的是前端开发如今变得如此的火,新的技术层出不穷,而前端的纷争也是很厉害啊。。

模块编写规范

  • AMD规范
  • Common规范
  • Require规范

CSS预处理器

  • Sass
  • Less
  • Stylus

(吐槽:我至今不知道这是个啥。。。

前端MVC框架

  • Angular.js
  • Can.js
  • Knockout.js
  • React.js

Grunt

同样不知

bower

也不知道