重构-如何编写一段好的代码

关于重构,很多人可能都有惨痛的经验, 就不说去阅读别人的代码了, 有时候自己写的代码过半年,可能自己都看不明白, 这时候再来重构代码是一件很痛苦的事情。

其实很多时候面试时会聊到重构的问题, 我自己的看法是重构是软件开发中不可缺少的一个环节, 并不是说需要重构的代码都是坏代码, 有时候是旧的代码架构不能适应新的需求, 而有时候是为了新技术的使用。

今天来说一下在代码重构中的一个技巧, 如何编写一段好的代码。 其实不止是重构,在平时开发中如果可以的话也尽量用下面这种方式写代码。

一段糟糕的代码是怎样的

举个例子, 在代码中需要启动某个组件,而启动组件可以带启动模式作为参数, 一般开发都会这么写这个接口方法

public void startComponent(boolean arg);

这接口可以运行, 但是它是糟糕的。 因为 arg 这个名称并不能描述参数的作用, 不夸张的说两个星期后自己都看不懂这段代码。

开始重构它

我们假设启动模式有两种,内部启动和外部启动,那么从这个角度出发可以把参数修改为这样

public void startComponent(boolean fromOutside);

看起来好些了,这样我们在调用的时候就知道 tru是表示外部启动,而 false是内部启动

....
   //call from Outside
   startComponent(true);

   //call from inside
   startComponent(false);

但是这样仍然是一段糟糕的代码…

进一步重构

可能你听说过这么个段子, 优秀的程序员在写代码时能迅速的将自己变成傻子, 印象中好像是说 Pony Ma 的…

如果是一个傻子程序员看这段代码有什么问题呢? 在没看到参数的名字之前,单看调用处是不知道 true 和 false是表达什么目标的。

不好理解么? 假设有一个新方法是启动一个模块,这里是它的调用

....
   startModule(true);

对于使用者来说,你猜这参数是什么意思?

那么如何进一步重构呢。

这里可以使用 Enum的技巧, 来看一下使用 Enum 如何写一段阅读性良好的代码。

public enum LaunchType {
        OUTSIDE,
        INSIDE
}

//interface
public void startComponent(LaunchType type);

虽然看起来代码量变多了,不过我们来看下调用的地方变成怎样,

....
    //call from outside
    startComponent(LaunchType.OUTSIDE);

    //call from inside
    startComponent(LaunchType.INSIDE);

是不是变的一目了然。

这种写法还有另外的好处, 如果将来需要扩展启动模式,也不需要修改接口, 只需要在枚举类中增加对应的类型就可以。

总结

重构其实是在于代码的细节, 在提高代码架构的健壮性的时候也不要忘了提高代码的可阅读性。

在代码编写中有这么个格言, 如果代码写得好可以自述其身, 谁还需要注释?

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习123

Java应用一般架构

3269
来自专栏hadoop学习笔记

DKHadoop安装的环境准备介绍

前几天去参加了一个线下的聚会,参加聚会的基本都是从事互联网工作的。会上有人提到了区块链,从而引发了一场关于大数据方面的探讨。我也是从去年才正式接触大数据,一直在...

1122
来自专栏华仔的技术笔记

iOS 程序秒退原因分析及解决思路总结

4695
来自专栏携程技术中心

干货 | 携程图片服务架构

2116
来自专栏韩伟的专栏

开源服务器端软件的接口风格和分歧

前言 开源运动风起云涌,现在已经成为IT技术最重要的表现形式。从早期的GNU运动,到Apache基金会项目,到GitHub,开源项目已经几乎覆盖了全部的较通用的...

5286
来自专栏章鱼的慢慢技术路

游戏开发中的专业术语

本文整理了网络/游戏/编程相关的专业术语,作为游戏开发中的辅助参考资料,后期如果遇到其他的术语还会更新。

2531
来自专栏北京马哥教育

如何阅读技术文档

“大神你好,请问我打算学习Django,应该怎么做?” 答:“去看文档” “Django的文档都是英文,我看不下去,怎么办” 答:“bla bla bla…...

3198
来自专栏云计算

基于Karma构建微服务

“微服务”和“微服务架构”在开发社者区中是一个热门话题,但实际中的微服务例子仍然很少。通过简要介绍一下我们在Karma上构建的后端API可会对现在的情况有所帮助...

1165
来自专栏分享达人秀

Android开发环境概述

工欲善其事,必先利其器。Android开发人员在自己的计算机上编写和测试应用程序,然后将其部署到实际的设备上,那首先必不可少的就是开发环境的搭建。 ...

2685
来自专栏Java架构师学习

如何构建一个较为通用的业务技术架构

2115

扫码关注云+社区

领取腾讯云代金券