论坛首页 Java企业应用论坛

刚有人问面试题咋答,一时兴起回了下,关于对 Struts2, Spring 和 Hibernate 的理解

浏览 27984 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-12-04  
ansjsun 写道
Surmounting 写道

从编程技巧方面来说,这样是很方便编程。但是不用成员变量存数据,而是用 Map ,不是一样的吗?我的意思是说,数据类还是数据类,但数据不存在成员变量里边,存在其内部的一个 Map 中。这样的好处是可以增加一些最开始没有的数据。
  不过从软件结构的角度来说,如果把数据记录和内容提取二种东西放在一起,究竟是不是合适的呢?另外从 text 得到 250 字 summary 的这个事情,难道不是应该在数据中做冗余吗?就是既有 text ,又有 summary ……
  咱们多讨论哈。我最近一些日子一直在认真寻找设计方法,以避免无用的教条带来的麻烦,同时也避免修改或复用的时候层次不清晰。

1.summary如果做冗余..有些地方要求120字.有些地方要求250字.你会疯掉的...(这只是一个编程技巧,也未必是好)
2.如果基于对象.在做排序的时候.非常遍历..TreeSet,(如果你喜欢Comparable 接口的话)
3.基于对象可维护性高.数据结构清晰.代码容易阅读.基于map的确能带来很多便利.仿佛讨论到了关系型数据库和非关系型数据库的方面了..不好说谁不好.应用不同..使用不用..在复杂业务中我还是更倾向于面向对象编程.
  如果你真正开发项目.你会发现pojo层改动非常少.最大的有点是他能和数据库做一一映射...强约束.低耦合..避免灵异事件发生.
  其实说白了无非是个数据展示..可以不纠结于用谁..不具有倾向性的说..有几点用map的确不合适
1.继承关系.      比如 "新闻 论坛 博客" 你可以统计继承一个抽象类.Doc
2.引用关系      比如.新闻中有一个作者.作者跟着粉丝.如果用map嵌套的话...1.浪费内存.2.结构不清晰..真正做的时候能体会出来
  map的好处.灵活..有点动态语言的感觉.其他没什么了.
  其实最好的办法..可以用两种方式都做一下..不一定一个项目只能用一种..一切从需求出发吧..

你真好,能讨论技术。  :-)
  肯定会用具体的对象做数据对象了。我可能一直没说清楚。我是说这个数据对象内部不是通过一堆成员变量来保存数据,而是 Map 。然后除了标准的 getter 以及一部分 setter 以外,还可以提供 get("") 和 set("", ...) 这样的通用方法。比如
public class Performance
{
	private Map<String, Object> data;
	public Performance()
	{
		this.data = new HashMap<String, Object>();
	}
	public long getFreeMemory()
	{
		return (Long) this.data.get("freeMemory");
	}
	public void setFreeMemory(long freeMemory)
	{
		this.data.set("freeMemory", freeMemory);
	}

	// ...

	public <T> T get(String dataName)
	{
		if (dataName == null) return null;
		return (T) this.data.get(dataName);
	}
	public <T> void set(String dataName, T dataValue)
	{
		if (dataName == null) return;
		this.data.put(dataName, dataValue);
	}
}

  我自己做软件设计的产品,确实如你所说都是把 数据类 放在第二基础部分,作为被别的部件耦合连接点。不过也就是因为这样,才体会到其实这东西多多少少还是会有一些变化,于是就得为了改变数据类(主要是新增的数据让我发现能够简化或者让以前的一些 getter setter 以及成员变量变得更好用、通用),对系统做相对多一点的重构。然后又因为一些机缘认识了 Python ,才有了这样的构想,并应用在以后的产品上,感觉还是挺好用的,只要能留住文档和注释(这个太重要了,如果不维护文档和注释,程序就没法看了,谁也不知道后来新增了哪些对象属性),就能够完全不改变原有的 数据类 ,同时借用工具方法对内容进行修饰。
  
0 请登录后投票
   发表时间:2012-12-04  
Surmounting 写道

你真好,能讨论技术。  :-)
  肯定会用具体的对象做数据对象了。我可能一直没说清楚。我是说这个数据对象内部不是通过一堆成员变量来保存数据,而是 Map 。然后除了标准的 getter 以及一部分 setter 以外,还可以提供 get("") 和 set("", ...) 这样的通用方法。比如
public class Performance
{
	private Map<String, Object> data;
	public Performance()
	{
		this.data = new HashMap<String, Object>();
	}
	public long getFreeMemory()
	{
		return (Long) this.data.get("freeMemory");
	}
	public void setFreeMemory(long freeMemory)
	{
		this.data.set("freeMemory", freeMemory);
	}

	// ...

