重构代码之参数化方法

在代码重构中,参数化方法 通过将方法内部的硬编码值替换为参数,使方法的适用性更广。这不仅可以减少重复代码,还能提高代码的灵活性和可维护性。让我们来深入探讨这种技术的应用场景、步骤以及一些例子。

一、适用场景

参数化方法通常适用于以下场景:

  • 硬编码的值需要更改:方法内部使用了固定的值,如果将这些值外部化并传入作为参数,方法可以在不同场景中复用。
  • 逻辑的重复:多个方法中存在相似的代码逻辑,但只有少量变量不同。这时可以通过参数化的方法减少代码重复。
  • 提高扩展性:让方法更加通用,可以在未来的需求变动时灵活适应。

二、重构步骤

  1. 标识硬编码的值
    首先,找出方法中哪些固定值是可变的或可能会在不同情境下变化的。这些值可以是数值、字符串、对象,甚至是方法调用。

  2. 添加参数
    将这些硬编码的值替换为参数,并在方法签名中添加对应的参数。

  3. 更新调用方
    由于方法签名的更改,所有调用该方法的代码都需要传入新的参数。这一步可能需要在多个调用方中更新值,但通常这是值得的,因为这样可以简化代码逻辑和维护成本。

  4. 测试重构后的代码
    在重构完成后,确保重构后的代码功能和逻辑仍然与原先一致。单元测试是确保重构成功的一个有效手段。

三、实例演示

示例 1:将硬编码的折扣率替换为参数

假设有一个计算商品折扣的 CalculateDiscount 方法,最初方法中的折扣率是硬编码的。
重构前:

public decimal CalculateDiscount(decimal price)
{decimal discountRate = 0.10m; // 10% discountreturn price * discountRate;
}

重构后:

public decimal CalculateDiscount(decimal price, decimal discountRate)
{return price * discountRate;
}

调用时可以传入不同的折扣率,使该方法更加通用:

var discountA = CalculateDiscount(100m, 0.10m); // 10% discount
var discountB = CalculateDiscount(100m, 0.20m); // 20% discount
示例 2:将硬编码的日志级别参数化

假设一个 LogMessage 方法,最初是写死日志级别为 Info
重构前:

public void LogMessage(string message)
{Console.WriteLine($"[Info] {message}");
}

重构后:

public void LogMessage(string message, string logLevel)
{Console.WriteLine($"[{logLevel}] {message}");
}

调用方可以指定不同的日志级别:

LogMessage("System started", "Info");
LogMessage("Unexpected error occurred", "Error");
LogMessage("User logged out", "Debug");
示例 3:添加额外的运算参数

假设我们有一个求矩形面积的方法 CalculateArea,最初只支持长方形的计算。
重构前:

public double CalculateArea(double length, double width)
{return length * width;
}

重构后:
通过引入一个 shape 参数,我们可以灵活地支持不同的形状:

public double CalculateArea(double length, double width, string shape = "rectangle")
{if (shape == "rectangle"){return length * width;}else if (shape == "triangle"){return (length * width) / 2;}else{throw new ArgumentException("Unsupported shape");}
}

这样方法调用方可以通过传入参数来控制要计算的图形类型:

var rectangleArea = CalculateArea(10, 5);                // 默认长方形
var triangleArea = CalculateArea(10, 5, "triangle");    // 三角形

四、参数化方法的优点

  • 减少重复代码:将类似逻辑抽取为参数化方法,可以避免代码重复,提高代码质量。
  • 增加灵活性:方法的调用方可以根据具体需求传入不同的参数,从而灵活应对各种情况。
  • 提升可维护性:当参数变化时,可以集中在方法内调整,而不是在每个调用处修改硬编码的值。

