代码重构——程序员应有的基因

简介: 去年帮另一个项目组赶项目时,总是有很多地方令我不舒服。本人编码有点小小的“洁癖”——即不喜欢见到冗余代码。即时现在忙,没时间整理,但是一有时间,我都尽可能的去重构。也许本人是个完美主义者吧。 个人认为重构有以下好处: 改善软件的性能、质量。

去年帮另一个项目组赶项目时,总是有很多地方令我不舒服。本人编码有点小小的“洁癖”——即不喜欢见到冗余代码。即时现在忙,没时间整理,但是一有时间,我都尽可能的去重构。也许本人是个完美主义者吧。

个人认为重构有以下好处:

  • 改善软件的性能、质量。
  • 使架构更加合理。
  • 使代码更容易被理解。
  • 提高软件的扩展性和可维护性。
  • 提高代码的重用率,通用性。
  • 提高软件的开发速度。
  • 更容易发现BUG。
  • 可以提高开发人员的开发水平。

在我见过的很多代码中,很多程序员宁愿无限复制粘贴代码,也不愿意重构代码。比如经常可以看到这样一个Switch结构中,每个Case块除了某个参数不同,里面的代码几乎一模一样。看到这种代码,不知道是我的悲哀,还是他的悲哀。

这里就展开说说:

一、控件绑定

在开发表单的时候,我们经常会用到下拉列表。如果是服务器控件,我们通常会在后台绑定,但如果是html控件,我们通常需要写JavaScript来绑定,比如下面这个例子:

$.post(siteBase + "MktUser/Op.aspx?op=items", {}, function(res) {
    if (res != null) {
        // 事业别
        var html = "<option value=''></option>";
        $(res.Data.items).each(function(i, item) {
            html += "<option value='" + item.Id + "'>" + item.Name + "</option>";
        });
        $("#item_id").html(html);
    }
}, 'json');
这是一个绑定下拉列表(select)的例子,如果每次都写这么多,一个不太复杂的页面也会让这些代码占满,那么我们可以重构下,如下面的代码:
function setSelect(se, key, data, val, txt, seval, setf) {
    $.post("Op.aspx?op=" + key, data, function (res) {
        if (res != null) {
            var html = "<option value=''></option>";
            var jsonData = (res.Data.items !== undefined ? res.Data.items : res.Data);
            $(jsonData).each(function (i, item) {
                var jTxt = '';
                var jVal = '';
                $.each(item, function (j) {
                    if (j == val)
                        jVal = item[j];
                    else if (j == txt)
                        jTxt = item[j];
                });
                html += "<option value='" + jVal + "' " + ((seval !== undefined && seval == jVal) ? "selected='selected'" : "") + ">" + jTxt + "</option>";
            });
            $(se).html(html);
            if (setf !== undefined)
                setTimeout(setf, 100);
        }
    }, 'json');
}

 

二、代码简化、灵活运用

很多代码我们可以简化或者灵活运用。关于简化,比如使用三元运算符。关于灵活运用,比如很多朋友喜欢将不为空的判断写死在JS里,那么我们也可以换一种方式,比如使用html元素的自定义属性或者文本来判断,比如:

function valText() {
    var isFlag = true;
    $("td:contains('*')").each(function () {
        var lbl = $(this).text();
        $(this).next().find("input,select").each(function () {
            if ($(this).val() == '') {
                alert("请填写:o" + lbl);
                isFlag = false;
                return isFlag;
            }
        });
        if (!isFlag)
            return isFlag;
    });
    return isFlag;
}

 

三、代码归类

很多人经常羡慕别人有代码库,自己总是没有呢?其实在平常编码中,只要用心重构就会有了。

在你重构代码的时候,一般你就会思考,如何重构才能够更优,如何重构这段代码就能尽可能多的重复利用(以后也能用),于是乎,有时你会去找找相关的代码,有时你会把类似的处理逻辑的代码统一放在一起,比如邮件处理的代码、文件操作的代码等等。如果是C#,你可以归类,如果是JS,你可以考虑放到一个JS文件里。

关于这些,大家可以从这里《也把咱的小类库拿出来晒晒》打劫。

 

四、提取函数

提取函数很实用,在VS中使用快捷键——Ctrl+R+M就能实现提取方法了。提取方法一方面方便代码重用,另一方面也增加了发现问题的几率。比如看下面的异常:

 

_shutDownMessage=关键目录的更改通知。
bin dir change or directory rename
HostingEnvironment initiated shutdown
关键目录的更改通知。
bin dir change or directory rename
HostingEnvironment 导致关闭

_shutDownStack=   在 System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   在 System.Environment.get_StackTrace()
   在 System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal()
   在 System.Web.Hosting.HostingEnvironment.InitiateShutdown()
   在 System.Web.HttpRuntime.ShutdownAppDomain(String stackTrace)
   在 System.Web.HttpRuntime.OnCriticalDirectoryChange(Object sender, FileChangeEvent e)
   在 System.Web.FileChangesMonitor.OnCriticaldirChange(Object sender, FileChangeEvent e)
   在 System.Web.DirectoryMonitor.FireNotifications()
   在 System.Web.Util.WorkItem.CallCallbackWithAssert(WorkItemCallback callback)
   在 System.Web.Util.WorkItem.OnQueueUserWorkItemCompletion(Object state)
   在 System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state)
   在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack)
   在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)
从上面文字中,我们可以看到异常捕获是到方法为止的,比如类似于“未将对象引用到对象的实例”异常,如果没有报出具体对象的话,茫茫代码中是很难查找的(在很多情况下无法调试或者无法模拟当时环境时),但是我们可以从最后提示的执行的方法名来限定问题代码范围,然后仔细检查推敲。
 
 

