权限管理、用户权限系统、开源用户权限系统、信息化建设标准基础数据管理平台
代码改变世界

大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(三)商业逻辑代码部分

2009-06-17 19:29  通用C#系统架构  阅读(9593)  评论(164编辑  收藏  举报

其实,写好几套管理软件后发现,其实大多管理软件,很多也不过是数据库设计得合理一些后
就是把数据搬来搬去而已,添加、删除、修改,然后进行一些统计分析而已。其实写代码都是
那些简单的程序Copy来Copy去,没啥需要不断突破的,代码的相似程度很大,结构体系也很
接近,处理逻辑也非常相似。

 

我的成长过程是:
阶段 1. 每个类都是一个个写,后来发现大多都差不多啊。
阶段 2. 注意每个类的命名,函数的先手顺序等,尽量进行统一规范,自我统一规范。
阶段 3. 对都规范化了后,新的类编写,就不从零开始了,才是Copy前面的代码,效率提高了。
阶段 4. 要求别人也按自己的方式写代码,难度就提高了,别人不愿意按你的思维方式来,代码的量太大。
阶段 5. 既然代码都大同小异,那就搞个基础类,叫BaseDao,然后继承一下这个基础类,很多代码都不用重复写了。
阶段 6. 别人就算按你的方式写了代码,发现编码很乱,不规范,不愿被别人约束,都想自由发挥,各自为战。
阶段 7. 别人还不是愿意写代码,那就弄个代码生成器来用程序来生成,这样又规范,又提高效率,又快捷了。
阶段 8. 生成好的代码经常需要改,那就干脆把自己写的代码、代码生成器产生的代码,分开来管理,这就更严谨规范了。

其实凭良心来讲,做软件项目,前台做页面部分的代码,页面逻辑控制的代码,远远超过了后
台控制的代码
,并不是把后台做好了,一个项目就大部分工作完成了,其实现在软件项目大部
分工作量还是在前台部分,有可能很多人有个错误的认识,做软件,好像就是写后台代码一样,
其实这部分的工作量在常规项目里估计1/3都不到,这也是我以前的一个错误认识之一,现在
我甚至认为这部分工作连1/10都不到,整个软件项目里其他事情上消耗的精力更太多了。

我觉得现在谁能有采用有效的手段,大大提高前台设计及用户交互、页面逻辑判断、数据展现上
工作量和工作效率,应该是能得到大家的认可,能不能赚钱是另一回事情,能得到大家的普遍认
可也是相当苦难的事情了。

这部分主要遇到的问题:
1. 分层过多,程序运行速度慢、代码量大,各个层之间的数据库交互也是一个很大问题,交互
数据的处理也是一个不少的代码量,而且这些与客户关心的功能基本上没啥任何关系,劳民伤财,
写程序是为了解决客户的实际问题,不是为了玩架构玩理念,还是务实一些比较好。
2. 数据库的表名、字段名会经常变来变去,改来改去,要有效的应对这些变化,并尽量在编译阶
段把问题及时解决。

3. 代码生成器不是万能的,总需要增加几个方法等,这些代码不能混到一起去,生成器生成的
代码是不值钱的,随时随地都可以覆盖重新生成,但是你人工写的代码那一行已经远远超出10
元的价值,需要有效的得到保护及维护,代码是需要分开的。
4. 虽然现在写程序都是面向对象的,但是也不能信迷信完全相信ORM,包装得越多,灵活性越
差,性能也会下降,维护性也会降低,一些特殊的需要,为了提高性能等,SQL语句还是要支持
用户想怎么写就怎么些,谁也不是神仙,能搞出万能的高效ORM,我不信这个邪,以后应该是会
有的,现在可能是不会有的。

 

为什么有面对那么多新技术、新架构,一直坚持自己的,不跟风的理由

1. 我这个是2003年开始写起来的,那时候只有他们还没有出生,我不可能一直等这些知名的机构出来吧?
以后还会出来更厉害的架构,我也不是神仙,能知道什么时候能出来个啥先进的理念。

2. 这是我实际工作中的点点滴滴的积累,日日夜夜维护的结晶,运行很稳定,开发效率也高,
一个陌生的架构,需要我无学习理解,需要一个时间成本,也学习过微软的架构MSPetShop4
可能是我水平不够,我觉得那个不是我实际项目中需要的东西,那只是玩技术,里面也没多少我
可用的东西,例如权限怎么处理?组织机构管理?角色管理?用户管理?模块管理?消息管理?
工作流管理?空空的架子,那没用,我几天能架设个空架子出来,我需要有内涵,有内容,
空架子没用,还是需要啥都得靠自己干来填充好。

3. 架构还可以不断改进,学习别人的优点,取长补短,把别人的好思想理解透了,能引用到自己的
架构里来,那更需要水平,更能锻炼人的意志,经不起考验的,经不起改进的,经不起折腾的,就
本身不是什么好架构,很可能谁一大堆乱八糟的代码累加起来的。

4. 对自己的架构了解透彻,优点缺点有一定的掌握,在B\S,C\S下的,各种考量都是相对全面的,
老外也是人,未必老外的就比我的强,我也是执着的驴子,也在积极的吸纳别人的建议,每天都在
做实际项目,一切以实际效果来说话,不纸上谈兵。

