重构是一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量。代码重构之于软件,相当于结构修改之于散文。每次人们对如何对代码进行重构的讨论就像是讨论如果对一篇文学作品进行修订一样无休无止。所有人都知道应该根据项目的自身情况来对代码进行重构,而重构是无止境的。莫扎特从来不不对他的作品进行修订,特罗洛普对自己作品修订的恰到好处,大多数作家认为他们俩这样做都是合适的,但他们的合适对于你我来说未必是合适的。

最常见的基本重构方法可以归纳为两个方向。通过归纳方法将一个长的过程分解为小的可以重用的组件,和通过内联(inline)方法来消除那些不够份量的小方法。我们可以提炼方法来让大量的子类共享相同的功能特征,我们可以下放方法来让只有用到这些功能的子类才知道它们的存在。重构就是爬山,通过一步一步的小的提高来逐渐的改进整体的质量,但在重构时,我们如何知道哪种方法是上山的正确道路?

关于代码地形学的这个问题公认的方法有两种。去除有异味的代码和重构成模式。如果能做到这样,当然是很好的。就像是纠正作文里的一个语法错误或不恰当的比喻。如果我们可以找到这些四处隐藏的有异味的代码,将它们重写成整洁的,条理的,结构化的形式,何乐而不为。但这些都是特殊情况。如果没有明显的模式来重构,或没有很直接的方法来去除代码异味,那该怎么办呢?

这才是我们如今编程艺术的中心问题,而很少人讨论这些。通常我们讨论这些问题时都是罗列出更多更长的有异味的代码模式的清单,但这并不是解决问题的方法。代码异味应该是我们公认的不好的东西,而不是那些置之不理也无妨的事情。我们经常会说到老板不给我们重构的机会,甚至代码有明显的异味,老板们认为这是浪费时间。并不是每个人都有懂软件的老板。我很吃惊为什么只有很少的讨论谈到点子上。。也许我这篇文章才说到问题关键处。

我的观点,当重构没有现成的明显的方向时,我们可以遵循下面的原则:

  1. 当属性、方法或类存在任何的需要复用的意向时,归纳提炼它们。

  2. 不要低估小方法对代码整洁的作用。使用小方法能让你节省很多笔墨。

  3. 能让代码长度变短的提炼都应该去提炼,包括注释。

  4. 用多形代替switch()——即使这样做会使代码变长。

  5. 用封装控制可见度。

  6. 消除依赖。

  7. 简化构造方法——即使这样做会使代码变复杂。

  8. 封装或避免条件表达式。使用guard语句,避免使用else语句。

  9. 使用常量代替魔幻数字。

  10. 不确定时,偏向使用组合而不是继承。

  11. 不确定时,将计算操作移入到这些数据的所有者对象里,或将数据移动到执行计算操作的对象里(也就是迪米特法则(Law of Demeter))。

  12. 使用小对象,松耦合,避免大对象,高聚合。

  13. 不确定时,偏向使用递归而不是循环。

  14. 使用代理对象,模拟对象和辅助对象来隔离网络,数据库,文件和用户接口。

  15. 不确定时,尽量在model里添加代码,必要时才往controler添加代码。view里添加的都应该是便捷功能和简写方法,但不要局限于此。

  16. 偏向使用apply, each, mapcar,而不是loop.

  17. 尽量使用新技术。

-END-

欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们

  • 如想加群讨论学习,请点击右下角的“加群学习”菜单入群