五、方法重载

有时候,可能要满足多种需求,但是又不想更改代码,那么方法重载就能派上用场了。比如下面两个方法:

 

   1:      /// <summary>
   2:      /// 将string类型的fDateTime转换为formatStr格式的日期类型
   3:      /// </summary>      
   4:      public static string GetStandardDateTime(string fDateTime, string formatStr)
   5:      {
   6:          DateTime s = Convert.ToDateTime(fDateTime);
   7:          return s.ToString(formatStr);
   8:      }
   9:   
  10:      /// <summary>
  11:      ///将string类型的fDateTime转换为日期类型 yyyy-MM-dd HH:mm:ss
  12:      /// </sumary>
  13:      public static string GetStandardDateTime(string fDateTime)
  14:      {
  15:          return GetStandardDateTime(fDateTime, "yyyy-MM-dd HH:mm:ss");
  16:      }

 

最后

写了这么多,就此结束吧。

如果你还沉浸在日复一日的重复编码中,那么就想想重构吧。重构也是个费力活,但是却可以让你更上一层楼。

目录
相关文章
|
敏捷开发 前端开发 开发者
想要成为软件开发中的王者,需要明白的 21 条准则
想要成为软件开发中的王者,需要明白的 21 条准则
|
人工智能 自然语言处理 安全
如何提升代码质量,重构并非“万能药”
随着编程技术的不断进步,编程语言变得越来越高级,功能封装也越来越完善。各种技术都在帮助程序员提高编写代码的效率。通过层层封装,程序员似乎不需要了解技术细节,只需逐行翻译需求内容即可。 许多程序员不了解如何组织代码、提升运行效率以及底层基于的原理是什么,但是他们编写的代码通过了编译、测试,并且在上线运行了一个月而没有出现问题,似乎并没有对他们的实际工作产生明显的负面影响。
|
Web App开发 编解码 监控
防御性设计和开发
“防御性编程(Defensive programming)是防御式设计的一种具体体现,它是为了保证,对程序的不可预见的使用,不会造成程序功能上的损坏。它可以被看作是为了减少或消除墨菲定律效力的想法。”
859 0
防御性设计和开发
|
1月前
|
机器学习/深度学习 人工智能 测试技术
探索软件测试中的“禅”:寻找内在的平和与外在的效率####
在软件测试的世界里,我们常常被缺陷的数量、测试用例的覆盖度以及上线时间的紧迫性所困扰。但如果我们能像禅宗修行者一样,将注意力转向内心的平静与专注,或许能在纷繁复杂的测试工作中找到一种全新的效率和质量提升之道。本文将带您走进软件测试的“禅意世界”,探讨如何在看似枯燥无味的测试过程中,通过调整心态、优化方法,实现个人成长与项目成功的双赢。 ####
|
2月前
|
算法 开发者
代码与哲学的交织:探索软件开发中的哲理
【10月更文挑战第17天】 在数字化时代,软件开发不仅仅是技术的堆砌,更是智慧与哲学的碰撞。本文通过深入浅出的方式,探讨了编程中蕴含的哲学思想,如迭代思维、模块化设计以及错误处理的艺术。我们将一起思考如何将这些哲学理念融入日常开发,以提升我们的技术深度和广度,让代码不仅是冰冷的逻辑,而是充满智慧的艺术品。
27 5
代码之美:从混乱到秩序的编程旅程
在编程的世界里,代码不仅仅是冷冰冰的文字和符号的组合。它们是思想的载体,是解决问题的工具,更是艺术与科学的结晶。本文将带你领略编程过程中的美学,从最初的混乱无序到最终的清晰有序,探索如何通过良好的设计原则、清晰的逻辑结构以及持续的重构来提升代码质量,从而使得代码不仅能够高效运行,还能成为令人赏心悦目的艺术品。
|
5月前
|
设计模式 测试技术 持续交付
编码之道:从混乱到秩序的编程实践
在数字世界的构建中,代码是基石也是艺术。它不仅仅是冷冰冰的逻辑指令,更是开发者智慧与创造力的体现。本文将深入探讨编程过程中如何从混沌初开的状态逐步走向条理清晰的秩序世界,分享一系列提升代码质量和开发效率的实践技巧,以及如何在技术迭代的潮流中保持持续学习的态度和对新技术的敏感度。
50 0
|
5月前
|
算法
代码之美:从混乱到秩序的编程之旅
【7月更文挑战第14天】编程,一门将思维转化为电子指令的艺术。在这篇文章中,我将带你领略编程的美学,从最初的混沌编码到最终的逻辑严谨、运行高效的程序。我们将一同探索如何通过理解问题、选择合适的数据结构与算法、编写可读性强的代码以及不断重构来提升代码质量。这不仅是一个技术提升的过程,更是一次思维的升华。
|
6月前
|
设计模式 安全 测试技术
探索代码之美:从混乱到秩序
【5月更文挑战第32天】在编程的世界中,代码不仅是实现功能的工具,更是艺术的表达。本文将通过个人的技术感悟,探讨如何将混沌的代码转化为有序、高效且易于维护的程序。我们将一起深入理解编码的最佳实践,以及这些实践如何帮助我们构建更加健壮和优雅的软件系统。
|
安全 大数据 程序员
软件开发困难、软件开发困难原因、软件开发困难的根本原因
  软件开发困难   软件开发困难最典型的事件是12360火车票订票,高并发量让初期的12360版本经常崩溃,根本不能用。不能用的软件或平台网站,这样的软件开发困难,难于上青天。   微软在开始组织团队编写Windows操作系统时,也经常遇到软件开发困难,进度迟迟不能更新,产品上线遥遥无期,导致微软领导一个头两个大。
671 0