5. 架构超级简单,一般人看看就知道怎么做的,菜鸟培训一周,自学1个月就可以上手了,我不太
需要高手,开发人员高兴的来,高兴的走,不依赖于技术人员,人是最靠不住的,人的脑子是活的

6. 程序边界,功能模块的边界处理,控制得很严,把某个层,某个定位推倒了,也没关系,只是
部分重构,不用全盘重构,其实架构与架构之间也没本质的天大的区别,大楼与大楼之间,人与人之
间,能有啥天大的区别,可能有,但是表面上是差不多的,一般人也不会去深入研究深层次的区别。

7. 我是靠模型的积累,业务知识的积累,玩的不是技术,不是架构,我的应该更侧重的是积累,积累
做不同项目中遇到的问题的解决方法的程序上的体现,只是大家习惯了叫架构,我也就叫了这个名字,
其实我这个更侧重于软件开发项目中的业务模型、业务知识积累

 

虽然我们的架构是比较晚们的,但是往往实际生活中与理想状态还是差距很大,所谓的现实是残酷的
经常会遇到
A: 项目很急,对项目的质量要求也不高,那我们会直接采用 页面UI调用 - Dao(商业逻辑) - 底层数据库,
绕过什么服务层,服务接口什么神什么的,等项目上线了,觉得这个项目有重复利用的价值或者其中有些逻
辑可以进行抽取优化,那我们会把这些封装到我们的底层通用类库里进行优化。若没多大价值的随便搞搞的
项目,就采用最低的分层原则,说白了就2层就可以了,也懒得瞎搞了,累啊。

B: 实在是遇到疯狂着急的小项目,甚至2层都不分,直接通过DbHelper类自己写SQL语句了,一层都
不分,编写的代码的量是最少的,见效是最快的,运行速度是最快的,这不得不承认不行,这样游击战
战术也非常适应实际项目的。

C: 我们是按B\S,C\S系统都能适应,甚至是考虑了最复杂得多数据库,多应用系统之间的交互调用等
问题,实际当中的项目往往没那么高的复杂性要求,完全按完美架构来编写程序,层很多,代码的量很
大,等真正项目上线时,客户根本不在乎架构,更在乎是的页面效果、运行性能、业务逻辑等,架
构设计等只是程序开发人员关心而已,客户不会看到将来系统要进行扩展,与其他系统交互等,客户真的
想这么多了,我们得向客户支付咨询费了,客户比我们还专家了,可能我的老板会想到这么远吧。

正规遭遇战还是要考虑战略战术,按部就班才是硬道理,大型的软件项目或者定位为产品型的软件项目,
还是严格分层,按规矩办事,才能提高整体的工作效率,单打独斗与团队作战的玩法是完全不一样的。
不去亲自感受是不会体会得到的。

我做sql语句生成器的原因:
1. 字段总是变来变去。
2. 有时候拆分SQL语句,非常不方便,拼接字符串代码很乱。
3. 编译阶段往往不会发现错误。
4. 增加字段,减少字段是否可以最快捷修改代码。

请看示意图图解



开发效率高的另一个表现就是,见图
 

例如我添加一个实体时,我需要判断这个实体是否重复了?那就用了一个很简单的方法,
this.Exists(BasePermissionTable.FieldCode, permissionEntity.Code);
函数,当然这个函数就写在 BaseDao里,继承一下,就可以,调用起来很方便。
别写那么多垃圾代码应该是好了很多,看看就明白是啥意思了,你要自己写方法
写sql语句,判断返回值等,估计要写上10行以上的代码了。

Add 方式是添加方法,里面会判断是否满足要求等一些列判断,关联操作等。
AddEntity 是真正的添加实体方法,其实推敲这些函数名字啥的是非常费劲的事情。
也是无形的财富,给方法都起个合适的名字,对我们英语水平不好的人来讲很费脑子。

其实不管什么管理类软件都是开发在标准数据库上,我很佩服发明论证数据库的人,
真的很伟大,其实我们做了很多管理类软件后会总结出来,数据库只有select、inserd, delete , update
语句类似,其实做开发时,我们也经常会遇到有些函数是经常被掉用来调用去,我总结了这些年的经验,
真理了一个标准的数据库操作类 DbLogic.cs。这个是比数据库访问类DbHelper封装得更多了一些。



以上图片不光看代码多,其实总共也没几个函数,只是为了调用方便,写了很多重载方法,稍微自己看几眼,很容易就知道怎么用了。
说得在白话一些,就是把常用的函数,都给提供出来了。

参数 dbHelper,主要是为了一些列操作,都是在同一个数据库连接上进行,不频繁Open、Close数据库,
并且为了灵活控制数据库事务为目的,提高数据库效率、增强灵活的并发控制产生的。

这些函数,在其他各个管理软件开发中,都会用到,而且也不是很多,很实用,新来的同事,稍微培训一下,也能看懂,
用的时间长了,函数也会越来越丰富,越来越稳定,越来越成熟,当然就会变得越来越经得起考验了。

