日常开发之重构

简介: 作为开发人员,应该让重构贯穿于你的开发日常的每一刻。

作为开发人员,应该让重构贯穿于你的开发日常的每一刻。


为什么这么说?

重构是为了改善软件的设计、结构和实现,同时保留其现有的功能。 重构的潜在优势包括提高代码的可读性和降低复杂度。 这些都可以提高源代码的可维护性,并创建一个更简单、更干净或更有表现力的内部架构或对象模型,从而提高程序的可扩展性。


原因我觉得有两方便,一个是客观的因素,随着技术的不断更新迭代,语言的特性也在更新(朝着更高效便捷的方向)。另一个则是人为因素,不同的人由于开发水平的不同写出来的代码也各尽不同。


在一个团队中你除了要写自己的代码,而且还要接手别人的代码,作为一个leader更要去给别人做code review。

所以,重构是如此的必要,而且悄无声息。

举个例子,最近在看到一段代码后,立刻让我产生重构的冲动。


旧代码如下:

首先定义两个常量,对象和数组

const data = {
  Angular: 3,
  React: 1,
  Vue: 2,
  Next: 1,
  HTML: 2,
  Other: 3
};
const colors = [
  '#d17a29',
  '#da9554',
  '#e3af7f',
  '#edcaa9',
  '#f6e4d4',
  '#204e77'
];


利用for操作,取出以上对象的key和value和数组元素组成新的数组

let sortable = [];
let index = 0;
for (let temp in data) {
  sortable.push([temp, data[temp], colors[index] ? colors[index] : '#D3D3D3']);
  index++;
}
sortable.sort(function(a, b) {
  return b[1] - a[1];
});


最终输出结果:

[
  ['Angular', 3, '#d17a29'],
  ['Other', 3, '#204e77'],
  ['Vue', 2, '#e3af7f'],
  ['HTML', 2, '#f6e4d4'],
  ['React', 1, '#da9554'],
  ['Next', 1, '#edcaa9']
]

从逻辑实现上没有任何问题。但总感觉哪里不对,是不是有更高效的实现方式呢?


重构后的代码

也许是写代码的惯性使然,立马想到使用Map方法可以将数据返回你想要的格式。

但是对象数据格式好像不支持Map方法。

所以我们得先将对象转化成数组

const newOutput = Object.entries(data);

我们将得到以下格式的数组

[
  ['Angular', 3],
  ['React', 1],
  ['Vue', 2],
  ['Next', 1],
  ['HTML', 2],
  ['Other', 3]
]

是不是和最终想要的结果有点类似了,数组的元素中还差了一个color的值,以及最终需要将它们排序。

接着我们根据索引将color的值添加到以上输出结果中

const newOutput = Object.entries(data)
.map(
  ([title, amount], index) => [
    title,
    amount,
    colors[index] || "#fff"]
);

这里或者使用数组解构更容易理解一点

const newOutput = Object.entries(data)
  .map((item, index) => [
    ...item,
    colors[index] || '#fff']
  )
  .sort((a, b) => b[1] - a[1]);

在取不到值的时候我们给添加了一个默认的颜色值

[
  ['Angular', 3, '#d17a29'],
  ['React', 1, '#da9554'],
  ['Vue', 2, '#e3af7f'],
  ['Next', 1, '#edcaa9'],
  ['HTML', 2, '#f6e4d4'],
  ['Other', 3, '#204e77']
]

最后只剩下一步,我们需要按第二项给数组排序,很容易就想到用sort方法

const newOutput = Object.entries(data)
  .map(
    ([title, amount], index) => [
      title,
      amount,
      colors[index] || "#fff"]
  )
  .sort((a, b) => b[1] - a[1])

以上代码输出:

[
  ['Angular', 3, '#d17a29'],
  ['Other', 3, '#204e77'],
  ['Vue', 2, '#e3af7f'],
  ['HTML', 2, '#f6e4d4'],
  ['React', 1, '#da9554'],
  ['Next', 1, '#edcaa9']
]

没有问题,两种不同的代码都得到了最终的结果。但是重构后的代码量明显比之前的少了很多,而且结构更严谨。

写代码的过程中要学会举一反三,及时拥抱语言的新特性能给我们带来更好的编程体验。




目录
相关文章
|
程序员
你的代码需要重构吗?
你的代码需要重构吗?
74 0
|
设计模式 缓存 算法
关于“重构”的一些思考
本文将从一个新人数次修改CR comments的角度探讨代码重构的定义、目的以及常见的重构方法,并以简单的代码案例来说明代码重构的具体实现。
4905 3
关于“重构”的一些思考
|
开发者
工作一年,我重新理解了《重构》
重构是一种在不改变代码本身执行效果的前提下,让代码变得更加整洁易懂的方式。代码不仅要让机器能够实现预期的处理逻辑,更要能够面向开发人员简洁易懂,便于后期维护升级。
384 6
|
开发者
重构的理解
重构的理解
108 0
|
数据处理
《重构2》第六章-重构基础
《重构2》第六章-重构基础
310 0
|
设计模式 JSON 测试技术
项目重构演进之路
项目重构演进之路
755 0
|
存储 设计模式 架构师
记一次项目重构
本文主要记录,刚刚步入架构师岗位4个月的我,重构项目的一些经历。
|
算法 Java 容器
狗屎一样的代码!快,重构我!
狗屎一样的代码如何重构? 重构不止是代码整理,它提供了一种高效且受控的代码整理技术。
135 0
|
缓存 负载均衡 NoSQL
系统重构 | 学习笔记
快速学习系统重构
433 0
|
消息中间件 设计模式 缓存
系统重构的道与术
准备以重构工作中容易产生误区的地方或容易被忽视的重点来聊聊,既不重复网上千篇一律的各种方案资料,也对重构工作有参考价值。
系统重构的道与术