• 记一次重构经历【转载】


     

    看到这个标题,估计看的人就会很多,哈哈!本人现住在杭州,与博客园里的吉日嘎拉同在一个城市,因此就有见面并成为朋友的机会.

    现在园子里对吉日兄褒贬不一,这里发表一下个人观点:吉日兄看上去,面相有些凶之外,其实是很朴实的一个人,有着北方爷们的那种豪情.他是一个很普通的人,他代表中国当代千千万万写程序的人!

    你说他的文章是光说不练,没有源码之类的,现在源码才值几个钱,开发软件的思想才是最重要的.

    你说他的源码不开源,我想说的是,我们都是靠这吃饭的,这里是在中国,现状大家也清楚.别人辛辛苦苦搞了这么多年,凭啥你一句话就开源了呢?

    你说开源社区里老外开源的程序很多,哥们,这不是在国外,你知道国外一个开发员的年薪是多少吗?他们也不是靠写代码来养家糊口啊!我在网上看到这样的情况:美国的一个B2飞行员去考微软的某个认证,为啥呢?感兴趣呗!在中国你试试看?

    大家都是搞技术的,有时间坐下来,聊聊代码的事情,还是很有收获的.有时候,别人的一句话,就感觉是一张窗户纸捅破了,那种豁然开朗的感觉很难形容,大家自己体会吧!

    好了,说了这么多,不会成为口水贴吧.还是直接进入主题吧!我自己也搞了一套”框架”的东东,由于水平有限,因此找吉日兄指点一下.结果是相当有收获!

    收获一

    我们先看一下前后的项目文件布局.

    clip_image001

    clip_image002

    代码本身并没有多少变化,这次重构,更多的部分是项目文件的调整!

    先说一下老版布局的思路

    1. Kenrel表示内核,即核心类库的意思.但整个解决方案都是这个前缀,没有主要与次要之分

    2. 命名不规范,或者不准确.例:Common所表示的含义众多,不推荐使用

    3. 业务模块部分不应该放在Kernel层

    再说一下新版布局的思路

    1. 整个Kernel级别的类分为3个层次:Db层(Navi.Kernel.DbUnilities),业务层(Navi.Kernel.Service,其中区分webform,webservice,winform,windowservice)和UI层(Navi.Kernel.UILayer,其中区分webform,winform).这几个dll是最基本的类库,也就是说,只引这几个dll文件即可.例:开发webform程序,只需引Navi.Kernel.DbUntilites和,Navi.UILayer.Base和Navi.UILayer.WebForm和Navi.Kernel.Service.Base和Navi.Kernel.Service.WebForm即可.里面有方法集基本够用了.包括字符串,日期,json等常用方法

    2. 以Navi.Kernel.Service为前缀的项目文件可以被多种方式调用,也就是说,我想实现一个返回HelloWorld的字符串,可以通过调用webform,winform,webservice,windowservice都可以,没有问题.不同的只是调用方法

    下面再说说为何要这样处理,我们写代码过程中,无论是自己写的,还是看别人的代码,都要搞清楚一点,如果我这样处理,是根据哪个理论?或者说依据是什么? 

    收获二

    clip_image003

    对静态属性的使用,以前一直对静态类,属性或方法有所顾忌,因此很少使用.它与通过new方法创建类,再引用的属性区分在于:静态属性在类本身创建时就已经在内存中创建好,不再需要通过new的方式访问属性

    收获三

    静态方法的使用,比如工具类方法,以字符串方法类为例,像下面这些工具类方法,可以全部使用静态方法.确实可以提高性能的.

    clip_image004

    收获四

    实体类的使用.一个实体类,就是Db表在前台的映射,先看看老板的代码

    clip_image006

    实体类,它本身可以自己增加自己吗?

    实体类,它本身可以自己修改或删除自己吗?

    其实都是不可以的,它的作用就是后台Db表列在前台程序里的映射.根本不必区分Db是Oracle还是SqlServer!因此,像Add这种方法是没有必要出现的.

    新版中,只保留了Db的表列生成的属性,方法一律去掉,而且是不区分数据库类型的!

    还有,我们创建实体的原因是啥呢?如果只是简单的映射其实作用也不大的,最大的作用(个人观点):数据类型检验的功能,实体类与datatable相比,我们在访问其属性的行列值时,一个是强类型数据,另一个是弱类型数据.强类型数据的好处我们在代码开发阶段就可以发现它的错误,比如:一个整型值赋成字符串,结果肯定是编译不过去的.而使用datatable赋值的话,只有编译完程序运行起来以后,运行这串代码时,才会发现.哪个能提高效率就显而易见了.

    收获五

    多语言的支持,吉日兄的类库是支持多语言切换的,实现思路也不错.有兴趣的朋友可以找他聊聊.

    收获六

    系统日志的使用,通过对吉日兄源码的分析,日志部分做得非常完善,可以记录到每个人所点击的按钮事件,所执行了哪些操作等,如下图所示

    clip_image008

    以上就是我与吉日兄沟通后的收获,当然,还有好多小的东西,在此就不必写了!

    我想说的是,大家都是做技术的,要多听多读多想.不要盯着别人的短处.心态要放平,安安静静在一段时间内把一件事情做好,就已经很不容易了.

    我从吉日兄那里收获了这些东西,吉日兄也从我这里收获关于Net泛型的使用方法,还有一些比较好的小工具.总体来说,大家都是很有收获的.

    以前的领导讲过这样一段:你给我一个苹果,我给你一个苹果,大家都还有一个苹果,但是你给我一种思想,我给你一种思想,这样大家就都有了两种思想,何乐而不为呢?

    收获七

    人生感悟

    1. 多几个朋友,少一些孤单,多一些快乐

    2. 多几个朋友,生活会更加丰富多彩

  • 相关阅读:
    【转】busybox分析——arp设置ARP缓存表中的mac地址
    【转】OpenWRT开发自定义应用方法
    10大白帽黑客专用的 Linux 操作系统
    原始套接字
    正则表达式
    如何解决虚拟机中的ubuntu系统方向键与退格键不能正常使用的问题
    数组 slice方法和splice方法的区别
    数组去重等数组实例
    JS实现表单全选以及取消全选实例
    JS实现表格隔行变色
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1820484.html
Copyright © 2020-2023  润新知