`
zozoh
  • 浏览: 59142 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

回复fireflyc:Nutz 的设计以及提高程序员生产力

    博客分类:
  • nutz
阅读更多
@fireflyc  在 晓风的这篇博文 的回复,引起了我的一些思考,考虑到内容较多,就单独写成一篇博客吧:

-------------------下面是正文的分隔线-----------------------------------

那么我也聊一下 Nutz 这个框架的设计思想,或者叫做“精神”,或者随便怎么叫它。

我希望 Nutz 是你一个乖巧的奴仆
并且它不是你唯一的奴仆

Nutz 框架对使用者的态度

不是

“要这样编程序!”

而是

“我能为你做些什么?”

它存在的意义是想努力大家处理一些编程工作中很烦琐的问题。
它对自己的最低要求就是:“不招人讨厌”

它努力的在理解现在的程序员主人真正喜欢什么,又讨厌什么

比如 ORM:
为什么大家用 ORM 呢?因为大多数人都讨厌拼 SQL,很麻烦。但是有时候又不得不用一下 SQL。所以 ORM 对大多数程序员主人的最大的意义(虽然不是唯一的)就是:

省却了拼装 SQL 的烦恼


因此 Nutz.Dao 就替你拼 SQL。 实际上,它是 Hibernate 和 iBatis 的一个折中。
它可以支持你随便怎么写自己的 SQL,也可以根据一个对象,替你拼出 SQL
但是
它仅此而已。
至于分页,条件查询什么的,则是顺理成章的事。

比如 Ioc
Ioc 的意义就是

解耦


我发现有很多程序员其实不习惯 Ioc 方式。
有些经验的人,拥有自己的解耦方式。
当然更多的人喜欢 Ioc 的方式,他们使用 Spring 。
Spring 的 XML 配置语法过于繁琐,而新的基于Java注解的 Ioc 框架(比如 Guice),实际上就是把耦合写在另外的一堆 Java 文件里,并且部署后似乎很难修改。
所以 Nutz.Ioc 默认选用了 JSON,(又是一个折中:书写不麻烦,但是部署以后可以随时修改)
当然,它也支持你把耦合写成任何样子,如 XML,甚至数据库,扩展它一个接口就可以了。
关于这一点, 这里有详细的描述: http://code.google.com/p/nutz/wiki/ioc_ioc_loader

比如 Mvc
至于Mvc,其实什么要放到 M 里边,什么要做成是 V,哪一个又需要写成 C,程序员主人们的理解都有或多或少的偏差。但是无论如何,他们最起码需要做的就是:

HTTP 与 Java 之间映射


Nutz.Mvc 力图做到刚刚够用,只负责粘合 M-V-C, 关于权限,日志,验证,UI 组件的支持统统没有。
同时也不限制你的扩展,比如模板引擎,比如要想支持 freemarker, 添加起支持来很自然。

它努力让配置,约定的形式最自然

比如 Nutz.Dao 中的各种注解, 比如 Nutz.Ioc 的 JSON 配置文件语法。
基本上,现在还没有人抱怨它们很难懂。-- 当然现在 Nutz 使用的人很少也是一个主要原因。
我们还在不断聆听来自各方的抱怨,我们对于批评,尤其是具体的批评,是很饥渴的。

说点形而上的东西

对于现有工具和框架进行改良我是支持的,但是“改良”是一种手段,不是我们追求的目的,不是吗?

Nutz 追求的是让它的程序员主人们最大限度的少写代码:
  • 可以让程序员主人少写一行代码
  • 可以让程序员主人少读一段文档
  • 可以让程序员主人少理解一个概念
  • 可以让程序员主人少知道一个约定

这些在我们看来,都是有很有意义的

所以 Nutz 的任何设计,都会考虑到是不是能利用程序员主人现有的知识。
它只假设你熟悉 JAVA,SQL 和 Tomcat。

因为我们的工作要能变得轻松一些,
当市场让老板让我们修改一些代码时,我们不用加班,加班很毁身体。
而且我们也知道如何修改,
因为我们的工具很简单,它让我很容易摆弄,我总能让它服服帖帖的干活,
虽然我们只会 JAVA,SQL 和 Tomcat 的配置

当然 Nutz 不能帮你做到这一点,它不是“银弹”,甚至它是不是“银色的”的都是个问题。
但是起码我希望它能  “在你构思你的项目时,不会是你的另外的一个问题”。
你不会说,我要维护 XXX 的配置文件,我要维护 XXX 的支持类,好累啊。
我不希望它成为程序员主人们的另一个负担,
程序员主人们对待这个框架不需要小心翼翼的,不需要学习很多约定和规则。
我希望使用它不会为你增加工作量,相反,在很多时候,我希望它会帮你降低一点点工作量。
能做到这点我就很满足了。

如果通过改良 SSH 能做到这一点,我当然很高兴,因为能省了不少事。

但是真的能吗?
能做的彻底吗?


SSH 是头几年的设计,在它们发布之初,的确蕴含着很多创新的思想。

但是现在呢?


我想,你已经不会脱口而出的说:“扯淡!SSH 无懈可击!”,其实,很多人都不会,大家只能说:“SSH 真是好强大哟~~~”

我希望一个工具或者框架能够做到:
  • 替我做的,做到最好
  • 不替我做的,别挡我的路

至于它强大不强大,干我屁事。

所以,Nutz 也不是大框架,它当然不是,它很小。我很同意你 “不走大框架的路” 和 “提高工作效率” 的观点。
但是关于  “a,一个开发框架,注重实用

什么样的开发框架呢?
什么叫“实用”呢?


我想你给出的答案是:  “一组基于 SSH 的编码约定
springside 的答案似乎是: “一组代码例子

这里的问题在于,你只能完善 SSH,而不能让它有本质上的提升。 Spring 团队可能不会为你做太多修改。
Spring 团队总是有很多伟大的思路
因此,他们很可能干脆不理你。
那么,这会不会限制你呢?
这会不会导致:如果你有更好的主意,可以提高程序员的生产力,有些时候不得不“曲线救国”。

不过我想,努力做出些东西,让程序员的效率变高,应该是你和我的一个共识
实际上它也是大多数程序员的共识。

而我,希望 Nutz 能成为你所说的 “a,一个开发框架,注重实用
15
0
分享到:
评论
6 楼 syq689 2011-04-28  
,貌似很实用,有空研究一下
5 楼 hastune 2011-03-26  
顶咯

以后要是接私活就方便了。学习学习,学几篇博客宣传一下。
4 楼 Xsen 2009-12-29  
感觉有spring、hibernate、ibatis甚至rails的影子
3 楼 ming500 2009-12-08  
看介绍不错。回去下载个看看,支持一下。
2 楼 zozoh 2009-11-30  
billyu 写道
曾经下载过,也看过相关的说明文档。唯一遗憾的一个地方是,对于 自定义sql的Mapper支持。比如:
select("select id,title,author from blog ",new SimpleBlogRowMapper());
select("select * from blog where id=?",new BlogDetailRowMapper(),new Object[]{id});

这种类似于 spring JdbcTemplate 的就好了。而不是一个带有Connection的Callback,而且,就算是有static Blog blogMapper(ResultSet rs)这样静态方法,但是随便取其中一个的方式也不好。


你可以
Sql sql = Sqls.queryEntity("select * from blog where id=@id");
sql.setEntity(dao.getEntity(Blog.class));
sql.params().set("id",5);
dao.execute(sql);
Blog blog = sql.getObject(Blog.class);

更多,请参看:  http://code.google.com/p/nutz/wiki/customized_sql


billyu 写道

比如我有多个blogMapper,但可能不同查询获得的结果字段数量不一致,那我就使用不同的blogMapper,当然生成的实体仍旧是Blog,那Blog的属性填充也不一样,因为对于高性能的应用来说,只是取得当前查询要用的字段,那些TEXT,CLOB类型的数据,在一般列表中是不查询的,而不是一味的 SELECT * FROM ...。这考虑了,系统性能和WEB SERVER与 DB Server数据传输的效率问题。

你仍然可以用自定义的 SQL,但是更方便的办法是:
FieldFilter.create(Blog.class, "id|title|content").run(new Atom() {
        public void run() {
			List<Blog> blogs = dao.query()
		}
}

更多,请参看:  http://code.google.com/p/nutz/wiki/field_filter

billyu 写道

另外,对于你手册中例子 List<Person> crowd = dao.query(Person.class, Cnd.wrap("name LIKE 'J%' AND age>20"), null);

如果我真正需要的语句是 select p.* from person p,department d where p.id=d.person_id and p.name LIKE 'J%' 这类的,带有关联表的,只能够用定制SQL,但其实,我要的仍旧是Person.class,对于我这个需求,在doc里我没有找到,难道是我看的不够细致吗?所以才需要一个类似
dao.query(Person.class,"select p.* from person p,department d where p.id=d.person_id and p.name LIKE ?",new Object[]{"%J"}) 这类的方式哦。


你可以:
List<Person> persons = dao.query(Person.class, Cnd.wrap("name IN (SELECT name FROM t_my_mapping) ORDER BY name DESC"),null);

或者
List<Person> persons = dao.query(Person.class, new Condition(){
	public String toSql(Entity<?> entity){
		// 随便你怎么拼装 WHERE 后面的语句
		return "XXXXXXX"; 
	}
},null);

更多,请参看:  http://code.google.com/p/nutz/wiki/condition

billyu 写道

另外问一下,反射的时候,依据是真正查询出来的字段来匹配Bean 的属性呢?还是根据Bean 的属性去匹配字段呢?

譬如 Bean有10个属性,而查询出来的字段可能是Bean中的4,7,10个属性,尚未有时间看代码,望解答。

会根据 Bean 的属性依次从 ResultSet 里一一获取,如果 ResultSet 里不包括这个字段,跳过
1 楼 billyu 2009-11-30  
曾经下载过,也看过相关的说明文档。唯一遗憾的一个地方是,对于 自定义sql的Mapper支持。比如:
select("select id,title,author from blog ",new SimpleBlogRowMapper());
select("select * from blog where id=?",new BlogDetailRowMapper(),new Object[]{id});

这种类似于 spring JdbcTemplate 的就好了。而不是一个带有Connection的Callback,而且,就算是有static Blog blogMapper(ResultSet rs)这样静态方法,但是随便取其中一个的方式也不好。

比如我有多个blogMapper,但可能不同查询获得的结果字段数量不一致,那我就使用不同的blogMapper,当然生成的实体仍旧是Blog,那Blog的属性填充也不一样,因为对于高性能的应用来说,只是取得当前查询要用的字段,那些TEXT,CLOB类型的数据,在一般列表中是不查询的,而不是一味的 SELECT * FROM ...。这考虑了,系统性能和WEB SERVER与 DB Server数据传输的效率问题。

另外,对于你手册中例子 List<Person> crowd = dao.query(Person.class, Cnd.wrap("name LIKE 'J%' AND age>20"), null);

如果我真正需要的语句是 select p.* from person p,department d where p.id=d.person_id and p.name LIKE 'J%' 这类的,带有关联表的,只能够用定制SQL,但其实,我要的仍旧是Person.class,对于我这个需求,在doc里我没有找到,难道是我看的不够细致吗?所以才需要一个类似
dao.query(Person.class,"select p.* from person p,department d where p.id=d.person_id and p.name LIKE ?",new Object[]{"%J"}) 这类的方式哦。

另外问一下,反射的时候,依据是真正查询出来的字段来匹配Bean 的属性呢?还是根据Bean 的属性去匹配字段呢?

譬如 Bean有10个属性,而查询出来的字段可能是Bean中的4,7,10个属性,尚未有时间看代码,望解答。

相关推荐

    Nutz框架文档

    对于 Java 程序员来说,除 SSH 之外,可能还有另外一个选择: Nutz 当然,它是开源的,并且是完全免费的。 同传统的 SSH 相比,它具备如下特点: 轻 -- 当前最新版,整个 jar 文件共 820k 薄 -- 针对 JDBC 的薄封装...

    nutz:Nutz-适用于所有Java开发人员的Web框架(MvcIocAopDaoJson)

    在力所能及的情况下,嵌入的提高Java开发人员的能力。 谈话很便宜。 给我看看代码! Nutz遵循Apache协议,完全开放,文档齐全,永远免费(商用也是) 完整的Mvc,Ioc,Dao,Aop,快速开发Web /桌面/嵌入式应用,无...

    高效,小巧的开源JAVA WEB 开发框架-Nutz (源码,开发文档)

    为最大限度的提高 Web 程序员的生产力,Nutz 必须具备如下特性: 提供 SSH 大部分功能 数据库访问层 -- Nutz.Dao 反转注入支持 -- Nutz.Ioc Mvc 框架 -- Nutz.Mvc Json 解析器 -- Nutz.Json 更多的简化Java语法的...

    NUTZ-ONEKEY:NUTZ一键脚手架

    坚果键NUTZ一键脚手架概述github地址git @ osc地址演示地址仓库代码内已设置存储库目标提供开箱即用的企业级开发平台提供企业开发中常见的组件和交互示例提供高度互补的业务基类提供各种超高体验的前端交互组件......

    Nutz官方手册

    提高生产力是这个框架唯一的目标。 就像 Java 设计之初,考虑最多的是程序员的易用性和运行时效率的权衡, Nutz 也是这样。希望通过 Nutz, Java 的开发人员可以获得更快的开发速度,更少的代码量,并且这些以不损害...

    nutz-1.b.40-manual.pdf

    对于 Java 程序员来说,除 SSH 之外,的另一个选择: Nutz 当然,它是开源的,并且是完全免费的,同时也是商业友好的(Licensed under the Apache License, Version 2.0)。 最新的源码托管地址已经转移到 Github 上 ...

    nutz-1.b.49.r2.zip

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

    nutz-1.b.52.zip

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

    nutz 使用手册 nutz-1.a.33-manual.pdf

    nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册

    CRM11-BOOTSTRAP_SSM.zip

    需求描述 记录客户信息(包括级别信息,多个联系人信息) 记录公司联系客户的反馈信息 ...Java:Nutz框架 缓存:EhCache, 静态模板框架:Beetl 后台UI框架:B-JUI 数据库:MySql 后台服务器:阿里云centos6

    Nutz高效开发框架v1.0.5免费版

    Nutz高效开发框架是国内比较独立强大的技术团队开发的轻量级的框架快捷实用工具,由于可以方便地在各种数据库中调用存储数据,所以可以称之为方便程序员通行的项目大厦的手脚架工具。对于从事数据库相关的程序员来说...

    nutz邮箱验证jar包

    用于nutz邮箱验证jar包

    nutz生成javabean工具.zip

    nutz生成javabean工具.zip

    nutz代码生成器

    可连接多种数据库根据表直接生成nutz所需的bean

    nutz框架使用手册.zip

    nutz框架使用手册,从零到有深入学习nutz平台开发

    Nutz-1.b.38

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

    nutz插件 定位页面路径

    可以快速定位路径 页面 本jar包是nutz实用插件 希望大家多多下载

    nutz-1.r.58

    nutz框架jar包

    nutz框架开发手册

    nutz框架开发手册,框架很方便使用的,和大家分享

    nutz_redis集成依赖包

    在做nutz redis集成的实时,由于依赖包的问题被坑了一把,为了后人不要走同样的路,把所有依赖包放在上面了。

Global site tag (gtag.js) - Google Analytics