本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

Rec:一个项目的诞生(2)

时间:2017-06-16 18:41来源:本港台直播 作者:118KJ 点击:
其实直到现在Rec的测试也只有少量的一些。而且在拆分模块的时候,因为测试代码之间的依赖比较多,并没有做拆分,所以基本上还是集中在一个模块中。

其实直到现在Rec的测试也只有少量的一些。而且在拆分模块的时候,因为测试代码之间的依赖比较多,并没有做拆分,所以基本上还是集中在一个模块中。当然这也是很多时候我自己做项目时的一个习惯:并不会完全以TDD的方式来开发,而是把单元测试作为一个验证设计思路的手段。因为很多时候思路转变的太突然,不实现的话估计下一秒钟就完全变了。而且,作为一个简单的工具类程序,并不需要重度面向对象的设计,如何规划和设计流畅易用的接口就成了必须考虑的一个问题。这个时候测试的设计性变得更明显。 另外,对于Parser这种东西,测试是必不可少的,但是要TDD一个Parser出来,基本上就是在给自己找活干了。所以这种时候,我会先加一些基本的case,来确保能够正常的实现功能,然后再引入一些比较corner的case来确保实际的可用性。对我来说,这是完全没有问题的:当然后面的实践验证了这一点,Rec没在解析文件方面出现过任何问题。

  

Kotlin vs Java()

最初采用Kotlin就是因为它有很多优点,而且这些优点也确实影响了Rec的设计,但是因为各种原因,还是被替换了两次。首先迟迟不发布的1.1版本和编码兼容性的诸多问题,导致我决定用原生Java换掉Kotlin。当然,这也导致了不得不强行舍弃很多好用的编译期检查和语法糖,以及一个用来做bean mapping的组件。 至于采用Java,则是另外一个问题。 众所周知,JSR223定义了一套JVM平台的脚本引擎规范,但是作为一个强静态类型的编译型语言,Kotlin想要契合这套规范还是很困难的,于是无论是官方的实现还是Rec的解决方法,j2直播,都不是很好: 首先你要启动一个JVM来执行这个脚本的动作;在这个动作里面,启动第二个JVM要调用Kotlin的编译器来将该脚本编译成class;然后这个编译器会再去利用自定义的classloader来加载和执行这个class文件。当所有的功能都集中在一个Jar文件里面的时候,每次都要选择指定classpath等选项,实现非常复杂。而且,由于第二次执行的Kotlin编译器是识别不到你已引入的kotlin-reflect类库的(因为已经统一包装到rec的jar包里面去了),就会导致脚本中bean mapper的一些功能根本不能使用。万般无奈,选择采用更成熟的JS引擎。 当然选择JS带来的一个好处就是,有更多人可以拿来就用了,而且,最新的Rhino提供了CommonJS扩展,能够顺手require所需的JS文件,在复用和模块化方面也能够有不少提升。

技术抉择

除了部分Parser相关的代码外,Rec采用的基本都是不可变的数据结构:一方面是因为使用Kotlin;另一方面,在整个模型里面并没有特别的需求会涉及更改数据。唯一的担心是内存占用,但是后来发现这部分担心也是不必要的,因为所有内存的瓶颈只在数据文件的Parser上,项目中的数据条目动辄数十个数据项,几十万条数据,再加上每次parse都会把一个字符串分割成多个,最后再合并到一个大的集合里面,在最开始设计的时候没有考虑这一点,轻轻松松就爆了JVM堆。这也是后期需要着重优化的一个方面。

另外一个点是关于异常处理。对于Java应用来说这是个巨坑:异常本身并没有问题,但是由于checked和unchecked的区分以及众多设计哲学的不同,所以就成了争议点所在。在这里我参考了Joe Duffy的做法。对于严重的不可重试的错误,比如文件找不到,空指针异常,atv,下标错误等,直接让程序die(没错,就是PHP中的那个die),至于数据格式错误等问题,更多的做法是做一条记录然后选择继续。当然这一套东西并不依赖Java的异常系统,只是作为一个设计原则来应用,毕竟这不是一个App server,并不需要高可用的保障,相反这种fail fast的直接反馈更有助于发现和解决问题。 在类型系统上,最初实现Rec的语言是Kotlin,它提供了一套比Java略微高级一些的类型系统。当然主要的点还是在于nullable:在功能上,nullable与Java 8的Optional类似,用来容纳可以为空的值,同时能够有效避免空指针异常;在实现上,比Java略微高出了一点的是,非nullable的对象必须被初始化并且不容许为null。这直接解决了Optional对象为空的尴尬问题。 当然,由于运行时的依赖还是无法避免地使用JVM,而且没有自定义值类型的支持,在使用Kotlin,特别是跟Java标准库和其他框架结合使用的时候,还是会遇到空指针的坑。但是在这一点上,Kotlin给我们开了个好头,比如在后面convert到Java的过程中,我也尽量保证各种对象都是final并且被非空初始化了的。

结语 (责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容