论坛首页 Java企业应用论坛

奇技淫巧?

浏览 46609 次
锁定老帖子 主题:奇技淫巧?
该帖已经被评为良好帖
作者 正文
   发表时间:2007-03-01  
这种情况,还是借助于工具自动生成代码技术。

用什么反射,效率低,代码也很难看
我宁愿重复
0 请登录后投票
   发表时间: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();   
      }   
} 
0 请登录后投票
   发表时间: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(),你给这老多
0 请登录后投票
   发表时间:2007-03-01  
ajoo 写道
yyzheng 写道
呵呵 我觉得楼主在最后一贴的“疯狂”是有道理的,当整个系统中大部分业务处理逻辑都是“求和”的情况下,用一种方式将这种逻辑抽象出来我认为也不为过,只不过他用的技巧有点让人眼晕,不过没关系,因为一个团队里总会出一两个这样的“疯子”,让这些“疯子”维护这种代码即可,从架构的角度上看,楼主明显已经抽象出一层业务处理逻辑(hoops...难不成这就是传说中的业务平台。。。)
从design的方向上,我赞成楼主的观点,但从design的技巧上我不认同楼主的技巧,why:因为楼主利用了原有设计上的一个缺陷,就是对每一个class原来的设计都强迫其实现一个接口,这种取巧的方式不利于以后architecture的重构,而且楼主为了让没有实现接口的class也能用到重构后的模块,又新加了一些特定的接口,而这些接口是没有任何业务语义的,仅仅是为了用到重构后的模块而加的(hoops...难不成这就是传说中的侵入。。。)好吧,如果你想让按楼主重构后的架构clean一些的话(我承认我有一些技术洁癖),又需要再付出努力组织这些东东,而这样的代价是否值得呢,这实际上就是在重新架构你的system。。。


理解万岁。呵呵。

不过,这些新的接口是不要求被sum的类来"implements"的。因为“酒窝”可以搞定这一切。所以,不能算“侵入”吧?


哦,我又看了一下,可以不用在原先系统架构的那些废接口上做文章,直接添加新的接口即可,这样的话我说的:“因为楼主利用了原有设计上的一个缺陷,就是对每一个class原来的设计都强迫其实现一个接口,这种取巧的方式不利于以后architecture的重构”就不成立了,看来“酒窝”是个好东东,有时间要好好研究一下:)

我这里说的侵入含义比较广,不仅仅是强迫应用类实现某些特定的接口或继承某些特定的基类,当然,按照这种概念,只要你用到了某种框架,其实都或多或少算作“侵入”了。但作为一个框架,提供给应用层的接口很重要,好的框架提供的侵入方式很自然,就像spring。

新增的这些接口仅仅是为了用到重构后的模块而加的,体现的是一种框架的配置语义,这样的话怎么组织这些东东以提供更clean的接口给团队其他程序员就很重要了,不然其他人会抱怨的:)

其实我觉得你提出的第二种Getter接口的方法就已经很好了,面向接口、简单实用、在架构上也很清晰,做应用的话写到这种程度就已经足够了,匿名内部类其实也很简单,而且有编程工具的支持,虽然代码行数没少多少,但从整体架构上更清楚了。
0 请登录后投票
   发表时间:2007-03-01  
第二种方法是标准解耦的方法。其他的才是奇淫技巧
0 请登录后投票
   发表时间:2007-03-02  
huhu, 我也赞成第二种方法是标准解耦的方法. 不过奇淫技巧也是很有价值的, 人类历史上的重大发明, 开始的时候还不都是奇淫技巧.
0 请登录后投票
   发表时间: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

并冠以公司财务系统高级架构包一员的美名。

那么研究之人肯定比现在要多。
:)


0 请登录后投票
   发表时间: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

0 请登录后投票
   发表时间:2007-03-03  
method.invoke(arr[i], args)).

Details.class.getMethod(name);  
其实思路是差不多的,都是得到你的类的method.
但是第一种可以用类来传递,
第二种就只可以用字符串来传。

为什么大家对第二种感觉不错,
更有人用JS来弄。

而对楼主的第一种思路不感冒呢?
请大家拿出当初学习getMethod的这种精神来重新审视一下楼主的代码。
和自己是否对新生的JAVA写法有些抵触。

我和楼主的感觉是差不多的。
要么使用for .
要么使用代理。

这两种都有一个共性就是可以重构。



0 请登录后投票
   发表时间:2007-03-03  
没用过这种技巧,学习!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics