锁定老帖子 主题:我们应该怎样看待框架
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-27
wendong007 写道 越来越觉得整个Java社区就是个大忽悠,或者说整个软件业就是忽悠,大家都忙着把简单的东西搞复杂,大概是觉得做的太简单了,不用点忽悠人的技术对不起那个报价,不过咱们再怎么忽悠也只能弄碗汤喝,大块的肉都在IBM、Oracle这些巨头碗里呢
说到Hibernate,真不知道这东西为什么能火起来,不是说这东西不好,而是我觉得中国90%的Java程序员根本没有能力用好Hibernate,在这样的背景下用Hibernate,除了给自己添麻烦,我实在想不到还有什么用处 任何技术的了解都需要又浅入深,hibernate简单的应用已经能带来很多好处了,为什么不用,回到JDBC的时代真的会那么好么? 巨头的技术有很多是忽悠的,但是里面货也不少,我们不应该因为其商业性和复杂性而排斥其技术性。 |
|
返回顶楼 | |
发表时间:2009-04-27
最后修改:2009-04-27
翻了翻老帖子,看到Robbin当年下站贴说实现同样需求对比Java代码和RoR代码(http://www.iteye.com/topic/57075?page=1),我始终搞不明白为什么说ActiveRecord是充血模型,而将DAO和Domain分开就不是了,对于我的那个封装JDBC(见原帖),我又把Hibernate和Spring加进来,进一步模仿了一下RoR,先看测试: public void testEmployeeExtendsBase(){ //按ID查询 Employee e=new Employee(); e=(Employee) e.findById(43442l); System.out.println(e.getFullName()); //查询 Employee e2=new Employee(); e2.setFullName("张三"); String effectiveDateProperty = "effectiveDate"; Date lo = getSwitchDate("2005-01-03"); Date hi = getSwitchDate("2010-09-02"); Criterion effectiveDateRange = Restrictions.between( effectiveDateProperty, lo, hi); /* 仿效RoR代码: def processing_tasks find :all, :conditions => ["start_time <= ? AND end_time is null", Time.now] end */ List<Employee> employees=(List<Employee>)e2.find_All(effectiveDateRange); for(Employee emp:employees){ System.out.println("员工编号:"+emp.getId()+"|| 员工姓名:"+emp.getFullName()); } }
再看Employee代码
@Entity @Table(name = "Employee") public class Employee extends Base{ @Id private Long id; private String fullName; private Date effectiveDate; private Department department; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } public Date getEffectiveDate() { return effectiveDate; } public void setEffectiveDate(Date effectiveDate) { this.effectiveDate = effectiveDate; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
我和firebody的实现不太一样(http://www.iteye.com/topic/65406),Base继承了泛型DAO,并且动态注入子类,和SessionFactory,而SessionFactory由Spring初始化。 我的find_all是个多态方法,可以放入Criterion... criterion,HQL,并且内部基于一个QBE+QBC的查询,并且这个QBE是经过扩展的,它支持关联关系。
如果POJO或者实体类可以强制继承某个基类了,如本文的Base,我们又回到了EJB时代,独立测试的领域模型不见了。
从来都没有人说过一定要一个Service配一个DAO,一个DAO配一个Entity,这完全取决于你的需要,然后采取的不同模式! |
|
返回顶楼 | |
发表时间:2009-04-27
甚至于,如果你并不知道为什么会要有get,set方法,并且也不知道应该向set,get方法里面放入什么逻辑,那也可以不写,把属性开放为public,或者是什么都不写!
这都是完全取决于你想要什么! |
|
返回顶楼 | |
发表时间:2009-04-27
ych19850810 写道 wendong007 写道 越来越觉得整个Java社区就是个大忽悠,或者说整个软件业就是忽悠,大家都忙着把简单的东西搞复杂,大概是觉得做的太简单了,不用点忽悠人的技术对不起那个报价,不过咱们再怎么忽悠也只能弄碗汤喝,大块的肉都在IBM、Oracle这些巨头碗里呢
说到Hibernate,真不知道这东西为什么能火起来,不是说这东西不好,而是我觉得中国90%的Java程序员根本没有能力用好Hibernate,在这样的背景下用Hibernate,除了给自己添麻烦,我实在想不到还有什么用处 楼上说的对!自己写框架几乎很难,用好别人写好的框架也不是那么容易的事。起码中国的程序员是这样的,太模式化了,一窝蜂,别人学什么,我也学什么,等到人家新的技术出来了,再研究新的技术,自己就不能来点创新吗? 我觉得用好别人的框架不见得就应该比写一个框架容易,大家各有难点,使用有使用的难处,设计有设计的难处,所以"连用都用不好更别说写"这种说法一向不以为然. |
|
返回顶楼 | |
发表时间:2009-04-27
wendong007 写道 越来越觉得整个Java社区就是个大忽悠,或者说整个软件业就是忽悠,大家都忙着把简单的东西搞复杂,大概是觉得做的太简单了,不用点忽悠人的技术对不起那个报价,不过咱们再怎么忽悠也只能弄碗汤喝,大块的肉都在IBM、Oracle这些巨头碗里呢
说到Hibernate,真不知道这东西为什么能火起来,不是说这东西不好,而是我觉得中国90%的Java程序员根本没有能力用好Hibernate,在这样的背景下用Hibernate,除了给自己添麻烦,我实在想不到还有什么用处 归根结体是因为现在程序员效率太低,所以需要很多通用的工具来帮助提高生产效率。 |
|
返回顶楼 | |
发表时间:2009-04-27
sslaowan 写道
翻了翻老帖子,看到Robbin当年下站贴说实现同样需求对比Java代码和RoR代码(http://www.iteye.com/topic/57075?page=1),我始终搞不明白为什么说ActiveRecord是充血模型,而将DAO和Domain分开就不是了,对于我的那个封装JDBC(见原帖),我又把Hibernate和Spring加进来,进一步模仿了一下RoR,先看测试: public void testEmployeeExtendsBase(){ //按ID查询 Employee e=new Employee(); e=(Employee) e.findById(43442l); System.out.println(e.getFullName()); //查询 Employee e2=new Employee(); e2.setFullName("张三"); String effectiveDateProperty = "effectiveDate"; Date lo = getSwitchDate("2005-01-03"); Date hi = getSwitchDate("2010-09-02"); Criterion effectiveDateRange = Restrictions.between( effectiveDateProperty, lo, hi); /* 仿效RoR代码: def processing_tasks find :all, :conditions => ["start_time <= ? AND end_time is null", Time.now] end */ List<Employee> employees=(List<Employee>)e2.find_All(effectiveDateRange); for(Employee emp:employees){ System.out.println("员工编号:"+emp.getId()+"|| 员工姓名:"+emp.getFullName()); } }
再看Employee代码
@Entity @Table(name = "Employee") public class Employee extends Base{ @Id private Long id; private String fullName; private Date effectiveDate; private Department department; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } public Date getEffectiveDate() { return effectiveDate; } public void setEffectiveDate(Date effectiveDate) { this.effectiveDate = effectiveDate; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
我和firebody的实现不太一样(http://www.iteye.com/topic/65406),Base继承了泛型DAO,并且动态注入子类,和SessionFactory,而SessionFactory由Spring初始化。 我的find_all是个多态方法,可以放入Criterion... criterion,HQL,并且内部基于一个QBE+QBC的查询,并且这个QBE是经过扩展的,它支持关联关系。
如果POJO或者实体类可以强制继承某个基类了,如本文的Base,我们又回到了EJB时代,独立测试的领域模型不见了。
从来都没有人说过一定要一个Service配一个DAO,一个DAO配一个Entity,这完全取决于你的需要,然后采取的不同模式!
其实之前pojos in action一直标榜spring框架的"非侵入性",即框架之上开发的业务对象与框架本身松耦合,可跑在本地自动化测试环境里,但是这样的"非侵入性并不好实现,因为pojo本身除了属性还有方法,有些方法比如find,涉及到系统中最小化的业务单元,以及通过仓库访问数据库的操作,在这些具有简单业务性的操作上难免会有框架级别支撑的服务类或者工具,比如
public Emplyee { // 没继承base // 属性 ...
public find(){ // 框架提供的静态工具 StringUtil..... } } 除非所有这些工具都是由构造子注入注入进来,否则也无法跑在脱离框架环境的自动化测试机中,保持pojo不继承基础类只是实现pojo独立的第一步 |
|
返回顶楼 | |
发表时间:2009-04-27
unsid 写道
sslaowan 写道
翻了翻老帖子,看到Robbin当年下站贴说实现同样需求对比Java代码和RoR代码(http://www.iteye.com/topic/57075?page=1),我始终搞不明白为什么说ActiveRecord是充血模型,而将DAO和Domain分开就不是了,对于我的那个封装JDBC(见原帖),我又把Hibernate和Spring加进来,进一步模仿了一下RoR,先看测试: public void testEmployeeExtendsBase(){ //按ID查询 Employee e=new Employee(); e=(Employee) e.findById(43442l); System.out.println(e.getFullName()); //查询 Employee e2=new Employee(); e2.setFullName("张三"); String effectiveDateProperty = "effectiveDate"; Date lo = getSwitchDate("2005-01-03"); Date hi = getSwitchDate("2010-09-02"); Criterion effectiveDateRange = Restrictions.between( effectiveDateProperty, lo, hi); /* 仿效RoR代码: def processing_tasks find :all, :conditions => ["start_time <= ? AND end_time is null", Time.now] end */ List<Employee> employees=(List<Employee>)e2.find_All(effectiveDateRange); for(Employee emp:employees){ System.out.println("员工编号:"+emp.getId()+"|| 员工姓名:"+emp.getFullName()); } }
再看Employee代码
@Entity @Table(name = "Employee") public class Employee extends Base{ @Id private Long id; private String fullName; private Date effectiveDate; private Department department; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } public Date getEffectiveDate() { return effectiveDate; } public void setEffectiveDate(Date effectiveDate) { this.effectiveDate = effectiveDate; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
我和firebody的实现不太一样(http://www.iteye.com/topic/65406),Base继承了泛型DAO,并且动态注入子类,和SessionFactory,而SessionFactory由Spring初始化。 我的find_all是个多态方法,可以放入Criterion... criterion,HQL,并且内部基于一个QBE+QBC的查询,并且这个QBE是经过扩展的,它支持关联关系。
如果POJO或者实体类可以强制继承某个基类了,如本文的Base,我们又回到了EJB时代,独立测试的领域模型不见了。
从来都没有人说过一定要一个Service配一个DAO,一个DAO配一个Entity,这完全取决于你的需要,然后采取的不同模式!
其实之前pojos in action一直标榜spring框架的"非侵入性",即框架之上开发的业务对象与框架本身松耦合,可跑在本地自动化测试环境里,但是这样的"非侵入性并不好实现,因为pojo本身除了属性还有方法,有些方法比如find,涉及到系统中最小化的业务单元,以及通过仓库访问数据库的操作,在这些具有简单业务性的操作上难免会有框架级别支撑的服务类或者工具,比如
public Emplyee { // 没继承base // 属性 ...
public find(){ // 框架提供的静态工具 StringUtil..... } } 除非所有这些工具都是由构造子注入注入进来,否则也无法跑在脱离框架环境的自动化测试机中,保持pojo不继承基础类只是实现pojo独立的第一步 所有的对于其他服务的调用都依赖于接口而非类,然后做Mock。 并且我认为,你的事务范围是很重要的,然后做好关联,如果你的对象和另一个对象是关联关系,那用get方法拿过来,就不要在方法里面再调用dao查找了,除非另外那个是一个服务。 |
|
返回顶楼 | |
发表时间:2009-04-27
xiaolin0105 写道 wendong007 写道 越来越觉得整个Java社区就是个大忽悠,或者说整个软件业就是忽悠,大家都忙着把简单的东西搞复杂,大概是觉得做的太简单了,不用点忽悠人的技术对不起那个报价,不过咱们再怎么忽悠也只能弄碗汤喝,大块的肉都在IBM、Oracle这些巨头碗里呢
说到Hibernate,真不知道这东西为什么能火起来,不是说这东西不好,而是我觉得中国90%的Java程序员根本没有能力用好Hibernate,在这样的背景下用Hibernate,除了给自己添麻烦,我实在想不到还有什么用处 归根结体是因为现在程序员效率太低,所以需要很多通用的工具来帮助提高生产效率。 我觉得是素质太低,而且习惯不好,心态太浮躁。。。 |
|
返回顶楼 | |
发表时间:2009-04-27
最后修改:2009-04-27
楼主讨论的基本正确,但并不全面。
讲一个最简单的道理,为什么做软件项目的很多用户最开始只有一个想法,却在你的原型不断完善的同时,他的要求越来越多,让你最终无法满足?因为是我们教育了用户。 千万不要说这是在“忽悠”。因为人非圣贤,不可能一下子考虑到所有的问题,而也许当他发现了问题的时候,却已经晚了。楼主所举的一些例子,只是提高了开发效率,这是一个可以疏忽的领域,可是,安全性呢,可扩展性能,这些最重要的东西恰恰是人们最容易忽略的。 再如Spring,让每个初出茅庐的程序员去想象出这样的需求是不现实的,事实上如果Rod不写书,不开源,也许今天的开发并没有什么不同,恰恰是Rod教育了我们,利用他的框架引导我们写出低耦合,易测试的代码,而这些背后的道理,甚至不需要年轻人去了解。 这也是框架们的另一种意义吧。 |
|
返回顶楼 | |
发表时间:2009-04-27
不得不说这是个通俗易懂的好贴,说的有理。
|
|
返回顶楼 | |