就算你是讨厌用我的架构,这些函数用用也很爽的,代码写得也清爽,一看就明白,自己写出来整理好也很辛苦,别人的
若直接能给你,不是很省事嘛?而且大家都容易理解,一个团队里也好传播开来,会适当的提高代码的可阅读性及质量。

下面的图是,SQLBuilder.cs的程序截图,这个也可以当是没有,一个小工具,用也行,不用也行,我个人感觉
这个还是很有优点,就把截图放上来,因为实现这个也很简单,总共也没多少行代码,性能上也没啥影响。
 

 

其实我们是谁都不服谁的
我们国内的开发人员呢都有“让我做什么功能,只要你提出来,我什么都能弄出来,他
那点儿玩意儿我也能实现,没啥的
”,给点儿时间是不是可以把原子弹也造出来?那为啥
不是你早就弄出来一个了?其实这个是个谬论,会误导很多人,做一个东西,甚至写个函数,
都需要检查代码质量、思路是非正确、分工定位是否合理、是否进行了性能测试?是否进行了
功能测试?是否稳定运行了一段时间?是不是已经是写得最高效率了?都需要一个过程
需要时间,都需要精力,那就是代价。
虽然过程对于个人来讲是提高,对于公司来讲是成本,我是不需要开发,不需要学习,
手上马上就有,你今天要?我明天就可以提供给你,这就是我比别人的最大的优点,
比的不是我技术有多高深有多先进,哪里想怎么维护都可以维护,这只是按常规开发
人员的常规思路积累稳定下来的开发成果。
看起来简单的东西,未必真的是那么简单的,我们看得见摸得着的汽车来比喻,我们国家
也造不过老外,在简单一点儿,连个军刀,也搞不过瑞士嘛,让你搞个刀子出来,不知道
会丑陋到什么程度,这是实话的讲。

 

真的非要我说出,我的优点有如下
01. 我这个不是空架子,有内涵,大多开发框架只是空空的。
02. 与我的框架还有配套的完整的权限体系。
03. 我有配套的代码生成器。
04. 我有比较成熟的基础类,上千行的代码可以重复利用,提高效率。
05. 我有比较成熟的,数据库常用的操作方法,用起来效率很高。
06. 学习成本低,说实话我学过Enterprise library,甚至还买了一本书,我是没能学会,可能我太弱智了,没人带,没人教,想掌握得很熟练,也不容易。
07. 我有成熟的B/S,C/S开发样列,不是倾向于某个,甚至都有标准的例子程序,
为大规模生产奠定了基础。
08. 我这个短小精悍,效率有希望能提高,例如Enterprise library、ibatis 有用没用的东西,应该是比我的更多很多。
09. 使用灵活,想怎么写程序就怎么写程序,处了分层几乎没其他约束,
那些想写个SQL语句不是不可以,你不想不规范的来,怎么写都可以。
10. 都是组件化的,互相之间的关联性若一些,数据库访问类等都可以单独拎出来用,数据库访问操作类等,都可以是跟其他无关的。你不用我的架构,至少这些还有重复利用的价值。
11. 我这个灵活性强,想怎么修改就怎么修改,想运行什么SQL语句就运行什么SQL语句,iBATIS里想运行一个动态的SQL语句都难啊。
12. 虽然不是很排斥iBATIS,但是里面的SQL语句太难搞了,这个做过几个项目的,都应该会有些感触,特别是复杂的SQL语句。
13. 类似iBATIS等架构里,控制并发、控制事务,几乎是无从插手啊,我想普通人是不太容易搞定的。
14. [狡辩] 向下兼容,不用非要需要.NET3.0, .NET3.5运行环境,对运行环境的要求很高,也不是开玩笑的折腾啊,有的电脑上装都装不上,卸载也卸不了的。

 

能了解学习需要一个水平,
能用嘴巴讲出来需要一个水平,
能形成自己的思想需要一个水平, 
能用文字描述出来更需要一个水平,
有勇气贴出来,敢共享自己的思想也是更加需要水平,
我是希望那些站着说话不腰疼的家伙们,只拍砖头不拍理由的,也写写看,写出来是什么样子,让我们心服口服。
当我工作的第3-4年,我也层感觉过,天下就我最厉害,哈哈,现在想想,自己是啥呀?普通老百姓一个而已。

欢迎大家提出宝贵的建议,多拍砖并拍出理由。

 

 

 

我写程序的灵感就像是如下图片一样

 

 

 

导读:

大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(一)后台控制逻辑代码部分
http://www.cnblogs.com/jirigala/archive/2009/06/16/1503913.html

大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(二)后台服务代码部分
http://www.cnblogs.com/jirigala/archive/2009/06/16/1504515.html

大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(三)商业逻辑代码部分
http://www.cnblogs.com/jirigala/archive/2009/06/17/1505253.html

大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(四)高效的后台权限判断处理
http://www.cnblogs.com/jirigala/archive/2009/06/22/1508511.html

 



C# ASP.NET 通用权限设计、通用权限管理、通用权限组件、单点登录、集中式权限管理、统一授权体系、分级管理分级授权


微信扫一扫加好友