关于java领域建模疑惑

12-11-28 putdns
最近有一个重构项目的任务,原项目的领域实体对象的一些动态属性采能了Map数据结构来实现,数据库表结构采用冗余字段,大致如下:
class Animal {
String name ;
Map<String,Property> prop = new HashMap();
}
class Property{
private String stringValue;

private Double doubleValue;

private Integer intValue;

private Long longValue;

private BigDecimal decimalValue;

private Boolean booleanValue;
}
-------------------------------------------table_property--------------------------------------
stringValue | doubleValue | intValue | longValue | decimalValue | booleanValue|
---------------------------------------------------------------------------------------------------
aaaa | | | | |
---------------------------------------------------------------------------------------------------
| | | 5 | |
---------------------------------------------------------------------------------------------------

同事对这个种实现不满意;请大牛针对这种实现给点意见;
同时同事对java类中新增一个field需要重起,决定改用Python开发,请大牛给点意见;

2
banq
2012-11-29 07:00
不知道你们同事不满意在什么地方?设计还是性能?

clonalman
2012-11-30 04:02
2012-11-28 16:04 "@shefansxyh"的内容
Map prop = new HashMap(); ...


Map<String, Object> prop = new HashMap();

直接映射Animal关联的Property表,Key就是fieldName,Value就是fieldValue,估计是想要这个.

class Animal {
String name ;
Map<String,Object> properties = new HashMap();
}

putdns
2012-12-01 17:39
@banq
@clonalman
首先感谢二位的关注,
对于在java中这种动态属性的设计,从本人的理解和能力上来讲,已经觉得是极致了,当本人说出这种想法时,遭到同事的反对,理由是这种设计“反正有各种问题”,问其原由,一句“反正有问题”,并作出了“我现在对Java反感的很,我们要用Python”的结论,用Python的原因是不用重起服务;
对于以上问题,想向二位请教一下:
对于以上动态属性的设计,如果从性能方面讲,Java是不是还有更优的设计?这种设计问题在哪呢?对于因重起应用而选择Python,这一点算不算是Java的硬伤?

[该贴被shefansxyh于2012-12-01 17:43修改过]

banq
2012-12-01 19:08
2012-12-01 17:39 "@shefansxyh"的内容
以上动态属性的设计,如果从性能方面讲 ...


动态和性能这是一对矛盾,动态性强,性能差,要性能好就得牺牲一些动态,CPU和程序员两头属于鱼和熊掌,根据你们的系统访问量规模做个平衡吧:计算机语言性能基准评比表

这里是否可以做个变通:动态属性有两个:动态类型和值,你的table_property可能是数据表的值。动态类型不是Java强项,是动态语言的强项,无以为用,有以为利,回避缺点,发扬优点,将类型也作为值存在数据表里。

下面解决的是数据表中的值如何加载到内存中,那么多属性一下子加载转换肯定耗费性能,推荐使用事件懒加载机制,见:使用Disruptor实现事件的懒加载,案例见JdonFramework的DEMO:http://www.jdon.com/testWeb/,这个案例中,字段属性count就是使用事件懒加载进行加载的,或者是懒计算的。

这种即用即加载和Hibernate的延迟加载或AJAX的异步加载是有区别的,AJAX的异步加载会发出很多Http请求;而Hibernate等延迟加载是无法跨请求的,只能在一个请求响应发往客户端结束前全部完成(Open Session in View)。

[该贴被banq于2012-12-02 11:51修改过]

lostalien
2012-12-03 14:59
属性为啥非要用动态的?就为了增加属性时不重启?这种用键值对的方式设计表,是万不得已的选择。。。。

snow0613
2012-12-03 18:56
2012-12-01 17:39 "@shefansxyh"的内容
对于在java中这种动态属性的设计,从本人的理解和能力上来讲,已经觉得是极致了,当本人说出这种想法时,遭到同事的反对,理由是这种设计“反正有各种问题”,问其原由,一句“反正有问题”,并作出了“我现在对Java反感的很,我们要用Python” ...


技术都不是问题,敢问你那个所谓的同事,是你的领导?

猜你喜欢