Model (POJO) driven GUI framework 讨论
在框架问题上, 我们不提倡经朝三暮四, 也不提倡从一而终.
现在流行POJO, 有人甚至命名为naked bean(裸奔?), 从hibernate/spring到EJB3, 大家都在裸奔. EJB3甚至连原来厚重的大棉袄都没脱就扑通一声跳下水.
还有一个好玩的东西就是xml, 叫嚣了10年, 最终大家发现这玩意费时费力, 费神, 但是赚钱赚吆喝. 多少程序员把本来挺好的程序改成基于xml的配置, 然后使劲的调试. 这些xml客户不需要写, 最终把自己累坏了. 为什么微软的产品里面到处都是xml? 没错, 但是人家还有图形设计工具啊, xml是生成的.
Annotation作为桥梁, 可以这两个问题, 把配置写到程序里面, 让POJO(Entity)本身提供配置描述, 来驱动框架生成完整应用.
企业应用, 80%是烦人的重复的只有20%技术含量的增删改查之类的东西. 强壮的框架就是要覆盖这里无聊的部分, 几个可重载的重要组件, 甚至全部基本流程. 去掉的来源, 就是标注过的POJO.
Entity bean+JSR303可以提供: 存储/验证信息. 还需要额外定义(应该有个JSR标准):
说明: 标题/帮助/i18n
控件: dropdown还是radio
视图: 每个视图下的tab/group/order
Rule: 联动关系等 (涉及到逻辑验证)
有了标注过的POJO, 驱动出Swing/Web/CLI(命令行)都不难.
不是MDA, 是纯POJO+Annotation.
现在已有一些Modal driven的框架,大多数基于web, 少数还支持swing. 参考:OpenXava,注意后面的相关链接.
Tips:
复杂case怎么办? 扩展通用实现
Annotation太多怎么办? 把视图定义和rule独立出来, 把说明部分放到资源文件, 做个插件把bean当成表格看
还想偷懒怎么办? MVC/资源/缺省命名约束
why annotation? IDE support
每个公司都有框架的喜悦和烦恼, 欢迎大家来探讨一下.@View( // 2members="year, number, date;" +"comment;" +"customer { customer }" +"details { details }" +"amounts { amountsSum; vatPercentage; vat }" +"deliveries { deliveries }")public class Invoice {...}
OX的方法比较紧凑,但是重构的时候容易出错,我个人觉得可以用字段名常量去增强一下,另外视图最好用单独类来表示,因为和视图相关的东西比较多。当然,这玩意是复杂情况采用的。命名上固定用Xxx$View就可以找到了。
对于简单界面,new MdaGui(pojo), 这是个通用实现。
对于复杂界面,MyXxxGui extends MdaGui{这里去重载,增加一些特殊实现}
上班忙,有空再研究你的方案~谢谢 3 楼 steeven 2009-12-16 如果将来有了UI Annotation标准, 就像JPA一样, 对象定义不动, 换个框架, 就能换个UI, 不管是web还是swing还是flash, 甚至多种风格同时存在. 太容易了. 量产 4 楼 zhufanamo 2009-12-16
现在的不少框架和组件,都是以解释型为主, 这种用很精炼的语言描述就能实现一个很强的功能界面
但是这种会有几个问题
1. 会java 的人不会在这种框架下写代码
2. 出现问题不会修改。因为pojo上的描述语言是由另一个解析器分析后才变为一个强大的功能界面,所以解析器里大部是共性抽象的代码.
可能因为所在的公司性质不同有关,我们的员工都是1年半~2年为一个周期轮换
所以我们的要求是让会用java 的人,就能在框架上写代码
框架给我们的帮助是写的增删改查之类功能,是在填空,而不是在从头开始句
每个公司都会有固化的几套业务。 这些业务的模式都是一样的,可能每个模式里只要换几个关键参数就可以。
所以框架就是要把业务的流程都生成出来,再由程序员去填空。
当然这些流程不是一个个精炼的描述语言,而是实现的代码。懂java 就能看得懂的代码。没有解析器,有什么不爽就直接修改。
5 楼 hatedance 2009-12-17 我对这个也很有兴趣,我管它叫OUM,借用ORM的思路,OUM就是Object UI Mapping.
目前我自制的山寨货能支持Swing和HTML2种实现。 6 楼 steeven 2009-12-17 zhufanamo 写道
现在的不少框架和组件,都是以解释型为主, 这种用很精炼的语言描述就能实现一个很强的功能界面
但是这种会有几个问题
1. 会java 的人不会在这种框架下写代码
2. 出现问题不会修改。因为pojo上的描述语言是由另一个解析器分析后才变为一个强大的功能界面,所以解析器里大部是共性抽象的代码.
可能因为所在的公司性质不同有关,我们的员工都是1年半~2年为一个周期轮换
所以我们的要求是让会用java 的人,就能在框架上写代码
框架给我们的帮助是写的增删改查之类功能,是在填空,而不是在从头开始句
每个公司都会有固化的几套业务。 这些业务的模式都是一样的,可能每个模式里只要换几个关键参数就可以。
所以框架就是要把业务的流程都生成出来,再由程序员去填空。
当然这些流程不是一个个精炼的描述语言,而是实现的代码。懂java 就能看得懂的代码。没有解析器,有什么不爽就直接修改。
小朱真是精打细算,对于流动性很强的公司确实最直观就好。
生成的代码将来横向重构会有问题,对于维护期不长的也无所谓了。
ROR也是生成代码。
偶想是用一框架驱动出各种组件,包括一个字段,用在wizard中的一个小画面,带字段level验证,带外键对象的链接(像sap),可大可小,可以灵活组装应用。
7 楼 steeven 2009-12-17 hatedance 写道我对这个也很有兴趣,我管它叫OUM,借用ORM的思路,OUM就是Object UI Mapping.
目前我自制的山寨货能支持Swing和HTML2种实现。
能不能晒晒你的山寨标记和思路?大家遵循同一山寨标准以后可以用标准model直接比较框架来~。 8 楼 hatedance 2009-12-17 steeven 写道hatedance 写道我对这个也很有兴趣,我管它叫OUM,借用ORM的思路,OUM就是Object UI Mapping.
目前我自制的山寨货能支持Swing和HTML2种实现。
能不能晒晒你的山寨标记和思路?大家遵循同一山寨标准以后可以用标准model直接比较框架来~。
那我就献丑了,以下是我的基本思路:
1 类型映射。 ORM里,对象类型和数据的字段类型做映射,比如string -> varchar;同理,在OUM里,string -> textbox;其他以此类推。
2 实体映射。 实体有各种属性,自动生成的界面里就通过反射把属性都列举出来,再根据类型映射生成界面。
3 方法映射。 方法有很多参数,也是根据参数的类型映射成界面组件。
4 对象映射。 以service 层对象为例,一般是单例,比如int Calculator.add(int x,int y)。对象名字就是一级菜单的名字,方法名作为其下的菜单项。返回值也可以在界面上输出。
有兴趣的话,我等下上个截屏给大家看看。 9 楼 steeven 2009-12-17 hatedance 写道
那我就献丑了,以下是我的基本思路:
1 类型映射。 ORM里,对象类型和数据的字段类型做映射,比如string -> varchar;同理,在OUM里,string -> textbox;其他以此类推。
2 实体映射。 实体有各种属性,自动生成的界面里就通过反射把属性都列举出来,再根据类型映射生成界面。
3 方法映射。 方法有很多参数,也是根据参数的类型映射成界面组件。
4 对象映射。 以service 层对象为例,一般是单例,比如int Calculator.add(int x,int y)。对象名字就是一级菜单的名字,方法名作为其下的菜单项。返回值也可以在界面上输出。
有兴趣的话,我等下上个截屏给大家看看。
很有兴趣! 有图有真相!
3/4方法映射很有趣, 应该很实用, 解决了怎样生成菜单项的action问题.
但是各种标记要在方法参数上, 有些标记不知道有没有限制.
另外向导问题能解决吗? 向导比较复杂.
10 楼 icefire 2009-12-18 steeven 写道hatedance 写道
那我就献丑了,以下是我的基本思路:
1 类型映射。 ORM里,对象类型和数据的字段类型做映射,比如string -> varchar;同理,在OUM里,string -> textbox;其他以此类推。
2 实体映射。 实体有各种属性,自动生成的界面里就通过反射把属性都列举出来,再根据类型映射生成界面。
3 方法映射。 方法有很多参数,也是根据参数的类型映射成界面组件。
4 对象映射。 以service 层对象为例,一般是单例,比如int Calculator.add(int x,int y)。对象名字就是一级菜单的名字,方法名作为其下的菜单项。返回值也可以在界面上输出。
有兴趣的话,我等下上个截屏给大家看看。
很有兴趣! 有图有真相!
3/4方法映射很有趣, 应该很实用, 解决了怎样生成菜单项的action问题.
但是各种标记要在方法参数上, 有些标记不知道有没有限制.
另外向导问题能解决吗? 向导比较复杂.
我也很有兴趣,现在对繁杂的页面,已经很烦了。 11 楼 hatedance 2009-12-18 做了段演示,这个轮子还很毛糙,我对swing也不熟,不要见怪,大家看个意思。希望flash能播放。
基本上实现起来也不麻烦,就是根据反射,得到所需的信息,来生成界面。多数额外的信息都是用annotation提供的。
只要在service类里加一个方法,就会生成对应的菜单项。
每个界面都有一个submit按钮,也是用反射去invoke对应的方法。
这种自动生成的界面,只适用简单的需求。但对付大多数企业应用,特别是CRUD是很好的。
欢迎拍砖!
12 楼 steeven 2009-12-18 很好很强大~ 上班中,晚上回去研究。
我记得SAP里面的对象间引用,显示名字,旁边有"..."进入选择/维护界面。 13 楼 steeven 2009-12-28 对不起,最近有很多问题要忙,稍后分解.