`
hilliate
  • 浏览: 135077 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

fireflyc 针对Nutz1.a.15 提的意见

    博客分类:
  • Nutz
阅读更多

Nutz1.a.15发布两个月以来,反响不错,更值得欣慰的是,提意见帮助Nutz的盆友很多很多,借此转载一篇新近由 fireflyc 发表的意见(据说zozoh在看到意见之后甚为欣慰,当即表示感谢热心人士的意见,欢迎大家更多地表达,尽情的抨击):

 

 

 

仔细阅读了一下源代码,单纯的几个技术观点:


1.数据库的封装。这里的封装我觉得太薄太脆弱。和hibernate比起来根本没有办法比,hibernate的HQL是一种语法分析的推导。而这里只有SQL,虽然简单但是意味着耦合。对sql的执行我看到SqlMaker这样写道
"INSERT INTO %s (%s,%s) VALUES(@%s,@%s)"
也就是说,所谓的封装是对字符串的一种封装。把SQL的各个部分进行拼装。这种做法我不觉得有什么地方好,反而不如直接写sql,不做任何封装的好。这里估计是想要模仿什么,同样的道理注解的加入也是想要模仿什么。或许模仿的那个不合适这里的设计哲学。作者的设计哲学应该是输入sql,输出对象(或map)。那么很显然,作者如果能忍痛割爱把那些违反这个哲学的“对某些东西的模仿”剔除掉,那么这个东西会更加简洁明确。(我只是推测作者的设计哲学,可能有偏差。呵呵。。莫气)

 

2.对controller的封装,我觉的也是想在模仿什么,头部的那些注解暗示着返回的状态和输入的url都是由配置决定的,或者说是写死在代码里面的(我的哲学是,注解=代码而非配置)。我不知道这些注解和直接写死在代码里面有什么区别。两者都需要重新比编译。我还没有找到数据绑定相关的内容,难道直接使用request?这个我喜欢,但是问题是应该有一些工具类给我方便把request绑定到对象上才行。否则如果属性多无聊的代码也就多了。

 

3.代码整体结构有点out了。试举两例:
在日志的org.nutz.log.file.FileWriterPool中,26行getWriter方法,作者把打开的Writer放到一个HashMap里面,然后在getWriter的时候为了保证线程安全有如下代码段

Writer w = writers.get(file.getAbsolutePath());   
if (null == w)   
    synchronized (this) {   
        w = writers.get(file.getAbsolutePath());   
        if (null == w) {   
            try {   
                w = new BufferedWriter(new FileWriter(file, true));   
                writers.put(file.getAbsolutePath(), w);   
            } catch (IOException e) {   
                throw Lang.wrapThrow(e);   
            }   
        }   
    }   
return w;  

  Writer w = writers.get(file.getAbsolutePath());
  if (null == w)
   synchronized (this) {
    w = writers.get(file.getAbsolutePath());
    if (null == w) {
     try {
      w = new BufferedWriter(new FileWriter(file, true));
      writers.put(file.getAbsolutePath(), w);
     } catch (IOException e) {
      throw Lang.wrapThrow(e);
     }
    }
   }
  return w;

 

synchronized这个锁,太大了,java早已经在jdk5的时候重写了所有的并发相关的内容,引入了Lock类。
再看这里是否有必要自己来加锁?打开java.lang.concurrent包,引入眼帘的是ConcurrentHashMap类。应该猜到是干什么了的吧?

 

4.作者太偏执,作者的偏执体现在不引用任何除jdk以外的第三方包,也许是对混乱的jar愤怒到了极点。但是这种做法意味着你将与开源世界完全脱离,你重新制作一切,不利用社区的任何帮助。这是一种浪费,我觉得和开源哲学背离(个人观点中的开源哲学)

 

5.整个框架的封装说不上好用,有些东西明明是两样背离的东西却被试图封装在一起。与其破坏一个东西,不如去修改一个东西。我们的框架被我偷梁换柱替换几乎把struts1架空了,把hibernate限制的几乎只有HQL了,甚至把事务变成了手工的,把spring和guice都做了一层封装,但是我没有再去考虑自己重写这一切,因为我曾经这样尝试过,最后发现远不如修改来的直接和巧妙。至少它还是struts、hiberate、spring之类的。

2
2
分享到:
评论
7 楼 zozoh 2009-11-26  
@fireflyc, 看了你的回复,我写了一篇文章:
http://zozoh.iteye.com/admin/blogs/526494

另,如果你感兴趣,在你的博客上贴出一些你眼中的 Nutz 脑残的设计,尤其是和现有的其他框架的对比的不足之处。我们会不胜荣幸。

同时也欢迎加入 Nutzam 社区,
你在这里可以不止讨论 Nutz 框架,实际上我们讨论的是 “如何最大限度的提高程序员的生产力”。
6 楼 fireflyc 2009-11-24  
呵呵,谢谢作者对我评论的容忍。其实我觉得可能更多的是一种对同一个问题的不同设计理念引起的。这里我先表示一下我的设计理念。
1. 我理想中的东西是一个实践性框架,所谓的实践性是指不以语言,环境等等因素为限制。一种思想上的“复用”。“复用”的对象是一种web开发的最佳实践。
2. 我个人认为去限制一个框架好过去重新设计一切。因为我曾经试图重写过很多东西,从最开始有自己的一点点想法,然后去写代码;之后我会发现在另一方面我有时候欠佳考虑于是乎重新设计。有时候还会碰到各种疑难杂症,带着郁闷我会阅读各种代码,大部分是我不满意的那些框架的各种代码。后来我对自己不满意的东西更多的是有一种敬意。这是从技术上来说,自己做的一切重复劳动不一定比先人高明。再一点从管理角度来说,你告诉对方这是struts,然后给对方说,formbean我们不提倡,配置文件不需要配置,你只需要如此这般即可。对方会很乐意接受。如果你告诉对方,这个是一个新的框架,你这样这样使用,对方更多的是把这个看成新东西,心理作用让他感到不安,感到为难,感到抵触。有个关于我自己的插曲,我还在读大三就要写一个叫做flyweb的东西,是一个web框架,主要是对struts2的不满而产生的想法,代码很快写好了。我用它做了毕业设计,随着时间的增加,代码被我修改了,被我完全推倒重来了,名字被我换了,我有更多的想法,我疯狂的翻阅着各种框架的设计,阅读他们的代码。后来我不再局限java,我跳出java去看php的框架去看python的框架。再后来我想设计一套可以很方便提高工作效率的整体性的东西;鬼使神差我没有走写“大框架”的路。而是开始去翻阅各种cms和protal。我迫切希望给开发提高效率。直到去年我终于沉静我总结出自己这些年瞎折腾的东西无非是两样:a,一个开发框架,注重实用。b,一个由各种通用模块组成的基础性framework。前者是后者的基础,后者的复用面积更加有效。比如权限管理,日志监控,菜单管理,一套通用UI。诸如此类。这些东西对于一个企业应用来说非常实际。

开始我很喜欢springside,后来感觉小白对某些问题的看法和我不同,于是我开始自己做一些事情。
总的来说我提倡对传统架构做如下调整:
1.有一套通用的工程目录结构,这个目录结构包括spring配置信息,通用的jsp头,通用的jsp错误页面,web.xml配置诸如此类。这个存在的目的是为了方便开始一个项目。避免每次都重新搭建目录结构(或者修改以前的项目目录结构)这样jar包几乎是固定的了。我不喜欢maven因为我难以理解它。。太复杂了。。呵呵
2.对struts来说取消formbean,因为它是一种空壳对象,会让开发人员产生厌烦。这就带来数据校验的问题和数据绑定的问题,数据绑定我们可以提供一个方法来方便request到model的绑定。但是数据校验,我想不出什么好办法。每次都是大家手工做校验,或者干脆就只有客户端校验。struts的配置是0,每次新建一个action,我只需要在spring的配置里面加上action的配置信息就可以完成了。这样就避免了重复配置。还有struts的页面渲染没有采用任何配置,是以一种约定进行的。
3.spring的配置文件是被分来的,是随着目录结构被引入的。所以无需做过多考虑。只需要提供一些通用的组件即可。比如执行时间的拦截。还有就是取消DAO,引入一个通用DAO,提供各种工具方法。只保留service对象。service对象以领域对象的形式存在。
4.hibernate。引入注解,注解应该被加载字段上而不是getter、setter上。注解应该尽可能的不多写,一切尽量保持默认。取消多对多关系,只有一对多和一对一关系;宁可引入中间对象。所有查询尽量使用HQL,如果是关联对象,不要像对象的set放入数据。 总之把它当做高级的SQL用。
5.代码生成工具的集成。
可能这些比较粗和大家的思想也不一样,因为我对改变复杂的问题的思路源于我自己的一些不断探索。
根据这些我设计了一套框架在我们公司内部使用,先后用于某电信和酒店合作项目,某市电信电子账单项目等。之后由于觉得公司的一些东西过于保守而在离职之后重写了所有的代码。代码量不多,因为我是在修改某些东西;我宁愿把struts架空也不愿替换它。我一直不愿意公开它,只是在我们几个好朋友之间流传。而且最近一个项目让我觉得有必要把事务修改成手工的还有一些其他想法。

以上是我对“解决开发难”的问题一些总结和看法。或许是这些看法不同导致了每个人对待某个问题的看法都不同。

5 楼 zozoh 2009-11-24  
唉,不过话说回来, Nutz 对于直接书写 Sql 支持的也不错啊。
这个功能好像从来没人关心的样子 

http://code.google.com/p/nutz/wiki/customized_sql
4 楼 hilliate 2009-11-24  
zozoh 写道
对于第一点: 输入 SQL ? 让我自己拼装 SQL? 老拼装 UPDATE XXX,用起来很不方便吧。

采用注解,是因为没有更好的方式了,它比配置文件更方便。


我觉得Nutz期望Dao的操作更加对象化,自己拼写sql语句不是不好,只是说在更加对象化的目标下,不太符合目标。

整体上来说,我没觉得有什么模仿哪个框架,我觉得大家只是用了相同的概念,既然用这些概念,看起来是会有些相似,应该说很正常吧。
3 楼 zozoh 2009-11-23  
对于第一点: 输入 SQL ? 让我自己拼装 SQL? 老拼装 UPDATE XXX,用起来很不方便吧。

采用注解,是因为没有更好的方式了,它比配置文件更方便。
2 楼 birdwindy 2009-11-23  
1.对sql的封装的优点在与灵活性,就像ibatis就是对sql的封装, 但是过于灵活容易造成代码的混乱与不规范。我想nutz主要是想平衡着点吧。
2.其他的观点我觉得也很好,但由于技术所限,不多评论,现在nutz还处在测试阶段,欢迎各大牛人指点~~~
1 楼 zozoh 2009-11-23  
对于第四点,需要说明的是,Nutz 并不是要阻止使用者使用其他的 jar 包,它是想力图做到:

不会因为你使用了 Nutz.jar,而不得不 copy 其他的 jar

而已

相关推荐

    nutz-1.r.60.jar

    nutz-1.r.60.jar

    nutz-1.r.62.zip

    1. `nutz-1.r.62.jar`:这是Nutz框架的核心库文件,包含了所有Nutz框架的类和方法,供开发者在项目中引用,以利用其丰富的功能。 2. `nutz-1.r.62-sources.jar`:提供了框架的源代码,开发者可以通过查看源码理解...

    nutz-1.r.61.r2.jar包

    标题中的"nutz-1.r.61.r2.jar"是一个特定版本的Nutz框架的Java库文件。Nutz是一个开源的Java框架,它旨在简化Web开发,提供一系列实用工具和强大的支持,使得开发者能够更高效地进行业务逻辑处理。这个版本号"1.r.61...

    nutz-1.r.61-发布包

    "nutz-1.r.61-发布包"是Nutz框架的一个版本更新,具体为1.r.61版本。这个发布包包含了该版本的文档、源代码、编译后的类库以及相关的辅助文件,便于开发者下载、学习和使用。 1. **Nutz框架概述** Nutz 是一个轻量...

    nutz-1.b.52.zip

    Nutz, 它是一组轻便小型的框架的集合。...如果你觉得 Java 语法不如 Ruby 便捷, Nutz.Castor 以及 Nutz.Lang 专为你设计 如果你以前根本没接触过 SSH ,只使用 JDBC 编程, 整个 Nutz 专门为你设计

    nutz-1.a.25_jdoc.zip

    "nutz-1.a.25_jdoc.zip" 是Nutz框架1.a.25版本的Java文档压缩包,其中包含了详细的API参考和使用指南,帮助开发者理解和使用这个框架。 首先,让我们深入了解Nutz的各个组件: 1. **Nutz MVC**:Nutz 提供了一个轻...

    nutz-1.r.62.jar

    nutz-1.r.62.jar 的jar包 可以解决中文乱码,设置字符编码等等

    nutz-1.r.58

    "nutz-1.r.58"是一个特定版本的Nutz框架发布包,包含了该框架的各种组件和文档,便于开发者在项目中使用和学习。 在提供的文件列表中,我们有以下内容: 1. `nutz-1.r.58-javadoc.jar`:这是Nutz框架的API文档,...

    nutz-1.b.43-jdk5.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.b.43-jdk6.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.b.48-manual.pdf 文档

    Nutz框架可以在WEB-INF/lib下仅使用一个nutz.jar来运行一个Web应用,前提是开发者自行添加必要的jar包,如连接池和数据库驱动等。对于那些希望尝试新东西、愿意成为NutzCommitters的开发者,Nutz提供了相应的指南和...

    Nutz-1.b.38

    Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它...

    nutz-1.r.57的JDK1.5编译

    对于"nutz-1.r.57-jdk1.5.jar",这是针对JDK1.5编译后的Nutz库,它确保了在JDK1.5环境下可以正常运行。为了实现这个目标,开发者可能需要对源代码进行一系列的修改,以移除或替换JDK1.6及以上版本特有的API。这通常...

    nutz-1.r.65.zip

    nutzboot1.65版jar包...............................................................................................希望对你有用

    nutz-1.b.49.r2.zip

    Nutz是对于Java程序员来说,除SSH之外的另一个选择。当然,它是开源的,并且是完全免费的。同时也是商业友好的(Licensed under the Apache License, Version 2.0)。

    nutz-1.b.49-manual.pdf

    - 针对编写JSON时代码过多的问题,Nutz.Json简化了这一过程。 - 对于喜欢Ruby语法简洁的Java开发者,Nutz.Castor和Nutz.Lang提供了类似简洁的编程体验。 - 对于那些未接触过SSH框架,仅使用JDBC进行编程的用户,...

    Nutz应用框架 v1.r.69.20220703.zip

    1. **模块化设计**:Nutz采用了模块化的思想,使得开发者可以根据项目需求选择合适的模块,降低了项目的复杂度,也便于维护和扩展。 2. **IoC(Inversion of Control)容器**:Nutz提供了强大的依赖注入机制,帮助...

    在Nutz[1.b.38]中使用视图对关联数据表的操作

    在Nutz 1.b.38 版本中,视图是处理关联数据表操作的一种高效方式。Nutz 是一个轻量级的Java框架,它提供了丰富的功能来支持数据库操作,包括视图的使用。视图在数据库设计中扮演着重要角色,允许开发者以简化的方式...

    SpringMVC+Nutz框架介绍.docx

    SpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+...

Global site tag (gtag.js) - Google Analytics