`
pcajax
  • 浏览: 2108399 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

为什么我做数据库类的程序要用代码生成器,而且是前前后后,反反复复 [转]

阅读更多

 

前几篇文章提到改善工作效率的工具,这此工具对我们日常开发或多或少的有些改善。有网友对代码生成器感兴趣,有些工具还会可能会改变你开发数据库软件的思路和模式,这里我也来侃侃代码生成器

代码生成器的成长过程
1 每个类都要一个个的写,很费力。在数据库为主的日常开发中,大多的日常工作就是数据表的增删查改,大多的代码都差不多。
2 写的数据访问类多一点,我会注意每个类的命名。比如,如果表名是Pubs,我的实体类名叫PubsEntity,数据访问类名叫PubsDAL,接口层的类名叫PubsService,这样遵守一个统一的模式,开发和维护也容易理解。方法的命名也要统一,比如增加一条数据,不能有的叫Add,有的叫Insert,这样不和谐。
尽量规范,统一。
3  类的设计和方法的设计经过一段时间的锻炼,逐渐规范。还需要把他们分层,放到不同的命名空间和程序集(Assembly)中。比如,实体层的数据实体叫YiHu.IPR.BusinessEntity,数据访问层叫YiHu.IPR.DAL,接口层叫YiHu.IPR.Service,界面层都放在YiHu.IPR.Web命名空间中,
YiHu是公司名,IPR是系统模块名称。
然后把这些类分别放到不同的assembly中,修改AssemblyInfo.cs,全部项目用同一个的AssemblyInfo.cs,各个assembly版本号一致,文化,签名文件(sn.key)一致。
4 于是,各个细节地方都开始规范。但是,问题又来了,需要手动去敲键盘,当系统的实体层和数据访问代码很多的时候,经常会敲错,敲漏字符。于是,弄个代码生成器吧,直接按照规范的设计好的结构生成代码,不容易出错,即使错了,也是代码生成器的bug,一定要把他调试正确。
5  代码生成器有了,开始偷懒的日子就多了。每天可以少干两个小时的活,别人还在敲键盘的时候,你轻盈的打开你的代码生成器,新建一个数据库连接,然后点击Execute按钮,所有的代码就呈现在你面前。这样重复了几个月后,感觉做程序没有多大的技术含量。于是,开始研究架构,如何把经得起考验的各种架构溶入到你的开发中,让程序开发变成一种充满智慧的体力劳动。终于把Dumwash,PetShop,DinnerNow的代码架构研究熟练了,可是问题来了,还是要从头开始写代码呀,这样又得一个个字符的敲,又回到原始社会。于是,又开始研究如何把最新研究的架构和代码生成器结合起来,一举两得。经过一段时间的研究,发现要改变一下代码生成器,要适当提取一些代码出来,放到一个公共的框架中,为了让新研究的架构能运行,不得不这么做。
6  经过一段时间的磨合,代码生成器终于可以和各种架构结合起来,于是一个个项目模板产生了。不同的项目模板代表不同的架构方案,我还特地做成模板,方便新项目的开发。这种日子可以持续很长时间。
7  又有新的发现,于是不停的改进你的代码生成器。当需要WCF支持的时候,给每个实体类自动加上[DataContract],给接口层类加上[ServiceContract];有的人喜欢拼凑SQL语句,有人喜欢用参数,于是给代码生成器同时提供两种模式的代码生成;有的项目用C#写的,但是负责维护的人只会用VB,于是用CodeDOM技术给代码生成器升级,让它同时支持生成VB和C#两种代码;有时候发现单独打开代码生成器很麻烦,而且很慢,界面也比较难看,于是研究Visual Studio SDK,把代码生成器直接集成到Visual Studio中,这样打开一个工具(Visual Studio)就可以完成所有的工作,真舒服;有时候发现生成的代码不改不行,改了又不好识别,于是把生成的代码加上partical标签,放到一个文件夹中,自己手写的代码放到另一个文件中,因为CLR是以方法为单位做JIT的,那些不再被使用的由代码生成器产生的代码,可以不用管它,也可以在适当的时候把它移除,只要用一个key就可以了(在方法名上点击右键,查看引用,如果这个方法被用过,底部的窗口会调出被调用的地方,如果没有被调用过,可以放心的去掉。这个重构功能,比查找功能强大很多)
于是,工作变得很有趣,也离不开代码生成器。

代码生成器的组成
1  SQL语句生成。自动生成SQL语句的CRUD脚本代码,还有喜欢用存储过程的,也要生成存储过程
2  类生成器。 对照数据库的表,生成实体类,数据访问类,接口类,界面绑定代码。
为了支持不同类型的数据库,需要生成不同类型的数据库访问类,比如对SQL Server,参数是SqlParamater,对于Access系列的数据库,参数是OleDbParameter。我的代码生成器的方案是,生成统一的代码,由于我生成的代码是基于Enterprise Libiary的,企业库本身支持访问多种类型数据库,我生成的代码自然就持多种数据库。不过,一个SQL Server就够折腾的,我怀疑支持多种数据库的现实性。
购买过SQL Server 的正版License后,我想你的boss同意你去折腾Oracle的可能性很小。小到很多公司的员工在抱怨公司还没有发年终奖的时候,其实有更多的公司根本就没有年终奖。
3  界面生成. 生成基本的界面控件,如表名是Employee,有一个字段Name;于是生成一个Table,ID是Employee,生成一个文本框txtName,还同时生成数据实体和界面绑定的代码,这样才有生产力。你需要把界面中需要的地方换成DropDownList,或DateTimePicker,大部分界面代码还是可以直接用的。
于是,代码生成器变得复杂,也变得专业。

反对的声音
我看过一些关于代码生成器的评论,大家说的有道理。
1)要按照模板来生成代码才有意义,否则它根本就是个字符串生成机,于是把CodeSmith搬出来论事。
2)有的说代码生成器生成一大堆的没有质量的垃圾代码,有什么用呢。代码生成只是个字符串生成器,输出代码质量差,不灵活。
3) 老板如果知道有这个东东,会缩短项目的deadline, 还是不用的好,就当它不存在一样。
于是,代码生成技术并不流行,虽然Visual Studio也是个很好的代码生成器,但是都不承认。

关于数据访问模式
在《领域设计模式》这本书,作者提到过三种数据访问模式
事务脚本:我们经常用的,我的代码生成器中用到的,就是这种模式,简单,但是缺乏灵活性,说白了就是缺乏面向对象的设计,经不起变化的考验,只是一堆的类堆砌而成的系统。

ORM:对象实体框架。有了这一层,我们可以完全忘记数据库的存在,ORM会自动生成native的数据库SQL脚本,自动处理好对象之前的关系。
比如NHibrnate,NBear,这两个框架以前都折腾过,实际运用他们做过一些小项目,还做过相关的小工具来辅助开发。现在,支持NHibernate的工具都可以直接集成到Visual Studio中,也有相对应的代码生成工具流行于各大论坛。唯一的问题是如果这个项目不是自己带头的,你没有选择NHibrnate的权力,此外,这个框架会让你远离ADO.NET,你根本看不到亲切的SqlConnection在那里,取而代之的是一大堆的Session,SessionFactory,学习成本陡然增加;在一个团队中,有的会NHibrnate,有的不会,难道要给单独的时间去学习,这样对有的员工不公平;我经历过的一个ERP项目,当项目进行到中期的时候,人换得比较厉害,换调(也可以说是走)了近一半的开发人员,新手都不会NHibrnate,你一点办法也没有,项目的deadline紧急,只好不会NHibrnate的,直接用ADO.NET,用Application Block。
但是,如果你做.NET开发,连ADO.NET也不会,你可能会找不到工作。学习太偏的领域的知识,比如NHibrnate,学起来有风险,高处不胜寒,用起来也有风险,而且也不确定哪一天你才有决定权力去用这个东东,即使开始用,你也要对NHibrnate的细节方面很熟悉,很熟悉。

领域模式:我对这个模式的理解不深,大概你需要用纯OOP的方式去设计一个软件,而不像我们一开始就瞄准数据库,从数据为脚本开始。

于是,代码生成器得到进化和改良。虽然有些改良像清代的《戊戌变法》,理论知识一套一套的,有板有眼,但做起来并不容易,把各种思想溶入到日常的开发工作和工具中,是个慢长的进化过程。
我在接触代码生成器之前,也研究过这三种模式,至少我研究过,做出的东东也不至于太烂。
流行于各大论坛的代码生成器也很多,我也有用过一些,从改善工作效率的角度来看,它们都很不错。
 
在这篇文章里,我没敢截个图放出来,我理解反对代码生成器的开发人员的感受。
每个工具只是为改善我们的工作效率而产生的,如果一件工具或方法不能改善你的工作效率,你要毫不犹豫的把它去除。做了几年的数据库软件和一年的报表,我本身开发能力并不强,自己折腾的代码生成器也很烂,经常死掉,有一些特性一直想加入到代码生成器中,都没有时间去做,也有点不敢做。
借助于代码生成,我能有更多的时间花在系统的细节方面,尽量做出专业的系统,界面要专业,出错提示要专业,各个细节要多听用户的想法,直到取代它心目中神圣的EXCEL。
也因为代码生成,我的系统设计能力一直没有长进,有固定的模板,固定的代码生产方式,可能考虑的各个方面(分页,主界面,后台,基础框架,通用用户权限角色)都考虑好了,于是花费更多的时间在分析和理解客户需求方面,与客户沟通。主动承担项目的前前后后的大事小事,也许这是一个信号:转行

做程序快做到了三十岁,心里不虚,技术不强也不太烂,各种技术方案多多少少都有点积累;
经历过一些大大小小的项目,有时候真的怀疑自己,我这个性格适合去做项目吗?程序员出身的性格,有多少人能幸运的转行成管理,多乎哉?不多也。

如果有积累的习惯,你可能早就有自己的代码生成器,可以定制修改的,如果没有,从现在开始也不晚。
每三个月或半年要主动思考一下,如何改善工作效率,几年后,你工作的效率会比现在成倍的提高。
我给你一个方向,你可以朝那里努力,也许我本身并不怎么强,会误导你;
To believe it or not, It’s up to you.

分享到:
评论

相关推荐

    c#学习笔记.txt

    如前所述,我是一个狮子座男人,一度我认为学习Java会使我看起来与众不同,可是几个月以后我放弃了这个选择,我看了论坛里关于这两种语言孰优孰劣的讨论,最终选择了C#,请不要问我为何做出这样的选择,很多人认为...

    来客电商小程序开源版

    开源版的电商小程序非常惭愧地说,最开始是完全模仿着拼多多的功能模块来做这套系统,也仅仅是为了磨合团队,提高业务水平而已。 可谁知道,做完了拼团基本功能,还发现有评价没有做,好吧,继续磨合,等到做完了...

    24款纯翻页代码 内涵code

    不要下载。我是来赚钱的哈哈哈反反复复反反复复反反复复反反复复反反复复反反复复反反复复

    Word操作C#对Word操作的造作代码示例

    C#对Word操作的造作代码示例反反复复反反复复反反复复反反复复反反复复反反复复

    eda分频器的程序vhdl描述

    反反复反复反复 反反复复反反复复放风筝

    c++资源代码分支结构

    可以让我们更好的学习c语言,代码分析等额发反反复复v

    vc++chu初级数据库,耗用

    chu初级数据库,耗用

    飞鸽源代码 局域网是少数

    啊啊上的反反复复反反复复反反复复反反复复凤飞飞爱上对方萨菲

    一款好用的文件比对软件

    或者你写了几分文稿,反反复复地修改过好几次,你想找回他们具体的差异,但这时想要用肉眼去对比,一行一行地查看无异于逼自己的脑细胞去自杀。其实,我们大可以利用一些专业的对比软件,比如Beyond Compare;但BC是...

    效果图自动切片生成Div+Css工具

    1分钟切片生成DIV+CSS! 您是否还为花几个小时,甚至几天对网页效果图进行切片、制作DIV和CSS而烦恼? 您是否还为完成紧急任务,而人手不足而苦恼? 您是否还为快速展示、快速开发、快速成交而苦恼? 您是否还...

    深入理解opencv计算机项目书籍和代码

    opencv项目书籍,不要错过反反复复发反反复复发发反反复复凤飞飞

    工程师技术资料,牛逼轰轰反反复复

    工程师技术资料,牛逼轰轰反反复复,,,,,一点学习

    计算机书籍\plsql编程.ppt

    此番反反复复反反复复反反复复反反复复反反复复吩咐过 gssssssssssssssssssssss该反反复复反反复复反反复复反反复复吩咐后 gfffffffffffhgggggggggggg吧vvvvvvvvvvvvvvvvvvvvvvcccccccccc如果他吞吞吐吐吐吐吐吐吐吐...

    方配WMS框架快速Web应用开发教程

    很多的同学认为学习.NET 开发要比学习 JAVA 做项目要容易吧,不过用.NET 做一个小程序很简单, 但要你开发一个商业化系统就没那么容易了,而这套框架的目的就是让新手开发一个系统,就像他 们开发一个“计算器”小...

    JAVA音乐播放器好好好好好好好好好好好好好

    类似于酷狗的音乐播放器源代码反反复复反反复复反反复复反反复复反反复复反反复复反反复复反反复复反反复复反反复复反反复复分拜拜拜拜拜拜拜拜拜拜吧

    数据分析思路.pdf

    要确定需求就必须与需求⽅ 进⾏沟通,清楚的确认需求的内容或者⾃⼰要分析前必须要清楚你想要的结果是什么⽅向。举个简单的例⼦:年底将近,双⼗⼀⼤促销在 即,数据分析师们⼜到了⼀年最⾟苦,最悲催的时间段。然⽽...

    剧本杀元宇宙.pdf爱是反反复复反反复复付费

    智慧

    SPCE61A语音程序

    程序你的哦的那个的的的是砍死萨克斯乖乖反反复复吩咐

    在线借阅系统反反复复

    乱得更好的疯狂进攻,阿罗汉结合法,忽然就好了案件,阿富汗加快地方哈就,路爱人更好的浪费空间哈多了会计法规,阿娇和嘎嘎快!

    网页自动生成DivCss软件-(PC+手机+公众号)全能版

    用本软件吧,只需要导入效果图,拉框线就可以生成标准的兼容性的DIV+CSS,是公众号开发、手机网页开发、平板网页开发、网页制作,网页切片、企业网站、门户网站网页布局开发、批量做模板的最佳工具。 好的工具可以...

Global site tag (gtag.js) - Google Analytics