自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

Guice随笔

随着时间的推移. 当初吵翻了天的依赖注入再也不是什么新鲜玩意儿.在日复一日给资本家拉磨的平淡中, Spring和自己写的小玩具也都被扔在记忆的垃圾堆里不必提起. 对Guice的激情也逐渐磨灭到麻木和冷淡了.日常一些邮件列表中, 仍然能看到对使用Guice之类框架的反感或者死忠的两种截然不同的观点碰撞, 甚至于是否使用依赖注入也仍然没有尘埃落定.个人从前是依赖注入的坚定粉丝,...

2010-11-14 06:54:26 123

瓜娃系列 (7) - 外面很多坏银地

为人父母, 一个比较纠结的事情, 就是到底怎么保护那个啥也不懂的小家伙. 如果护着她太紧了, 会不会让她失去和外部接触, 学习的机会, 变得孤僻, 依赖性强? 如果保护不利, 被人欺负了, 或者甚至被拐跑了, 后悔药没地方买呀. 到底要不要告诉她外面有很多坏人呐?唉. 不自寻烦恼了. 埋头写代码!不过, 嗯, 这个好像我写代码怎么也在想着类似的东西? "要不要检查这个参数是不是nu...

2010-08-19 13:30:13 134

瓜娃系列 (6) - ComparisonChain和primitives包

有时候我们不可避免地要实现Comparator, 好做排序之类的事情.要比较两个整数的时候, 我一度曾经这么写:[code]return a - b;[/code]多简单啊! 如果a比b大, 无疑这个东西返回正数了.可惜啊, 现实永远比理想残酷. java的整数不是数学中的整数, 它可能溢出地![code]int a = -2000000000;int ...

2010-08-18 13:16:40 138

瓜娃系列 (5) - 合久必分, 分久必合

