首页 > 其他分享 >针对`Code View`友好的代码重构方法

针对`Code View`友好的代码重构方法

时间:2022-08-18 09:45:01浏览次数:46  
标签:重构 Code 函数 代码 抽取 原函数 View

针对Code View友好的代码重构方法

本文记录在开发过程中,写出对 Code ReView 友好代码的若干方法。

抽取函数

将较为独立的语句抽取为函数,是一种很常见的重构手段,本文在此基础上,进一步改进,形成对 Code Review 友好的代码组织。

一句话概括:将抽取后的函数放在原函数较远处,而不是直接放在原函数的上下。

下面来举例说明:

假设有以下函数:


void ExtraceData(std::string& strInfo)
{
	int a = 100;
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;	   // 模拟有很多操作
	a += 1;
	a += 1;
	a += 1;

	strInfo = std::to_string(a);
}

中间一大串可认为是对数据进行加工,最后赋值给输出参数。如果将中间一段抽取为函数,按照现在重构工具的调性,会将抽取后的函数直接放在原函数之上,将抽取处替换为对新函数的调用,形成下面的效果:


int Add(int a)
{
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;
	a += 1;	
    return a;
}

void ExtraceData(std::string& strInfo)
{
	int a = 100;
	a = Add(a);

	strInfo = std::to_string(a);
}


从代码上看,这样一点问题也没有。但提交查看代码改动时,却是这样的:

使用重构工具提取函数.jpg

从左右改动对比上看,要努努力,仔细看,才能看出来 Add 函数是重构提取的函数。出现这样的原因是代码对比工具是按行对比的,当前后行内容未改变时,会认为未改变。

现在换另一种做法,将重构后的函数放在距离原函数稍远处,会得到这样的效果:

使用重构工具提取函数后改变函数位置1.jpg

使用重构工具提取函数后改变函数位置2.jpg

这种做法,可以将从视觉上,分离抽取函数的动作以及函数内部细节。从代码对比结果上,一眼看出,本次改动是将左边这块代码抽取为名为 Add 的函数,后续看到该函数,就有一个心理预期,如果不关心函数内部细节,可直接忽略。

  • 对他人来说,提高代码阅读效率
  • 对自己来说,减少出错的可能

对人对己都有好处。

至于将重构后的函数,具体放在哪个位置,按照一般从上往下的代码阅读顺序来,放在原函数的下方比较合理。这会让阅读者先看到该函数的使用场景,往下再看到具体实现,较符合认知,至于具体实现细节,有需要就关心,没需要直接略过。

具体放多远,看个人喜好,只要能从代码前后对比中,分离调用和实现就行。

小结

本文提出从代码提交的角度,提出一种重构代码的组织方法。

标签:重构,Code,函数,代码,抽取,原函数,View
From: https://www.cnblogs.com/cherishui/p/16597642.html

相关文章

  • uniapp 解决使用web-view嵌套H5页面以后返回失效的问题
    <template><view><web-view:src="src"></web-view></view></template><script>varwv;//计划创建的webviewexportdefault{data(){return{......
  • LeetCode 295 Find Median from Data Stream
    Themedianisthemiddlevalueinanorderedintegerlist.Ifthesizeofthelistiseven,thereisnomiddlevalueandthemedianisthemeanofthetwomidd......
  • LeetCode/最大相等频率
    给你一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的最长前缀,并返回该前缀的长度从前缀中恰好删除一个元素后,剩下每个数字的出现次数都相同。1.双哈希表......
  • Codeforces Round 81 Same GCDs
    SameGCDs原文题意:给定a,m求x在\([0,m)\)中有多少数字满足\(gcd(a,m)=gcd(a+x,m)\)思路:我们令\(g=gcd(a,m)\)那么\(a=k_1g\),\(m=k_2g\),且\(gcd(k_1,k_2......
  • AtCoder 比赛记录
    ARC140打得很烂。Rank590,Performance1696。D-OnetoOne每个点都有恰好一个出边,所以这是一个外向基环森林。因此连通块数就等于环的个数,我们只需要求出所有方案中......
  • Codeforces 1713C - Build Permutation
    题意为给出一个长度为n的空数组,数组下标为0至n-1。我们需要在数组中的每个位置上填上合适的数A[i],使得i+A[i]为完全平方数。并且数组最后需为0至n-1的一个排列。......
  • leetcode 303. Range Sum Query - Immutable 区域和检索 - 数组不可变(简单)
    一、题目大意https://leetcode.cn/problems/range-sum-query-immutable给定一个整数数组 nums,处理以下类型的多个查询:计算索引 left 和 right (包含left和righ......
  • leetcode45-跳跃游戏 II
    跳跃游戏II前向dp对于一个数i,从0到i-1进行遍历,如果在这个位置能跳跃到i,那么对i的dp值进行更新。这种方式时间复杂度为O(n^2),效率很低classSolution{publici......
  • VSCode中Java项目启动设置JVM栈参数。
    发生缘由学习JVM中栈溢出,因此需要启动项目的时候修改一下JVM栈的参数。环境介绍电脑系统:win10jdk:1.8.0_144JVM:JavaHotSpot(TM)64-BitServerVM(build2......
  • 不需额外安装 npm,Markdown 文章目录生成之 VSCode 编辑器和博客园的完美契合
    博客园支持Markdown语法写入。对于目录生成更是简洁得很,只需要在想要生成目录的地方输入[toc]那么当前文章下的所有的标题将会在当前位置组合为该文章的目录。比如博......