代码重构方向原则指导相关推荐

  1. 系统重构的原则代码重构的原则

    作者:[美]马丁•福勒(Martin Fowler) 译者:熊节, 林从羽 前一章所举的例子应该已经让你对重构有了一个良好的感觉.现在,我们应该回头看看重构的一些大原则. ##2.1 何谓重构 一线的 ...

  2. 重构学习(三):代码重构的原则

    1 前言 最近因为一些乱七八糟的事情耽搁,所以有一段时间没看<重构:改善既有代码的设计>这本书,可以先看上两篇笔记重温一下: 从零开始了解重构(一): 从零开始了解重构(二). 本文接上两 ...

  3. 把三千行代码重构为15行

    2019独角兽企业重金招聘Python工程师标准>>> 如果你认为这是一个标题党,那么我真诚的恳请你耐心的把文章的第一部分读完,然后再下结论.如果你认为能够戳中您的G点,那么请随手点 ...

  4. 代码重构技巧宝典,学透本篇就足够了!

    本文来源:http://n5d.net/ma76k 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演进过程中,代码不停地在堆砌.如果没有人为代码的质量负责,代码总是会往越来越混乱的方向 ...

  5. 为什么要代码重构?如何重构?常见重构技巧,值得收藏!

    >>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...

  6. 阿里面试官:你在工作中是如何做代码重构的?

    我是猿人,一个热爱技术.热爱编程的IT猿.技术是开源的,知识是共享的! 写作是对自己学习的总结和记录,如果您对 Java.分布式.微服务.中间件.Spring Boot.Spring Cloud等技术 ...

  7. 常见代码重构技巧(非常实用)

    点击关注公众号,Java干货及时送达  作者:VectorJin juejin.cn/post/6954378167947624484 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演 ...

  8. 【编码经验】数据结构与语法规范、计算机算法、架构模式设计、代码重构

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 编码的三个层次 第一层:数据结构与语法规范层 0.clang-for ...

  9. 关于代码重构的一些笔记

    代码重构 代码重构(英语:Code refactoring)重构就是在不改变软件系统外部行为的前提下,改善它的内部结构. 软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方.在 ...

  10. 我的代码重构经验(转载)

    链接:https://www.cnblogs.com/clover-toeic/p/3842758.html 说明 本文在<MDU某产品OMCI模块代码质量现状分析>一文的基础上,分享作者 ...

最新文章

  1. 解释大型网站js,css文件后面为什么有参数?
  2. Windows 10 中 Eclipse中无法添加Courier New字体的解决方法!
  3. 什么是超融合数据中心网络?
  4. 居然是Firefox没有抛弃我们
  5. ASP.NET中的Theme和Skin
  6. 软件测试实验4白盒测试,软件测试实验报告白盒测试
  7. Linux下载_Linux系统各种版本ISO镜像下载(redhat,centos,oracle,ubuntu,openSUSE)
  8. Redis介绍及实践分享
  9. python续行_python 控制台单行刷新,多行刷新
  10. python的zip()函数,压缩多个可迭代对象
  11. 修改Win7的默认文件夹排列方式
  12. 目标检测:Object Detection in 20 Years: A Survey
  13. Laravel框架的运行过程
  14. oracle 建立临时表语句,oracle创建临时表
  15. 网站安全检测:8款非常有用的免费 Web 安全测试工具
  16. PHP电商网站高并发的秘诀之电商秒杀活动
  17. statusbar 纯白色的解决方案 android:fitsSystemWindows
  18. java文字格斗游戏
  19. 根据输入的三角形的三条边a、b、c,如果可以构成三角形,计算并输出该三角形的面积和周长,否则输出“Not a Valid Triangle”。
  20. 阿里面试题 ——输入一个字符串,输出所有的排列

热门文章

  1. MySQL学习4 数据过滤
  2. 关于yum使用的小技巧
  3. volatile解析(转)
  4. 温故而知新:查看端口占用情况以及DOS中的管道操作/重定向操作
  5. downie是什么软件?如何在Mac中下载视频?
  6. iOS开发之WKWebview(淘宝链接不自动打开淘宝和天猫的app)
  7. Wondershare Recoverit for Mac(数据恢复套件)
  8. 小白如何购买阿里云服务器(2019最详细教程)
  9. 【SDOI2014】数表
  10. micro-mvc与主流mvc整合说明