将3000行代码重构为15行,让我深刻理解“重构”一词的重要性...

优采云 发布时间: 2020-08-08 15:53

  如果您认为这是一个主题派对,那么我恳请您耐心阅读本文的第一部分,然后得出结论. 如果您认为可以戳G点,请喜欢它.

  #将三千行代码重构为十五行

  那年我刚毕业并加入了我目前的公司. 该公司从事数据中心环境监控,其中充满了嵌入式,精密空调,总线和RFID概念. 我什么都不懂. 幸运的是,该公司在Delphi中编写的旧客户端太慢了,因此将其替换为Webform. 碰巧我仍然了解Asp.Net,而我对这项业务的无知并不能阻止我称这家公司的A程序员.

  小型公司也适合人数很少的小型公司,因此它们很快将负责代码开发. 当然,我也参与了该数据中心智能管理系统.

  这个系统非常大,特别是最好的事情是支持客户端配置,然后动态生成网页,还可以通过Socket实时监视数据(我当时还不太了解网络编程). 对于当时的我来说,这确实很高,很高,也很高! !那时,我花了半个多月的时间才了解整个系统,然后才能进行调试和编写一些简单的页面.

  在维护系统的过程中,需要不时扩展某些功能,并且还会联系以下类别:

  

  

  不是吗?它是当时最受欢迎的三层架构的产品. 对于刚起步的男孩来说,什么是专业的文件头注释和反射,算了吧,这个构造函数仍然是静态的还是私有的?那时,我刚接触到这么高的密码,立刻跪下了!

  但是,写了更多的课,我感到越来越尴尬. 这是下面的代码:

  

  每次添加表时,除了更改接口,DAL和BLL之外,还必须向工厂类添加方法. 即使当时我是G公司的推荐,这也确实很累人而且抽筋. 移动软代码*敏*感*词*的神奇工具,多次粘贴和复制也使我感到非常麻烦. 有时候,我对在键盘上打字感到有些疲倦,而且我还错误地纠正了复制的代码,您的姐姐,难道是程序员应该做什么,不,绝对不是!我想起了一个著名的谚语: 当您觉得代码重新出现在程序中时,应该进行重构. 是的,在这句话的指导下,我开始折腾,决定挑战这个高大的代码. 事实证明,思想的力量是无限的.

  那么,如何修改它?经过仔细观察,我发现className的生成与返回的类型非常相似,除了一个是类名,另一个是字符串. 两者应该可以关联. 因此我用谷歌搜索(当时GFW尚未猖ramp),隐约发现了“反射”一词. 经过深入的了解,我确信可以做到.

  接下来,它是返回类型. 返回类型不是固定的,但是它似乎很规则. 这似乎在某处可见. 顺便说一下,已经涵盖了模板和C ++课程,所以我再次在google上搜索,了解到C#在C ++中使用泛型而不是模板. 在了解了泛型和反射之后,并参考了Internet上的一些文章,我制定了以下代码:

  

  是的,就是三层体系结构时代最受欢迎的工厂类别...

  查看滚动了十几个屏幕的原创代码,它变成了十几行代码. 真的很酷很干净!唯一让我担心的是,当我加入公司时,帮助组织公司的软件版权应用程序需要大量代码. 根据代码行数评估软件的大小. 如果老板知道我没有帮助公司增加代码量,它会减少. 你会立即解雇我吗?我不敢向老板展示我的出色成绩.

  幸运的是,此代码不仅没有问题,而且还避免了同事在添加新类后曾经复制代码但没有正确修改它的问题,从而大大提高了效率. 尽管我不敢在重大事件中宣布自己的工作成果,但这次成功的修改完全使我走上了不返回代码重构的道路.

  看到这一点,每个人都应该知道这种情况是否正确. 我相信自2008年以来见过此类代码的编码人员肯定不少于我. 所以,我想告诉你什么?

  #使用更少的代码*敏*感*词*

  让我们分析一下我的前任为何编写上述代码的原因. 我将其归结为以下几点:

  到目前为止,许多人使用代码*敏*感*词*,那么我们应该如何处理这个问题呢?我认为代码*敏*感*词*确实可以减少很多工作,但使用更少. 对于那些重复的任务,除了一部分,实际上是没有办法的. 其他大多数功能都可以通过框架解决,例如,像三层体系结构一样,确实需要代码*敏*感*词*,即Model类. 其余的可以在框架中完成.

  因此,您必须尽最大的努力来考虑如何减少框架中的重复工作,而不是依赖于代码*敏*感*词*.

  此外,如果您仍在使用相关的代码生成工具,请重新定义“动态软代码*敏*感*词*”的代码模板,并自己编写一个模板;或使用CodeSmith来完全开发自己的代码生成,因为DMS提供的代码模板确实很混乱,例如以下代码:

  for (int n = 0; n < rowsCount; n++)

{

model = new DBAccess.Model.eventweek();

if(dt.Rows[n]["GroupNo"].ToString()!="")

{

model.GroupNo=int.Parse(dt.Rows[n]["GroupNo"].ToString());

}

if(dt.Rows[n]["Week0"].ToString()!="")

{

model.Week0=int.Parse(dt.Rows[n]["Week0"].ToString());

}

if(dt.Rows[n]["Week1"].ToString()!="")

{

model.Week1=int.Parse(dt.Rows[n]["Week1"].ToString());

}

}

  首先,您不能使用var row = dt.Rows [n]代替吗?其次,如果使用int.Parse如果抛出异常,则直接降低性能?再说一次,如果对这段代码进行了一些修改,我是否不想每个dt.Rows [n]都对其进行修改?

  #不要重新发明轮子

  让我们看看其他一些代码:

<p>public List GetDevices(string dev){

List devs=new List();

int start=0;

for(int i=0;i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线