使用Java中的annotations实现decorator设计模式 | Yet Another Thoughts 

作者:JerryXia | 发表于 , 阅读 (34)
Decorator是一个经典的结构式设计模式,有着非常广泛的应用。在经典的Design Patterns:Elements of Reusable Object-Oriented Software中,它的用意被描述为:动态地为一个对象添加额外的责任与功能。对于扩展功能,装饰器提供了比子类化更加灵活的替代方案。在许多编程语言中,比如Python,在语法上就提供了装饰器的支持,能够透明地使用装饰器。而Java则相比之下繁琐一些,通过Decorator接口的各类实现,针对被decorate的组件接口的实现来装饰。本文介绍一种基于annotation的decorator实现,虽然无法实现如python一般的透明使用装饰器,在某些情景下,也是一种灵活的实现方式。
通过decorator实现refactor_test我们想要通过装饰器实现这样的一个测试工具:我们重新实现了一个函数A,原函数是B。在调用函数A时,能够自动运行函数B,对二者的结果作比较,如果不相等,将当前的环境信息输出到日志中,以便追查。同时,不应现对函数的正常使用。这里的函数,我们要求是幂等的,无副作用的。下列全部的代码在这里。
...阅读全文

 从Java实现Singleton模式的一个bug到Java内存模型 | Yet Another Thoughts 

作者:JerryXia | 发表于 , 阅读 (34)
Singleton模式可以说是一个非常常见而简单的设计模式了。《设计模式:可复用面向对象软件的基础》中介绍,Singleton模式的用意是:保证运行环境中只有一个目标类的实例,并提供一个全局的接口获得这个实例。  
在我的Github repo conndots/design-pattern-in-action中的singleton目录中记录了python、ruby、java的单例实现方法。这里主要介绍Java的单例实现方法。《如何正确地写出单例模式》这篇博客里介绍了用java多种实现单例模式的方法,本文也有参考里面的实现。
一个看似没有问题的实现1234567891011121314151617public Class SingletonWithDoubleCheckedLockingUnsafeEdition {        private static SingletonWithDoubleCheckedLockingUnsafeEdition INSTANCE = null;        private static final Object LOCK = new Ob...阅读全文

 【方法论】2017要来了,如何设定目标,如何制定计划? | Yet Another Thoughts 

作者:JerryXia | 发表于 , 阅读 (29)
【方法论】2017要来了,如何设定目标,如何制定计划?本笔记来自于《程序员的思维修炼》的第六章:主动学习。
今天看到《好奇心日报》推荐的一个系列,2017来了,你的年度计划怎么样了?最近在看《程序员的思维修炼:开发认知潜能的九堂课》,作者就是《程序员修炼之道》的作者Andy Hunt。感触挺多,自己也去review了一下自己的计划,不仅仅是完成度,而且是计划和目标本身,是否是一个合理的计划,它的完成度是不是跟它本身有关。  
当然,虽然书是程序员相关的书,知识都是通用的,书中只有举的一部分例子来自程序员界,我觉得大部分想要通过主动学习提高自己竞争力的理工科甚至文科小伙伴都可以看看这本书。自己最近看的一些书也有些有趣的想法。本文接近于读书笔记和自己的一些想法,比较粗糙。  
有效的学习需要:  
主动学习。结合实践。及时获取反馈,并针对反馈做针对性的训练、学习。
这也是任何一个具备足够心智的人的老师/导师对你学习最重要的形式,在《万万没想到》、《暗时间》等书籍都有提及, 
只是掌握知识的提纲并不会提高你的专业水平。掌握当然有用,但是对你现实日常工作并没有贡献很多。知识本身并没...阅读全文

 如何正确地单元测试? | Yet Another Thoughts 

作者:JerryXia | 发表于 , 阅读 (28)
什么是单元测试?在Wikipedia的相关页面中有如下的定义:  
在计算机编程中,单元测试(又称为模块测试, Unit Testing)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。  
单元测试的目标是隔离程序部件并证明这些单个部件是正确的。编写单元测试是一种验证行为,更是一种设计行为。它更是以各种编写文档的行为。编写单元测试避免了相当数量的反馈循环,尤其是功能验证方面的。
单元测试已经成为了极限编程(eXtreme Programming)的标识性行为,并很快发展成为了测试驱动开发方法。  
同样的,也有单测覆盖率的概念。基本的覆盖率准则如下:  
函数覆盖率(Function coverage):有没有覆盖到程序中的每一个函数;指令覆盖率(Statement coverage):若用控制流图表示程序,单测有执行到控制流图的每一个节点吗;判断覆盖率(Decision coverage):若用控制流图表示程序,有执行到途中的每一个边吗?如if指令都有执行到逻辑运算式成立与不成立的情形吗?条件覆盖率(Condition vo...阅读全文

 深入浅出java7中的Fork/Join框架 | Yet Another Thoughts 

作者:JerryXia | 发表于 , 阅读 (28)
Fork/Join是java 7中新添加的新特性,其中ForkJoinPool用于对Jave5中添加的ExecutorService的一个补充与完善。ExecutorService可以看做是一个线程池,而ForkJoinPool是一个运行着worker线程的线程池,worker线程用于对ForkJoinTask进行并行化的计算。ForkJoinPool使用了work-stealing算法作为调度器实现。ForkJoinPool常用于利用多核处理器处理可以分而治之的,可递归运算的任务。相比于『线程池』只可以在任务级别分布到多个处理器核心上计算,ForkJoinPool可以对可分解成子任务的、不同子任务之间存在依赖的偏序关系的任务的并行化处理的管理和调度,fork/join鼓励你通过task之间通过返回future的值和构造子任务的方式进行信息传递而非共享内存与资源竞争的方式。另外一方面,ForkJoinPool在处理大量琐碎任务时也有优势。Scala的akka库(Actor model)就是基于ForkJoinPool实现的。Java8中的java.util.Arrays.paralle...阅读全文