webskywang:
1)做项目设计数据库在先,使用数据库在后更加符合行为逻辑。面向对象的设计,数据库建模自动化是正向的过程,逆向呢?ORM的问题在与灵活性受限制,于是智能化不高。RoR,Grails,Django不管走多...
1) 做项目,我一般喜欢用OOAD的方式来考虑问题(当然,报表一类的项目不适合)。UML的类图出来之后,然后再根据这个实现数据库Schema设计。我是Martin 的信徒,在我看来,Rich Domain Object完全适合业务复杂的系统。既然选择了Rich Domain Object,那么ORM几乎是天然的选择。Hibernate在维护实体对象关系的成熟性和智能性上,已经走得很远了--如果你做过两年以上的Hibernate项目,基本通读其源代码的话。
另外,我举的这些解决方案,只是在其固有优势的领域才能发挥效用。另外,RoR,Grails这些Full Stack的动态语言框架,本身就是模板+脚本+约定重于配置。
Domain到Schema,可以实现。Schema到Domain呢?这个么,Java里,现在很多IDE都能做到了。MyEclipse,Netbeans。但是代码质量么...我没见过自动代码生成工具能够生成心目中高质量代码。
是的,任何一种解决方案,几乎天然地只能适应有限的应用领域。那么我再举一条关于企业开发的名言:“没有银弹!”
2)对开发语言的兼容,这是个伪命题。Hibernate根植于Java社区(NHibernate不做讨论),RoR根植于Ruby社区,Django来自Python社区。不同的语言社区,不同的社区文化,不同的技术引导着,必然会产生不同的解决方案。我做Java,但是我不会有有色眼镜去看待其他社区的优秀方案,相反,我会去读,去尝试着用,去思考其独特的优势。世界上没有一统天下的开发语言,自然也没有一统天下的解决方案---为什么要语言兼容呢?就算是.NET平台,我也可以很负责任地说,C#开发人员占多数。VB.NET呢?J#呢?Delphi.NET呢?JScript.NET呢?各自的比例是多少呢?你会容忍你的团队里,有人用C#,有人用J#,还有人用VB.NET么?
3)Active Record,这个RoR中的ORM层,来自于Martin Flower的企业设计模式。个人认为,Ruby这种弱类型的动态语言,对于实现Active Record有着天生的优势。我曾见过形形色色的Java代码模仿Active Record--(我也曾这么尝试过),但是很遗憾,静态类型编译型语言,为了让Domain对象变得像Ruby Class那么动态(运行时加入熟悉,注入方法,注入上下文),代码变得异常丑陋。我不得不让我所有的Model都继承一个封装了数据库操作的超类,代码难以测试。
你想要在编译时实现Active Record,或者说,编译前自动Get Code在生成代码再编译.这是个有些有趣的主意。那么请问,你的编译之后的代码,如何Debug?源代码里的那个干净漂亮的Model,都不是一个东西
了。或者说,你原来那个漂亮干净的model,现在被掺和进去了一堆自动生成的代码,变得臃肿不堪?
当然,我很期待看一下C#实现的Active GetCode来实现某种形式上的Active Record。
另外,很多重复,呆板的代码,可以通过重构来优化,或者通过IDE的自动生成机制来实现。
总结:你说的那些主意,在某些时候,某些项目,是有意义的。但具备多大的普遍性和必要性,则是另外一回事儿