用瓜娃以前, 每当遇到把一串东西用逗号分割打印出来的需求, 俺都有点烦. 这算是挺简单无聊的活, 但是每次写起来那代码总是觉得象56k猫拨号上网那么让人磨牙:[code]StringBuilder builder = new StringBuilder();int first = true;for (String s : strings) { if (first) {...

2010-08-16 13:37:04 162

瓜娃系列 (4) - Resources和Files

另外一对我经常需要用到的, 是[url=http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Resources.html]Resources[/url]和[url=http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/...

2010-08-16 12:17:52 142

瓜娃之走马观花 (3) - CharStreams和ByteStreams

其实guava可以看成是支持java5的apache commons之类的项目.第一第二回讲的主要是集合类的一些最常用的工具. 其实com.google.common.collect里还有很多非常有用的工具, 比如[url=http://guava-libraries.googlecode.com/svn/tags/release05/javadoc/com/google/common/col...

2010-08-15 13:22:14 302

瓜娃之走马观花 (2) - Make me a Map as fast as you can

古人云 (无图无真相, 有美女走光图为证):[quote]Pat-a-map, Pat-a-map, maker's man,Make me a map as fast as you can...[/quote][img]http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Pat-a-cake%2C_pat-a-cake...

2010-08-14 13:14:43 143

瓜娃之走马观花 (1) - List和Map

[code="java"][b]序[/b]花开花落,花落花开。少年子弟江湖老,红颜少女的儿子都会打酱油反三俗了.蓦然回首, 那个仿佛刚刚还在上幼儿园, 拉着我的手让我带着到麦当劳买鸡块冰激凌吃的小屁孩儿; 上了小学, 抱着我给买的盗版commando苦苦钻研攻略的小表弟, 开始写java程序了!暑假去小表弟学校宿舍晃了一下. 书桌上随手堆着的可乐矿泉水瓶; 书桌下凌乱的鞋子...

2010-08-12 13:13:07 163

SQL 小技巧

很久不搞sql了。整天就是java, java,也挺无聊的。其实想想,sql还是挺好玩的,尤其是把别人吭哧吭哧几百行的stored procedure改写成一个简洁的query,或者一个本来要跑十分钟的stored proc改成几秒钟,感觉还是满爽的。闲来无事,把一些小技巧回忆下来,省得以后考人的时候想不起来了。1。一个基金performance表,记录着每个基金的每个月相...

2008-08-20 11:13:12 112

getThis().getEvilAdvocate().setDead(getTrue())

code review过程中,看到这样的代码:[code]Pair getFooAndBar() { ...}[/code]恶魔说,弄个Pair来表达FooAndBar不太容易理解,要不干脆弄个类把foo和bar封装起来,返回出来吧。天使:“同意”。下一版代码:[code]class FooAndBar { private final S...

2008-08-14 04:15:40 147

动态properties转换

今天同事和我讨论他遇到的一个问题。具体要求是这样的,在运行时,我们会从模块G得到一个Map,这个Map里面都是一些字符串对,你可以理解成一个字典,有字符串的key和字符串的value。简短节说,就是[code]Map[/code]非常非常复杂深奥。好,现在我们事先知道要从这个map里读取一些数据点,比如:id, name, sex等等。对id,我们知道读出来的是int;对n...

2008-05-07 06:06:13 129

怎样最有效地测试异常?

工作中,和同事对测试异常的最佳方法产生了分歧。我是比较欣赏JUnit4的@Test(expected=FooException.class)的啦,觉得这样多清爽啊,多declarative啊,再不用写那么一大坨try-fail-catch了。不过同事(以下简称S)不这么认为。他觉得try-fail-catch挺好的,价格便宜,量又足,我们一直用它。而JUnit 4和TestNG提供...

2008-04-02 21:56:30 169

为中国的未来担忧,我,上过大学,学过计算机,英语六级,当过DBA,架构师,软件工程师,还得自己扫雪!...

哎,一到下雪我就头疼。又得推着扫雪机吭哧吭哧扫雪。就说是三月学雷锋树新风,也不能总这样啊。妈的,还是住condo舒服,啥都不用干。住大房子?奉劝诸位还是等有钱养保姆,丫鬟,家丁了再说。...

2008-03-23 03:06:15 160

祝贺Guice拿了Jolt Award

我对计算机界的八卦一向都不太敏感,也对很多所谓的“名人”不感兴趣。你说那章子仪,Britney好歹还能拿脸蛋,衣服,和衣服里面的东西来娱乐大众,一帮不知道哪来的猥琐男就写了点谁都能写的程序,又不是证明了歌德拔河,也不是火箭科学,有什么好追星的?所以对Guice拿了Jolt也是后知后觉。不过在知道Guice是打败了Spring拿到的奖的,还是颇觉得欣慰了一下。要说Guice也不是多完...

2008-03-10 12:21:20 264 1

rparsec在《Pracical Ruby Projects》中

最近发现《Practical Ruby Projects》用rparsec来讲解怎么在Ruby里构建lisp。于是假公济私地用公司的账户订购了一本,也算给自己捧场。书拿到,打开一看,好么,被批评了 :( [quote]Caution: For such an excellent library, rparsec plays very fast and loose with name...

2008-03-04 02:37:04 104

中了annotation的毒了

在1.4上,我最喜欢玩的是dynamic proxy。以前的那个Sum的“奇技淫巧”就人人喊打来着。自打不用担心对1.3, 1.4的兼容问题后,我发现我越来越爱拿着annotation的锤子到处乱砸了,而且是用reflection而不是apt。给Guice加了一个@Provide的外壳:[code]class MyModule extends AbstractModule { ...

2008-01-31 08:27:11 97

俺摸,俺摸,俺默默摸 (2)

那啥?刚才说到哪了?“如云朵般的呵护”?下面谁说的?给我拉出去好好“呵护呵护”!人家没那么说啦!讨厌!是刚才广告里说的嘛!我说刚才我们“俺摸”系列说到哪了?对了,说到我们可以这么用PorkMockTest:[code]public class LionHeadTest extends PorkMockTest { public void testHuoHou() {...

2008-01-17 00:31:29 233

俺摸,俺摸,俺默默摸

猪肉炖粉:“那啥,猪哥啊,这两天你身价大涨,发了吧?忙啥呢?”一只猪:“可不是!到哪儿都被采访,这名猪也有隐私权滴!最近特想过普通猪的生活。这不,洗尽铅华,老老实实地躲圈里整Java呢”话说这Java的一级摸客(EasyMock),老猪最近用的满多的。在Java 4里面不忍卒睹的代码在java 5里面骤然变得性感许多。不过用的多了,也发现有些不方便的地方。最不爽的就是:俺老猪不是粗心吗...

2008-01-16 23:50:27 345

摹客测试蛛丝程序中的绑匪

为了响应伟大的“抵制中英文夹杂的资本主义不良思潮”运动,本文将全部用中文书写(代码暂时例外)。最近工作需要,发现要写代码扩展“蛛丝”来实现一个春天遗留系统的移植。基本上就是围绕着春天的“应用上下文”和蛛丝的绑匪/模块来上下其手。在测试的的时候,习惯性地选择用“简单摹客”来测试行为。摹客春天的应用上下文和豆子工厂真是简单啊:[code]ListableBeanFactory ...

2007-10-11 10:45:45 92

虎父无犬女

最近一些朋友纷纷给下一代开了blog,孩子她妈看着眼馋,急扯白脸地也给我家蓓蓓开了一个。博客刚开张,急需人捧场,孩子他爸只好风餐露宿,提心吊胆地满城找电线杆子,站牌儿贴小广告。某一日再次被东城城管打得满头包,被撵得惶惶如得冠军的刘翔,气喘吁吁之余忽然想起家爱这儿似乎民主得很,小报不怕乱贴,标题党不怕乱做,挖坑只怕不深,盖楼不怕违章。虽然这样一来有可能暴露俺一只猪名花有主的身份,对以后和广大...

2007-08-13 05:56:51 140

JUnit Sucks

好象貌似有本书是用写一个JUnit作为例子来讲解TDD的。要说TDD绝对是个好东西,不过TDD本身并不能保证搞出好软件。这不,Junit就是个活生生的例子呀。一直以来,我写Junit+Easymock测试都是这么来的:[code]public class SomeTest extends TestCase { private final IMocksControl cont...

2007-08-05 10:16:10 88

什么时候使用assumption?

问题背景,定义三个概念先:1。percent。就是百分比。2。weight。如果percent是10,weight就是0.1,weight=percent/100.3。amount。如果percent是10,总数是1000,那么amount就是100. amount=total*weight.在程序中,我们很多时候需要在amount, weight, percent之间来回转换...

2007-02-16 19:20:49 167

DRY与简单性的平衡

这个事例说起来相当简单。不过小中见大,它大致体现了我和pair在DRY vs. 简单性上的差别,和那个“这样代码重用”里面的例子体现了同样的分歧。目标是重构下面的测试代码:[code]public void test1() { Account acct = new Account(); acct.setName("test"); acct.setType(Type...

2007-02-16 18:45:57 97

Web AOP?

今天这个其实不是争论。这是我接手的一个web系统的一个设计。我觉得很不爽,但是一时又没有好的解决方法。情况是这样的。我们的web app是一个传统的jsp+controller+dao的设计(Controller用的是我们元老自己设计的一个框架)。这个app我们叫做product。除此之外,我们还有一个定制版本的app。这个定制版本是给某个客户定制的。功能和...

2007-02-16 11:12:00 161

依赖是否可以作为一个独立的衡量软件质量的标准?

这个争论的背景有点复杂。我就尽量简化了说。遗留系统有一个自制的service locator。是一个静态函数:[code]public static Object newObject(Class interfaceOrDefaultClass, Class[] parameterTypes, Object[] arguments);[/code]使用起来是这样:[cod...

2007-02-12 05:03:50 97

这样代码重用?

这是一个工作中遇到的背景比较简单的争论。有这么一个persistent object,姑且叫它Plan吧。有这么两个函数:[code]Plan getPlanByName(String userid, String planName);Plan[] getPlans(String userid);[/code]getPlanByName内部执行的是:...

2007-02-12 03:09:37 78

jdbc还是ibatis?

公司的一个大系统的持久层一直是直接使用jdbc。在jdbc的基础上,又自制了一个简陋的cache。每个持久功能的实现都比较类似,大致相当于这样:[code]MyProprietaryConnection conn = ConnectionManager.checkOut(Database.DB_NAME);try { PreparedStatement stmt = co...

2007-02-06 03:59:08 148

一致性和Use Right Tool For Right Job哪个重要?

这个争执发生在测试的时候。背景是这样的:一个接口有很多乱七八糟的业务相关的方法,其中有这么四个方法:[code]interface TaxLawBuckets { double getRemaining401k(); double getRemaining403g(); void apply401k(double amount); void apply403...

2007-02-05 12:52:20 283

关于 Replace Temp With Query

这个I disagree系列里面我准备把所有在工作中技术上的争执记录下来。也有立此存照的意思。也许再过几年,回头一看,会自己bs自己一把呢。今天要记录的,是一个关于martin的refactoring那本书里提到的"Replace Temp With Query"的重构技术。事情是这样的。在和同事pair的时候,对他频繁使用的这个重构不太同意。搞得同事很不爽。很不好意思的是,我并没...

2007-02-05 11:55:19 533 3

复杂还是不复杂?

问题是这样的。一个MyService类里面,有一个MyResponse runService()函数。这个runService函数会调用一个web service来得到MyResponse对象。这个MyResponse对象在runService()函数中被缓存,然后返回。现在的目标是,在runService返回以前,先把MyResponse clone一下,然后如果MyResponse.g...

2007-02-04 04:01:44 146

奇技淫巧?

这里讲述的是一个非常让人尴尬的故事我们有一个简单的java类:[code]class Details { double getBalance(); double getFixed(); double getVariable(); double getSpendDown(); ... //各种getter以及其他相关的逻辑}[/code]...

2006-12-20 11:24:18 269

我的酒窝

场景一:个人喜欢state-based的单元测试。(定义见mock is not stub)。可是有些时候,比如在测试一些使用java.sql.Connection, ibatis SqlMapClient等接口的类的时候,明显写stub很不好。(1,接口很大,有很多不相干的东西。2,版本一旦变化,这些接口可能跟着变化,如果写stub的话,就意味着stub要跟着这些第三方接口变化)...

2006-12-10 15:23:29 135

论面向组合子程序设计方法 之 微步毂纹生

最近。age0提出了一个OO设计的问题。因为这个例子更加贴近生活,是我们老百姓所喜闻乐见的商场折扣问题,所以我准备改铉更张用这个例子了。具体的例子请看:http://forum.iteye.com/viewtopic.php?t=17714&start=0简要的说,需求是:[quote]有这样一家超市,对顾客实行会员制,会员目前分为两个等级:金卡及银卡。每次会员购物时,都会根据...

2006-01-04 14:42:28 207

论面向组合子程序设计方法 之 重构2

已经有点感觉用ioc container来说明co不见得是个好主意了。这个container的例子举出来,明显提出意见的人比那个简单的logging例子少了很多。毕竟连pico是怎么回事,怎么用,很多人都还不见得了了。更不提多少人对pico的用法就是一个很in的fancy factory。买椟还珠。不过,既然开始了,让我还是有始有终吧。这章还是让我们看看co的r...

2005-08-21 12:42:03 117

论面向组合子程序设计方法 之 南无阿弥陀佛

其实,前面我还忘了提一个非常重要的基本组合子:singleton。这里补充提一下:[code="java"]class SingletonComponent implements Component{ private final Component c; private Object val; public Class getType();{ return c....

2005-08-20 02:10:08 141

论面向组合子程序设计方法 之 monad

仍然是先用oo把轮廓划出来,我们需要建模一个接口来围绕它进行组合。因为本文是关于co的论述,那么这个接口怎样分析出来的就暂时忽略掉了:[code="java"]interface Dependency{ Object getArgument(int i, Class type);; Class verifyArgument(int i, Class type);; ...

2005-08-13 07:20:21 192

论面向组合子程序设计方法 之 重构

迄今,发现典型的几种疑问是:1。组合子的设计要求正交,要求最基本,这是不是太难达到呢?2。面对一些现实中更复杂的需求,组合子怎样scale up呢?其实,这两者都指向一个答案:重构。要设计一个完全正交,原子到不可再分的组合子,也许不是总是那么容易。但是,我们并不需要一开始就设计出来完美的组合子设计。比如,我前面的logging例子,TimestampLogger...

2005-08-12 08:31:21 153

论面向组合子程序设计方法 之 oracle

不少朋友说我的阐述很苍白无力。这让我很苦恼。我确实是拚了命地想把问题说清楚,我也有实际non-trivial的项目经验,怎么就说不明白呢?哎!所以,还是不能不多罗嗦一下,希望能够再阐述得明白一点。其实,所谓co,有心的朋友也许能够感觉到,它很象是设计一门语言。它有顺序/分支,有函数调用,异常处理,基本上一个程序设计语言有的东西它都有了。这些顺序/分支作为语言的基础设施,而一...

2005-08-10 12:39:56 111

论面向组合子程序设计方法 之 新约

每个小孩刚开始走路的时候都是跌跌撞撞的。我们不自量力,妄图踩着上帝的步伐前进。结果就是这么几个简单的象白开水似的类。失望吗?是不是造物试图模仿造物主本身就是一种可笑的狂妄呢?别急,让我们失声痛哭之前先看看我们这几步走的是不是一钱不值。[list][b]1。logger可以把信息打印到log文件中。[/b]容易,直接创建一个WriterLogger就好了。[b]2...

2005-08-09 07:21:00 234

论面向组合子程序设计方法 之 燃烧的荆棘

唧唧歪歪一大堆。肯定早有人不耐烦了。"你丫还有没有点实在的东西呀?"要是我,可能也早就忍不住了。好,好。我其实并没有忘记前面说的那个logging的例子。卖了这么长时间的关子,除了有想形而上的虚荣心外,也是想给大家多一点时间来嚼一下这个例子,让熟悉OO的朋友肚子里面多少有个腹稿。下面,我来继续上回书说到的这个logging。前面列举了那么一大堆乱七八糟的需求,不知道...

2005-08-09 03:33:18 123

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除