重构长方法之保留整个对象

在开发中我们会遇到需要从同一个对象中获取多个值的情况,例如从对象rectangle 中获取长方形的宽width和高height,然后将这个两个值传递给方法GetArea去计算面积:

csharp 复制代码
public class Demo
{
	public void Method()
	{
		//---------------
		//more code
		//---------------
		
		float width=rectangle_a.Width;
		float height=rectangle_a.Height;
		float are_a=GetArea(width,height);
		
		//-------------------
		//more code
		//------------------

		float width=rectangle_b.Width;
		float height=rectangle_b.Height;
		float are_b=GetArea(width,height);

		//------------------
		//more code
		//-----------------
	}
	private float GetArea(float width,float height)
	{
		return width*height;
	}
}

这种方式看起来很简单,但是存在一个问题,如果rectangle对象的内部不再通过属性的方式来获取去widthheight,而是通过方法的形式来获取,或者需要再增加获取一个属性 Color 传递个GetArea 方法,那么我们就要大量的修改代码了(前述代码我们要修改两个地方)。那么,要解决这个问题,我们可以将整个对象传递给要调用的方法,让要掉用的方法内部去负责获取这些属性。以下是修改后的代码:

csharp 复制代码
public class Demo
{
	public void Method()
	{
		//---------------
		//more code
		//---------------
		
		float are_a=GetArea(rectangle_a);
		
		//-------------------
		//more code
		//------------------
		
		float are_b=GetArea(rectangle_b);

		//------------------
		//more code
		//-----------------
	}
	private float GetArea(Rectangle rectangle)
	{	
		return rectangle.Width*rectangle.Height;
	}
}

"保留整个对象" 这种重构方式的优点是我们看到的不再是一大堆参数,而是一个具有易懂名称的单一对象。并且如果方法需要从对象中获取非常多的数据,那么无需重写所有使用该方法的地方,只需要在方法内部重写就可以了。缺点也是显而易见的,在某些情况下这种转换会导致方法的灵活性降低,原本可以从许多不同的来源获取数据,但是由于重构,我们只能将其用于具有特定类型的对象。

相关推荐
fthux6 小时前
RenoPit 能为普通业主做什么?看懂图纸、审查合同,提前发现装修坑
javascript·人工智能·ai·开源·github·chrome扩展·open source·edge扩展·firefox扩展
仿生狮子7 小时前
✂️ Nuxt 最简单的字体裁剪工具:Fontize
javascript·vue.js·nuxt.js
魔力女仆11 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
别惊醒渔人12 小时前
Vue3 Diff 优化:最长递增子序列 LIS
前端·javascript·vue.js
Larcher13 小时前
从“加载模型”界面到端侧推理:拆解一个 React + WebGPU 大模型 Demo
javascript·后端
Larcher13 小时前
从状态快照到惰性初始化:读懂 React useState 的三个关键场景
javascript·人工智能·后端
旋生万物14 小时前
五条几何公理重构元素周期表:从量子力学到螺旋拓扑的降维(AI 编程时代的微观启示)
重构·ai编程·代码审计·cursor·ai agent·mcp协议·claudecode
Hilaku15 小时前
工作 5 年后,决定你薪资上限的究竟是什么?
前端·javascript·程序员
weixin_BYSJ198715 小时前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
gis开发之家16 小时前
《Vue3 从入门到大神40篇》Vue3 源码详解(十):diff 算法全解析 —— 为什么 Vue3 比 Vue2 更快?
javascript·算法·typescript·前端框架·vue3·vue3源码