五、注意事项

  • 参数过多的问题:过多的参数会导致代码难以理解和维护。因此,合理控制参数的数量。如果参数太多,可以考虑使用参数对象或分解方法。
  • 方法的职责单一性:参数化方法可以增强方法的通用性,但仍需确保方法的职责单一,不要将过多的逻辑混合在一个方法中。
  • 保持方法的清晰性:避免让参数变得过于复杂,比如避免传入不同的数据类型让方法执行不同的操作。

参数化方法是一种有效的重构技术,适用于去除硬编码、提升方法通用性的场景。通过这项技术,代码的灵活性、可读性和可维护性都能得到显著提升。然而在使用时,也需保持代码的简洁性,避免过度参数化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/466322.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款基于Flash的交互式园林设计工具:Garden Planner

Garden Planner是一款由Artifact Interactive开发的基于Flash的交互式园林设计工具。它允许用户以拖放的方式安排植物、树木、建筑物和各种对象,使园林规划变得简单直观。此外,Garden Planner提供工具来快速创建铺路、路径和围栏,帮助用户设计…

微信小程序开发,诗词鉴赏app,诗词推荐实现(二)

微信小程序开发,诗词鉴赏app(一): https://blog.csdn.net/jky_yihuangxing/article/details/143501681微信小程序开发,诗词鉴赏app,诗词推荐实现(二):https://blog.csdn.net/jky_yih…

关于诊断中的各种时间参数

前言: 因为不会转载,故在这里贴出原文连接,写的非常好!条理清晰,一遍看懂king110108 原文链接:UDS之时间参数总结篇_uds时间参数-CSDN博客 以下内容是我自己对这篇文章的一些备注和理解,以及从测…

技术干货|HyperMesh CFD功能详解:虚拟风洞 Part 2

在上期 Part 1文章中,我们介绍了从 v2023 版本开始,虚拟风洞VWT(Virtual Wind Tunnel)模块合并到HyperMesh CFD中。用户在VWT模块中完成LBM求解器ultraFluidX的前处理设置,导出参数文件XML和模型文件STL,并…

H7-TOOL的CAN/CANFD助手增加帧发送成功标识支持, 继续加强完善功能细节

2.27版本固件正式携带此功能,包括之前做的负载率检测和错误信息展示也将集成到这个版本固件中。 对于接收,我们可以直接看到效果,而发送不行,所以打算在发送的地方展示下发送成功标识。CAN发送不像串口,需要等待应答后…

mysql5安装

1.下载安装包 https://downloads.mysql.com/archives/community/ mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar tar -xvf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar2.安装依赖 yum -y install perl yum -y install net-tools yum install numactl libaio libaio-devel -y也可…

大模型应用编排工具Dify二开之工具和模型页面改造

1.前言 简要介绍下 dify: ​ 一款可以对接市面上主流大模型的任务编排工具,可以通过拖拽形式进行编排形成解决某些业务场景的大模型应用。 背景信息: ​ 环境:dify-0.8.3、docker-21 ​ 最近笔者在做 dify的私有化部署和二次…

开放寻址法、链式哈希数据结构详细解读

一、开放寻址法(Open Addressing) 1. 定义 开放寻址法是一种哈希冲突解决策略,所有元素都存储在哈希表中。当发生冲突时,即两个键计算出的哈希值相同时,会按照一定的探查序列查找下一个可用的位置来存储新元素。 2.…

并查集(基础学习与应用)

并查集 基本原理: 对于多个集合,每个集合中的多个元素用一颗树的形式表示,根节点的编号即为整个集合的编号,每个树上节点存储其父节点,使得当前集合的每个子节点都可以通过对父节点的询问来找到根节点,根…

基于 Encoder-only 架构的大语言模型

基于 Encoder-only 架构的大语言模型 Encoder-only 架构 Encoder-only 架构凭借着其独特的双向编码模型在自然语言处理任务中表现出色,尤其是在各类需要深入理解输入文本的任务中。 核心特点:双向编码模型,能够捕捉全面的上下文信息。 En…

sql数据库-DQL-条件查询

