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

代码生成器的成长过程
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.

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

  1. MySQL云数据库+微信小程序+Python做项目

    MySQL云数据库+微信小程序+Python做项目 文章目录 MySQL云数据库+微信小程序+Python做项目 云数据库部分 Python连接云数据库 微信小程序连接云数据库 云数据库部分 大学生如 ...

  2. 珠宝玉石类小程序严格风险控制|没有资质不建议做了

    微信团队于2022年09月16日,发布珠宝玉石类小程序严格风险控制举措,请各位开发者及时开展相关自查调整工作,遵守平台运营规范,共同营造良好的平台内容生态.对于珠宝玉石类小程序的资质和商品种类做了明确 ...

  3. mysql 定义class_MySQL数据库类的定义

    俗话说好的开始是成功的一半,而PHP+MySQL项目中数据库的操作是重点之一,能否简化数据库操作程序的编写,就成了影响工作效率的关键之一. 所以小阳并不是一开始就做页面,而是先建立一个dbclass. ...

  4. CodeIgniter自带的数据库类使用介绍

    为什么80%的码农都做不了架构师?>>>    在 CodeIgniter 中,使用数据库是非常频繁的事情.你可以使用框架自带的数据库类,就能便捷地进行数据库操作. 初始化数据库类 ...

  5. 微信背单词类小程序,小鸡单词源码下载,打卡微信小程序

    微信背单词类小程序,小鸡单词源码下载,微信小程序开发学习案例,小程序开发教程.一个用来背单词每天打卡的微信小程序,还有词汇测试,包含多种词库后台由腾讯云wafer解决方案. 前段时间开始学做微信小程序 ...

  6. Dedesql数据库类详解(二次开发必备教程)(转)

    http://www.dedecms.com/help/development/2009/1028/1076.html 织梦DedeCMS的二次开发不仅仅是会写写织梦的标签,会制作织梦的模板.很多时候 ...

  7. 云服务器怎么执行sql文件在哪里,总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例...

    总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例 发布时间:2020-10-19 14:58:08 来源:亿速云 阅读:83 作者:小新 这篇文章将为大家详细讲解有关总结帝国CMS下在 ...

  8. mysql数据库新浪博客_4.MySQL数据库类的定义

    4.MySQL数据库类的定义 (2008-06-16 20:33:09) 标签: 杂谈 4.MySQL数据库类的定义 俗话说"好的开始是成功的一半",而PHP+MySQL项目中数据 ...

  9. java性能瓶颈分析_Java性能优化技巧整理,做一个深度的程序员

    原标题:Java性能优化技巧整理,做一个深度的程序员 在我们身边是一大批的程序员,层次不一,但是放眼观,我们很容易就可以看到那些是业务型程序员,那些是有层次的程序员.注重细节,注重性能,做一个有深度的 ...

最新文章

  1. UART的FIFO功能
  2. Head First JSP---随笔一
  3. mysql 用户名中主机$_phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接。您应当检查配置文件中的主机、用户名和密码,...
  4. Ocelot简易教程(五)之集成IdentityServer认证以及授权
  5. web.xml详细配置
  6. pytorch 的L1Loss 的计算方式和MAE 的计算方式的差异点
  7. linux 硬链接 软链接_Linux中的软链接–完整参考
  8. 一些TC内置的环境环境变量(注意字母必须大写,且只能在TC内用)
  9. 虚幻引擎图文笔记:导入FBX骨骼动画(附官方FBX模型下载)
  10. GJB 质量保证大纲(模板)
  11. JavaScript 运行机制(EventLoop)详解:一篇文章全部搞懂事件循环
  12. U盘Windows PE 安装系统简易教程
  13. 【计算机组成原理】学了计组,CPU执行时间你肯定会算了吧
  14. 一个用在手机上的简单js拖拽效果
  15. 通过新浪天气api查询天气
  16. JAVA中的Iterator
  17. 内容策展的4个成功案例
  18. 手机为什么手机里的计算机没在桌面,为什么安卓手机锁屏后动态桌面就不见了?教你设置软件后台运行!...
  19. httpclient JAR包下载地址
  20. Java怎么打开文件夹

热门文章

  1. 信息奥赛一本通(1325:【例7.4】 循环比赛日程表)
  2. 信息学奥赛一本通(1108:向量点积计算)
  3. 和为 k 的组合(51Nod-1268)
  4. 数的划分(信息学奥赛一本通-T1440)
  5. Charm Bracelet(信息学奥赛一本通-T1294)
  6. 31 PP配置-生产车间控制-定义计划策略组
  7. 10 CO配置-控制-成本中心会计-定义成本中心类别
  8. 机器学习--K折交叉验证(K-fold cross validation)
  9. OpenVINO InferenceEngine 之Grap file
  10. STM32那点事(2)_时钟树(下)