锁定老帖子 主题:奇技淫巧?
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-03-01
这种情况,还是借助于工具自动生成代码技术。
用什么反射,效率低,代码也很难看 我宁愿重复 |
|
返回顶楼 | |
发表时间:2007-03-01
搞那么复杂干啥
看很简洁 static double getOverallBalance(Details[] arr){ Details sumDetails=new Details(); for(int i=0; i<arr.length; i++) { sumDetails.setBalance()=sumDetails.getBalance()+arr[i].getBalance(); sumDetails.setFixed()=sumDetails.getFixed()+ arr[i].getFixed(); sumDetails.setVariable()=sumDetails.getVariable()+ arr[i].getVariable(); sumDetails.setSpendDown()=sumDetails.getSpendDown()+ arr[i].getSpendDown(); } } |
|
返回顶楼 | |
发表时间:2007-03-01
whyang 写道 搞那么复杂干啥
看很简洁 static double getOverallBalance(Details[] arr){ Details sumDetails=new Details(); for(int i=0; i<arr.length; i++) { sumDetails.setBalance()=sumDetails.getBalance()+arr[i].getBalance(); sumDetails.setFixed()=sumDetails.getFixed()+ arr[i].getFixed(); sumDetails.setVariable()=sumDetails.getVariable()+ arr[i].getVariable(); sumDetails.setSpendDown()=sumDetails.getSpendDown()+ arr[i].getSpendDown(); } } 人家只想要getBlance(),你给这老多 |
|
返回顶楼 | |
发表时间:2007-03-01
ajoo 写道 yyzheng 写道 呵呵 我觉得楼主在最后一贴的“疯狂”是有道理的,当整个系统中大部分业务处理逻辑都是“求和”的情况下,用一种方式将这种逻辑抽象出来我认为也不为过,只不过他用的技巧有点让人眼晕,不过没关系,因为一个团队里总会出一两个这样的“疯子”,让这些“疯子”维护这种代码即可,从架构的角度上看,楼主明显已经抽象出一层业务处理逻辑(hoops...难不成这就是传说中的业务平台。。。)
从design的方向上,我赞成楼主的观点,但从design的技巧上我不认同楼主的技巧,why:因为楼主利用了原有设计上的一个缺陷,就是对每一个class原来的设计都强迫其实现一个接口,这种取巧的方式不利于以后architecture的重构,而且楼主为了让没有实现接口的class也能用到重构后的模块,又新加了一些特定的接口,而这些接口是没有任何业务语义的,仅仅是为了用到重构后的模块而加的(hoops...难不成这就是传说中的侵入。。。)好吧,如果你想让按楼主重构后的架构clean一些的话(我承认我有一些技术洁癖),又需要再付出努力组织这些东东,而这样的代价是否值得呢,这实际上就是在重新架构你的system。。。 理解万岁。呵呵。 不过,这些新的接口是不要求被sum的类来"implements"的。因为“酒窝”可以搞定这一切。所以,不能算“侵入”吧? 哦,我又看了一下,可以不用在原先系统架构的那些废接口上做文章,直接添加新的接口即可,这样的话我说的:“因为楼主利用了原有设计上的一个缺陷,就是对每一个class原来的设计都强迫其实现一个接口,这种取巧的方式不利于以后architecture的重构”就不成立了,看来“酒窝”是个好东东,有时间要好好研究一下:) 我这里说的侵入含义比较广,不仅仅是强迫应用类实现某些特定的接口或继承某些特定的基类,当然,按照这种概念,只要你用到了某种框架,其实都或多或少算作“侵入”了。但作为一个框架,提供给应用层的接口很重要,好的框架提供的侵入方式很自然,就像spring。 新增的这些接口仅仅是为了用到重构后的模块而加的,体现的是一种框架的配置语义,这样的话怎么组织这些东东以提供更clean的接口给团队其他程序员就很重要了,不然其他人会抱怨的:) 其实我觉得你提出的第二种Getter接口的方法就已经很好了,面向接口、简单实用、在架构上也很清晰,做应用的话写到这种程度就已经足够了,匿名内部类其实也很简单,而且有编程工具的支持,虽然代码行数没少多少,但从整体架构上更清楚了。 |
|
返回顶楼 | |
发表时间:2007-03-01
第二种方法是标准解耦的方法。其他的才是奇淫技巧
|
|
返回顶楼 | |
发表时间:2007-03-02
huhu, 我也赞成第二种方法是标准解耦的方法. 不过奇淫技巧也是很有价值的, 人类历史上的重大发明, 开始的时候还不都是奇淫技巧.
|
|
返回顶楼 | |
发表时间:2007-03-03
ajoo 写道 继续我们的奇技淫巧之旅。
double totalBalance = sumOf(accountArray, "balance"); double totalRate = sumOf(accountArray, "rate"); double totalReturnOfInvestment = sumOf(accountArray, "returnOfInvestment"); 4。于是,就出现了我们慕容家的“斗转星移”神功了。就像做梦一样,你可以这样写了: double totalBalance = sumOf(accountArray).getBalance(); double totalRoi = sumOf(accountArray).getReturnOfInvestment(); 作为一个客户,我几乎无法挑出什么毛病了,所有的Eclipse提供的拐棍都还在,语法也是简练自然得象自然语言。 感觉不错, 其实什么是“模式”有两个特点, 一个就是应用起来简单一些, 一个就是适用比较广。 这两点, 楼主的技巧都具备了。第一是可以重构。使用字符串的重构尽管有选项,但是大家都知道是怎么回事。 尤其是用过hibernate的。 那么,不管这个技巧本身多复杂,挺多是这个JAVA的JAVADOC很长,很长而已。 你又不用改变这个JAVA文件, 为什么大家就不认同这个方法呢, 不知大家看过JBOSS的一些常规包的JAVA文件没。 那上面的代码就不“花”么?我想比楼主的还要再花上一套吧? 不管怎么说, 先是赞楼主一个。 但是,话说回来,如果项目里只有3处以下的类要用到这个求和。 我还是喜欢for 但是,要真的是个财务系统。 有300个这种求和呢? 不光是我不喜欢for了吧? 那公司里正好有一个人写了楼主这么“优美”的“模式”,但是只给你一个JAR包。没有JAVA文件 而且此人正是你所**才可见的高人之一, 你可能巴不得把他的代码反编译过来,然后研究而后快呢。 呵呵。 建议楼主把此JAVA文件,打成JAR包,但是JAR包里面放上一份TXT说明再放上一个JAVA文件。 JAR包的名字就叫 financeSum.jar 并冠以公司财务系统高级架构包一员的美名。 那么研究之人肯定比现在要多。 :) |
|
返回顶楼 | |
发表时间:2007-03-03
dreamstone 写道 看了文章感觉很有意思,作者的思维挺好玩,感觉如果平时应用开发还是不要这样的好,如果是写一些特殊的需求,例如框架什么的还是不错的。另外再提供一个思路:
ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); for(int i=0;i<arr.length;i++){ engine.put("obj", arr[i]); Object obj = engine.eval("obj."+method); if (obj instanceof Double){ sum += ((Double)obj).doubleValue(); } } 是用jdk1.6中的script就可以简单实现了,好处是写起来方便,学习成本低。坏处是也存在重构问题,并且内部实现和动态代理、反射等也差不哪里去。 利用JS的字符串与类的弱混淆来达到把类来“数组化”这一点。 好象感觉上还没有 getMethod("")来的直观些呢。 这种方法猛滴一看, 以为进了JSP的JAVA代码里了呢? 再说,这种代码的效率利用JS的engine,高不到哪去吧? 我上面说了,不是财务系统,通用化的不值。 如果是财务系统。 用脚本来替JAVA语言, 大哥,你还是直接杀了我算了。 我搞过一段时间的性能测试的。这样的做法会让我crazy |
|
返回顶楼 | |
发表时间:2007-03-03
method.invoke(arr[i], args)).
Details.class.getMethod(name); 其实思路是差不多的,都是得到你的类的method. 但是第一种可以用类来传递, 第二种就只可以用字符串来传。 为什么大家对第二种感觉不错, 更有人用JS来弄。 而对楼主的第一种思路不感冒呢? 请大家拿出当初学习getMethod的这种精神来重新审视一下楼主的代码。 和自己是否对新生的JAVA写法有些抵触。 我和楼主的感觉是差不多的。 要么使用for . 要么使用代理。 这两种都有一个共性就是可以重构。 |
|
返回顶楼 | |
发表时间:2007-03-03
没用过这种技巧,学习!
|
|
返回顶楼 | |