条件查询 SELECT 字段列表 FROM 表名 WHERE 条件列表; 条件列表 比较运算符功能> 大于>大于等于 < 小于<小于等于等于!不等于between...and...某个范围之间&#xff08;闭区间&#xff09;IN(...)在in之后的列表中的值&#xff0c;多选一LIKE 通…

Android CCodec Codec2 (二十)C2Buffer与Codec2Buffer

在阅读Codec2框架代码时&#xff0c;我们可能会发现好几个名称中都带有“buffer”的类&#xff0c;如MediaCodecBuffer、ABuffer、CCodecBuffers、Codec2Buffer以及C2Buffer。它们分别是什么&#xff1f;各自承担着什么功能&#xff1f;它们之间有何联系&#xff1f;本文将围绕…

WPF怎么通过RestSharp向后端发请求

1.下载RestSharpNuGet包 2.请求类和响应类 public class ApiRequest {/// <summary>/// 请求地址/// </summary>public string Route { get; set; }/// <summary>/// 请求方式/// </summary>public Method Method { get; set; }/// <summary>//…

SQL Server 日志记录

SQL Server是一个关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;旨在有效地存储、组织、检索和操作大量结构化数据。SQL Server日志是监控数据库活动、排查问题和确保数据一致性的基础&#xff0c;这些日志记录了SQL Server实例中发生的事件的时间顺序。它们充当…

书生实战营第四期-基础岛第三关-浦语提示词工程实践

一、基础任务 任务要求&#xff1a;利用对提示词的精确设计&#xff0c;引导语言模型正确回答出“strawberry”中有几个字母“r”。 1.提示词设计 你是字符计数专家&#xff0c;能够准确回答关于文本中特定字符数量的问题。 - 技能&#xff1a; - &#x1f4ca; 分析文本&…

默认 iOS 设置使已锁定的 iPhone 容易受到攻击

苹果威胁研究的八个要点 苹果手机间谍软件问题日益严重 了解 Apple 苹果的设备和服务器基础模型发布 尽管人们普遍认为锁定的 iPhone 是安全的&#xff0c;但 iOS 中的默认设置可能会让用户面临严重的隐私和安全风险。 安全研究员 Lambros 通过Pen Test Partners透露&#…

双指针算法篇——一快一慢须臾之间解决问题的飘逸与灵动(3)

前言&#xff1a;本篇来到双指针算法介绍的最终篇&#xff0c;该文将通过三个同类型但难度逐渐累增的题目&#xff0c;再次强化对双指针算法的理解和运用。 相关题目及讲解 一. 两数之和 题目链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetC…

sparkSQL的UDF,最常用的regeister方式自定义函数和udf注册方式定义UDF函数 (详细讲解)

- UDF&#xff1a;一对一的函数【User Defined Functions】 - substr、split、concat、instr、length、from_unixtime - UDAF&#xff1a;多对一的函数【User Defined Aggregation Functions】 聚合函数 - count、sum、max、min、avg、collect_set/list - UDTF&#xff1a;…

Springcloud高校选课管理系统-计算机毕业设计源码27115

摘 要 随着信息技术的快速发展和高校信息化建设的深入推进&#xff0c;选课管理系统作为高校教育信息化建设的重要组成部分&#xff0c;其重要性和紧迫性日益凸显。传统的选课管理系统往往采用单体架构&#xff0c;存在系统耦合度高、可维护性差、扩展性不强等问题&#xff0c;…

ChatGPT 新体验:AI 搜索功能与订阅支付指南

就在凌晨&#xff0c;在 ChatGPT 迎来两周岁生日之际&#xff0c;OpenAI 重磅发布了 ChatGPT 的全新人工智能搜索体验。 期待已久的时刻终于到来&#xff0c; ChatGPT 正式转型成为一款革命性的 AI 搜索引擎&#xff01; 先来看看 ChatGPT 搜索&#xff1a;这次不是简单的加个…