呵呵,一下子10条信息发到EMAIL里,可把我吓了一跳。这条贴子好久没那么热闹啦
多谢gondsoft发表这么多看法,我也发表一些愚见吧。非常同意“业务流程是可变的,业务对象也是可变的。没有一个方案能让所有的业务一劳永逸的重用”这个观点。这条贴子本身和我以前发表的东西都着重于O-R MAPPING,但我觉得实际上一切的一切,都是围绕一个主题——分层。既然一切都在变化,没有什么能够一劳永逸,那么唯一能做的就是在变化出现时把影响尽可能减到最小。
在《重构》一书(中国电力出版社,侯捷译,p61)中有这样一句话“计算机科学是这样一门科学:它相信所有问题都可以通过引入多一个间接层来解决”,虽然有点夸张,但确实有其道理。事实上有一些约定俗成的分层已经成为业界的行规了。例如表达层(presentation)与逻辑层分离。在澳洲这边的大学的本科课程,教编程基础的时候,肯定至少有一堂课是用来提醒学生:用户界面与逻辑需要分离。连数据结构这样的学科,讲师也会不厌其烦地提醒学生“打印功能不要放在运算函数里面,否则别想及格”。因为把表达代码与逻辑代码混在一起的程序是根本没有重用性可言的。
而另一个分层,也就是分离数据访问与逻辑层,就没有那么简单了。对于小型应用来讲,业务逻辑往往就体现在SQL STATEMENT里面,或者干脆作为储存过程放在数据库端了。而用程序实现一些稍微复杂的计算,也是一目了然。对于这种情况,其实根本就不需要(或暂时不需要)分离数据访问与逻辑代码。我觉得之前那么多朋友认为我们之前讨论的东西过于复杂,问题就在于此。架构方法应该是与项目规模密切相关的。以70年代GOTO满天飞的流程化方法来做企业应用固然不妥,但对小项目一下就引入中间层,进行O-R MAPPING也是浪费资源的。
正如Martin所说:“我更倾向于容忍混合domain与data source。对许多简单的应用,这两部分可能看上去非常相似,这样的话我更倾向于把它们放在一起。但一旦我组织业务逻辑的方式开始看上去显得与data source的定义不同,我会希望把它们放到不同的模块中去。”。一旦业务逻辑与data source的定义开始不同的时候(随着系统成熟,data source结构趋于稳定,也难以改变。而业务逻辑则继续不停变动),把业务逻辑与数据访问混在一起的代码就变得难以修改与重用了。我觉得只有在这时,才有进行分层,甚至用O-R MAPPING工具封装数据库访问的必要。
gondsoft兄的讨论,也正体现了这个标准。可以看出,你的项目中业务与数据库是紧密结合在一起的。这没有好或不好之分,只要它们仍然相似,就应该把它们放在一起。但是如果有朝一日它们的差别开始越来越明显了,就可以考虑把它们分开了。