	public <T> T get(String dataName)
	{
		if (dataName == null) return null;
		return (T) this.data.get(dataName);
	}
	public <T> void set(String dataName, T dataValue)
	{
		if (dataName == null) return;
		this.data.put(dataName, dataValue);
	}
}

  我自己做软件设计的产品,确实如你所说都是把 数据类 放在第二基础部分,作为被别的部件耦合连接点。不过也就是因为这样,才体会到其实这东西多多少少还是会有一些变化,于是就得为了改变数据类(主要是新增的数据让我发现能够简化或者让以前的一些 getter setter 以及成员变量变得更好用、通用),对系统做相对多一点的重构。然后又因为一些机缘认识了 Python ,才有了这样的构想,并应用在以后的产品上,感觉还是挺好用的,只要能留住文档和注释(这个太重要了,如果不维护文档和注释,程序就没法看了,谁也不知道后来新增了哪些对象属性),就能够完全不改变原有的 数据类 ,同时借用工具方法对内容进行修饰。
  


这么做到不失为一个办法..但是注意几个地方...
1.map中存在的key和类中的字段冲突
2.一个人的项目数据库字段随便增删.人多了就不好了


其他没什么了呵呵..我也用过..类似的方式..不过没做具体封装...你可以考虑抽象类的方式..这样就又能重用点...反正map中的尽量表现在展示层..少参与业务逻辑..否则出错了..不好找错误..比如.你把字段名称改了.map没有及时更改..出错了也许也发现不了


0 请登录后投票
   发表时间:2012-12-05  
楼主这是忽悠应届生用的吧 什么切片什么提纯什么的词汇不仅不能说明问题 只能误导
ssh的根本作用你并不了解 性能也不等于架构的全部  包括所有用反射的框架 其实本身的性能开销在目前外网集群分布式环境基本可以忽略不计了   而且你提出的那些概念别说一个应届生  工作几年的人看了也不明所以, 简直是空中楼阁的幻想   现在所谓失败的架构思路共通的特点就是 -- 阳春白雪空中楼阁 让人不知所云
0 请登录后投票
   发表时间:2012-12-05  
其实效率这问题,除了 Hibernate 在多表关联时处理不好会慢,

实际上更多是受带宽,磁盘IO,数据库优化影响,

如果代码垃圾到能让程序变慢好几秒,什么框架都救不了你.

一般使用java的都不是十分注重效率.

我指的注重效率是说:
比同类产品多1,2秒都很难让客户接受的需求,比如通讯方面,交易上送等.

觉得既然使用java开发,就是为了注重开发效率,易于维护,专注业务逻辑,有大量的第三方工具包,框架供你快速开发.代码易懂易维护.

做网站类的东西,网速卡你1,2秒,你争那几十几百毫秒有意义?

P.S. 电信,我想要便宜的家用宽带......你捞这么多年捞够没有...
0 请登录后投票
   发表时间:2012-12-06  
ansjsun 写道
这么做到不失为一个办法..但是注意几个地方...
1.map中存在的key和类中的字段冲突
2.一个人的项目数据库字段随便增删.人多了就不好了

其他没什么了呵呵..我也用过..类似的方式..不过没做具体封装...你可以考虑抽象类的方式..这样就又能重用点...反正map中的尽量表现在展示层..少参与业务逻辑..否则出错了..不好找错误..比如.你把字段名称改了.map没有及时更改..出错了也许也发现不了


所以说,这样的程序就变得依赖文档和注释。使用程序的时候,就需要更新相关数据的文档,以及在这个类中添加有关注释。很多人可能会懒得做这个事情,就会遗留要命的后果……

  不敢使用 ALTER TABLE 来加字段的,不然数据库磁盘结构大调整,上十万行的表就得等着假宕机很长时间…如果需要复用,应该是类似类型的数据吧…… 我其实觉得不应该让数据库和数据进行绑定。关系-对象转换,我觉得可以考虑各种有效的分离方式……我组织的产品都是不存在直接的 表-类 这样的对应关系的。目前看来对开发者从思路中摘除数据库,把核心数据的概念扳回程序这边很有益处,但对编程也没有提供方便。
0 请登录后投票
   发表时间:2012-12-06  
zouruixin 写道
楼主这是忽悠应届生用的吧 什么切片什么提纯什么的词汇不仅不能说明问题 只能误导
ssh的根本作用你并不了解 性能也不等于架构的全部  包括所有用反射的框架 其实本身的性能开销在目前外网集群分布式环境基本可以忽略不计了   而且你提出的那些概念别说一个应届生  工作几年的人看了也不明所以, 简直是空中楼阁的幻想   现在所谓失败的架构思路共通的特点就是 -- 阳春白雪空中楼阁 让人不知所云


