-
多态与延迟执行
上面的类图是针对最近改造的类图。 原先有多个command,执行各自的逻辑。现在由于command涉及的配置需要放缓存,抽象出config。config和command存在一定的映射关系,通过CommandFactory维持。考虑到config存入缓存时会以接口或者抽象类方式,取出时丢失了直接类型。使用VISITOR模式多态创建command。 现有command中有一个是条件型的,会根据执行时的上下文生成新的command并执行。在配置分离后,理论上变成生成新的config转换成command后执行。因为不想在CommandFactory中带入执行上下文(这样就破坏了简单的config-command关系),所以只能延迟到command执行时委托条件command的配置计算得到实际配置,再通过CommandFactory重新生成command,最后执行实际逻辑。 个人认为,这里理解的难点在于延迟执行。如果存在并不能立即决定的逻辑,则可以考虑返回一个实现某个接口的类,并包含执行的相关数据。比如这里返回ConditionalCommand,包含了ConditionalConfig和CommandFactory,在实际执行时计算。并通过CommandFactory的引用创建实际执行的Command后运行逻辑。
-
设计模式笔记1
设计模式的资料主要来自sourcemaking和《敏捷软件开发 原则、模式与实践》。 按照sourcemaking,设计模式主要分为 构造型模式 结构型模式 行为型模式 个人认为模式理解难度从低到高。 构造型模式 模式名 个人理解 FACTORY 由工厂决定创建哪个子类。多个子类,子类实例构造复杂时建议使用。Java中有基于static方法和新建工厂的方式。 ABSTRACT FACTORY 子类实例构造分组,比如多个“平台”,超类包含通用逻辑。“平台”与子类的实例矩阵。 BUILDER 多步创建。如果单步(方法)的参数比较复杂时推荐使用。 OBJECT POOL 对象池,典型如commons-pool,需要考虑并发问题。 PROTOTYPE 以某个实例为蓝本创建其他实例。Java中需要实现clone方法。
-
简易顺序执行框架attic开发笔记1
最近业余时间在写一个叫做attic的东西。attic的灵感来自《敏捷开发》中的验收测试,比如下面的验收测试脚本: AddEmp 1429 “Robert Martin” 3215.98 Payday Verfiy Paycheck EmpId 1429 Grosspay 3215.88 这是不懂编程的人,具体来说是业务人员也能看懂的验收测试脚本。《敏捷开发》没有对脚本的执行与实现做介绍,但是我觉得我get the point了: 按照行解析执行命令(Command) 类似CSV方式解析行,因为存在空格,不能直接按照空格split 有很多命令,需要命令库或者动态加载命令 转化为程序设计就是 val context = new CommandContext file.getLines.foreach{line => createCommand(line).execute(context) } context是命令之间交互的载体,个人认为命令之间肯定存在依赖关系 createCommand完成解析和创建命令,可能是这样: def createCommand(line: String): Command = { val cmdNameAndArgs = parse(line) val cmd = Class.forName(cmdNameAndArgs.name).newInstance.asInstanceOf[Command] cmd.setArguments(cmdNameAndArgs.arguments) return cmd } 这里cmd直接用load class的方式,便于扩展。parse部分相对难一些,我暂时用空格分割实现,之后肯定要换成类似CSV解析格式。 以上就是attic开发笔记第一部分。
-
scala模拟ketama算法
ketama是memcached客户端使用的一种一致性哈希算法。是为了解决余数实现分布不均匀的问题,在last.fm的一篇博客中首次提到。这里有一些介绍链接,其中第一篇是原博客。 http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients http://blog.csdnnet/kangojian/article/details/6708460 http://tech.idv2.com/2008/07/24/memcached-004/ 原博客里面提到算法步骤如下: Take your list of servers (eg: 1.2.3.4:11211, 5.6.7.8:11211, 9.8.7.6:11211) Hash each server string to several (100-200) unsigned ints Conceptually, these numbers are placed on a circle called the continuum. (imagine a clock face that goes from 0 to 2^32) Each number links to the server it was hashed from, so…
-
null-safe和scala的monad
长久以来,习惯了写如下的Java代码: User user = userService.get(1); if(user != null) { doStuff(); } 称之为null检查,亦有null != user的尤达式写法。 在学了Scala之后,知道了Option,改用如下写法:
-
从vim切换到emacs小记1
在阅读了《Unix编程艺术》之后,开始尝试emacs。据说有vi派,emacs派,但是基本没有vi+emacs派,我很好奇其中原因,但是在阅读完emacs自带的教程之后(c-h t),有点明白为什么基本没有两者都用的了。不过派系的想法终归派系,重要的还是使用方法。下面讲一下我的切换体验。 如何打开emacs 不要笑,很基础的问题。ubuntu下通过sudo apt-get install emacs安装之后,直接emacs出来的是GTK的emacs。以前没留意过是否有类似vi在CLI中的模式,最近才知道输入 emacs -nw 启动emacs的话就不会打开GTK的了。赶紧alias emacs=’emacs -nw’保存起来。
-
个人小结的Java中常见日志与异常处理实践
原本我以为日志和异常没啥东西,只要按照《Effective Java》中编码就行。但是实际情况告诉我写Java代码的人有些不知道《Effective Java》,还有些人只会依样画葫芦,甚至把错误的拼写比如accessable也一并画了下来。更让我头疼的是,两者加在一起导致的前人所有的异常都打印ERROR级别日志+抛出异常,后面的人想也不想一样的也全打ERROR级别日志+抛出异常。好吧,其实我想说打印日志也是有好的实践的,Java的异常也不是随便乱用的。 不是所有异常都需要打印ERROR级别日志 这很明显,但是似乎有人不明白什么时候不打ERROR级别日志。以下是个人建议的级别使用策略:
-
commons-httpclient 3.x如何按照host单独配置连接数和超时参数
以下内容是个人工作中对commons-httpclient分析的小结。 jakarta commons-httpclient是常用的HTTP Client实现,基于HTTP的协议比如SOAP的一些实现比如XFire也有使用commons-httpclient。作为一个常用的类库,学习如何正确和高效地使用是非常有必要的。 首先,按照官方网站的建议:为了提高性能,建议使用单个httpclient实例。(个人认为开启多个Http Client就像开启多个浏览器实例一样……) 第二,并发情况下使用MultiThreadedHttpConnectionManager,这条不难理解。 接下来是参数配置。官方网站提供的配置文档 中提供了很多参数,这里给出连接数和超时配置(大部分都是配置在HttpConnectionManager级别的:
-
linux命令使用小记5
多目录之间跳转 使用dirs, pushd, popd就可以做到。但是命令多了容易混淆,我其实只记得两个目录快速跳转方法: pwd # dirA cd dirB pwd # dirB cd – pwd # dirA cd – pwd # dirB 使用alias快速登录服务器 alias serverA=’luit -encoding GBK sshpass -p passWord ssh -t user@server screen -RR’ 把alias设置在.bashrc中,接下来就能输入serverA快速登录服务器了。 解释下命令:luit用来解决GBK服务器编码问题;sshpass用于输入密码;ssh的-t参数表示强制伪终端,screen需要;screen -RR表示有screen session就使用,否则就新建。
-
git svn使用小记
之前,个人写过使用git管理svn的文章,距离当时差不多有两个月了,说说自己在这两个月内学到的一些小东西。 svn认证哪里去了? 使用git管理svn的时候,个人一个明显的感受是svn那“烦人”的认证信息没了。当初git clone到现在只有一次认证提示,我很好奇git是怎么做的。 后来有一次认证信息改变了,git svn dcommit时那个熟悉的svn认证输入提示又出现了,这时我恍然大悟,git其实是采用svn的认证存储机制。虽然是用git管理svn,但是并没有用git特色的ssh key方式。之前git clone没有出现认证提示的原因也是因为git使用了svn的认证(我以前输入并保存过)。