因为……因为我本身就是特别抵制乱用名词的人,所以一看你的回复我愣了好几秒。然后打开自己的原文,搜索“切片”和“提纯”……
  切片那边,我不是说了吗,“方法执行前、后的监视”,这个东西叫切片。你看,我这篇帖子的出发点,是如果面试的人问我这个问题,我会咋回答。其实我现在如果找工作,就会直接去跟老板谈,说我的网络技术和成型程序方案,能够给企业带来什么(小公司),或者说我从以前的什么经历能说明我可以完成什么岗位(大公司)——已经不用再回答这种很多人都知道(非独有)的技术问题了。
  提纯是我自己乱用词了,我承认错误……我的原意是,服务器和浏览器 JavaScript 程序的交互,传输的是数据,不应该是数据 + 界面。所谓提纯,就是把界面部分删了,只保留数据。确实是我没说清楚。

好歹我也是随着大家一起用 Struts1 2,Spring2 3(看了源代码)以及 Hibernate 出身的。我自己也写过自己的对象-关系映射器,用在数字政通全国一百多个城市的项目里。我自己现在也编写了自由软件用来处理网络纷发,用在几个百万用户级的游戏服务器上。作为一个从使用到弃用即时反射框架的人,我自己的东西也用反射,但我就是认为即时反射是一种没必要且低速的技术,就是觉得应该使用“预反射”方式,形成 Map<名字, 对象> 来管理框架中加载的东西。这就是我抵制泛滥使用 Spring + Struts + Hibernate 的原因。但是我在被问到“谈谈你对它们的理解”这个问题时,肯定不会说这么多。如果我的哪句话引起了面试官的兴趣,说明那是 ta 擅长的方面,我可以在那个方面专门跟 ta 讨论。

你如果真的在组织使用集群,就会知道,负载均衡形式的服务器集群,只能分摊负载压力,不能够提高某一次请求自身的响应速度。也就是说,如果全场就一个请求,还是需要 3 秒钟才能完成响应,那么不管用不用集群,都不可能更快。用集群的好处是,当 5 万人一起请求的时候,合适的集群能防止响应时间比 3 秒慢太多,并且不至于宕机。

你看,我这不是在模拟一个面试官问我话的场景吗,没准备把这个东西当做给应届生的讲解。而且应届生水平也是参差不齐,并不是都什么也不会的。

感谢讨论……虽然我有一种在被你指责的感觉……   T T
0 请登录后投票
   发表时间:2012-12-06  
suene 写道
其实效率这问题,除了 Hibernate 在多表关联时处理不好会慢,
实际上更多是受带宽,磁盘IO,数据库优化影响,
如果代码垃圾到能让程序变慢好几秒,什么框架都救不了你.
一般使用java的都不是十分注重效率.

我指的注重效率是说:
比同类产品多1,2秒都很难让客户接受的需求,比如通讯方面,交易上送等.

觉得既然使用java开发,就是为了注重开发效率,易于维护,专注业务逻辑,有大量的第三方工具包,框架供你快速开发.代码易懂易维护.

做网站类的东西,网速卡你1,2秒,你争那几十几百毫秒有意义?
P.S. 电信,我想要便宜的家用宽带......你捞这么多年捞够没有...

有的时候觉得,作为一个程序工作者,咱们存在的意义,很大一部分,不就是争那 10ms 吗……当然这话我不能说出来,否则容易挨骂。   :-P
  好了,言归正传。其实时代已经进步了。现在追求开发效率的东西,有 JavaPlay ,有 Python ,有 Ruby + Rails ,都比 Spring + Struts + Hibernate 快速很多。现在都在用 Java 只是传统所致。而 Java 在执行效率上,能达到 C++ 90% 的速度,这已经非常强悍了,是未优化机器码程序 81% 的速度(这取自于传说,C++ 执行效率是 C 的 90%),非常之快速。我和同事做过实验,同样数据规模,用 Python 做排序和定位插入,执行速度比 Java 慢 70% 。

在这种背景下,一个需要运行速度同时逻辑又有些复杂的民用项目,为什么不应该选用 Java 呢?

话说……貌似电信通的宽带,比联通、电信要便宜很多啊……
0 请登录后投票
   发表时间:2012-12-06  
Surmounting 写道
suene 写道
其实效率这问题,除了 Hibernate 在多表关联时处理不好会慢,
实际上更多是受带宽,磁盘IO,数据库优化影响,
如果代码垃圾到能让程序变慢好几秒,什么框架都救不了你.
一般使用java的都不是十分注重效率.

我指的注重效率是说:
比同类产品多1,2秒都很难让客户接受的需求,比如通讯方面,交易上送等.

觉得既然使用java开发,就是为了注重开发效率,易于维护,专注业务逻辑,有大量的第三方工具包,框架供你快速开发.代码易懂易维护.

做网站类的东西,网速卡你1,2秒,你争那几十几百毫秒有意义?
P.S. 电信,我想要便宜的家用宽带......你捞这么多年捞够没有...

有的时候觉得,作为一个程序工作者,咱们存在的意义,很大一部分,不就是争那 10ms 吗……当然这话我不能说出来,否则容易挨骂。   :-P
  好了,言归正传。其实时代已经进步了。现在追求开发效率的东西,有 JavaPlay ,有 Python ,有 Ruby + Rails ,都比 Spring + Struts + Hibernate 快速很多。现在都在用 Java 只是传统所致。而 Java 在执行效率上,能达到 C++ 90% 的速度,这已经非常强悍了,是未优化机器码程序 81% 的速度(这取自于传说,C++ 执行效率是 C 的 90%),非常之快速。我和同事做过实验,同样数据规模,用 Python 做排序和定位插入,执行速度比 Java 慢 70% 。

在这种背景下,一个需要运行速度同时逻辑又有些复杂的民用项目,为什么不应该选用 Java 呢?

话说……貌似电信通的宽带,比联通、电信要便宜很多啊……


"争那 10ms" 这个我也不否认,但这10ms不是框架带来的.框架带来的是开发成本降低.

各种语言快慢的问题,我觉得这是个大坑,不去讨论,

貌似貌似,我没说不用java啊.只是说在例如套接字编程方面,貌似国内没什么用java的,
而争毫秒的需求一般是网络通讯或者操作硬件的.so.........
但一般来说 java 开发维护成本比 c 便宜.

电信通是神马?  我在深圳,我是去看香港的, 99元 100M 的光线后震到了.呵呵,你懂得.


0 请登录后投票
   发表时间:2012-12-06  
Surmounting 写道
ansjsun 写道
这么做到不失为一个办法..但是注意几个地方...
1.map中存在的key和类中的字段冲突
2.一个人的项目数据库字段随便增删.人多了就不好了

其他没什么了呵呵..我也用过..类似的方式..不过没做具体封装...你可以考虑抽象类的方式..这样就又能重用点...反正map中的尽量表现在展示层..少参与业务逻辑..否则出错了..不好找错误..比如.你把字段名称改了.map没有及时更改..出错了也许也发现不了


所以说,这样的程序就变得依赖文档和注释。使用程序的时候,就需要更新相关数据的文档,以及在这个类中添加有关注释。很多人可能会懒得做这个事情,就会遗留要命的后果……

  不敢使用 ALTER TABLE 来加字段的,不然数据库磁盘结构大调整,上十万行的表就得等着假宕机很长时间…如果需要复用,应该是类似类型的数据吧…… 我其实觉得不应该让数据库和数据进行绑定。关系-对象转换,我觉得可以考虑各种有效的分离方式……我组织的产品都是不存在直接的 表-类 这样的对应关系的。目前看来对开发者从思路中摘除数据库,把核心数据的概念扳回程序这边很有益处,但对编程也没有提供方便。


核心程序放到程序这边?
要考虑很多问题啊,异步的问题,事务的问题,并发的问题。
故障问题,断电等问题呢?

如果不用ALTER TABLE加字段,您说怎么加好呢??

还有,如果你表-类不这样隐射,你的逻辑实体怎么处理?
实体类和数据怎么建立关系?
这样除了NOSQL以外,还没有啥很好的方式了。

如果ALTER TABLE十万级的表就当了,那就是机子的问题了。
我们上千万的表,OLTP库也是怎么搞的。
0 请登录后投票
   发表时间:2013-01-09  
不知道楼主做过管理没有,我个人感觉现在软件行业最大的危机不是系统效率的快慢而是人员流动造成的项目不能按时交付,项目后期维护困难等问题,尤其是中小型公司人员流动非常频繁,一个软件做下来有可能只剩一两个老人,后期维护更是问题,像楼主所说的不使用框架效率确实提高了,但是开发周期恐怕会更长,新人对项目的熟悉时间会更慢,后期维护成本会更高,项目成本可能会成倍增加。而ssh尤其是spring框架正好可以很好的缓解这个问题,spring对bean的工程化管理让项目更加易于管理,而且这个规范可以让很多没有楼主强大的新人能快速适应到项目中来。不是每个人都像楼主这么强大,更多的程序员尤其是现在的程序员都是速成的,没有很深的造诣和扎实的基础,正是软件的工程化管理让软件行业在现在尤其是中国这个国度能快速发展。正如一位高人曾言,软件工程的终极目标就是消灭程序员。所以我个人感觉ssh框架的使用对效率的考虑少一点,更多的是在软件项目工程化管理方面所带来的巨大优势。
本人也是程序员,如果哪些地方说的有问题请轻拍...
0 请登录后投票
论坛首页 Java企业应用版

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