重构代码之取消临时字段

在代码重构中,临时字段是一种常见的反模式。临时字段指的是一个类的字段在部分方法中会被赋值或使用,但在其他很多方法中却未被使用,导致代码的维护性和可读性变差。这种设计往往表明字段的存在是偶然的或局部的,而非类的真正属性。因此,通过消除临时字段,我们可以提升代码的结构性和可读性。

一、为什么临时字段是一个反模式?

临时字段的主要问题在于它增加了类的复杂性,让代码阅读者误以为字段是这个类的核心属性,而实际上它可能只在特定情况下才有用。例如,临时字段通常在只有少数方法中赋值,在其他情况下可能保持 null 或无意义的默认值,这使代码变得难以理解,调试和维护变得复杂。

二、识别临时字段的信号

临时字段的特征通常包括:

  • 字段只在部分方法中被使用,而在其他方法中无意义。
  • 字段在类的大部分时间中为空或无效值。
  • 字段的使用存在多个条件分支,用于检查其是否有效。

三、解决方案

有几种方式可以消除临时字段:

  1. 将字段移入方法
    如果字段只在某个方法或一组方法中使用,那么可以将该字段改为局部变量,限定在方法的作用域内。
  2. 使用辅助类或数据容器
    如果临时字段是多个方法共享的数据,可以将这些字段提取到一个单独的辅助类中,用该类管理它们的状态。这样不仅提升了代码的模块化,还降低了原始类的复杂度。
  3. 引入专用的值对象
    如果临时字段用于特定的计算或数据传输,可以引入一个值对象专门承担这个作用。这样可以确保类的状态更加简洁,且符合单一职责原则。

四、示例

下面是一个 C# 的代码示例,展示了如何识别和重构临时字段。

4.1 重构前的代码
public class OrderProcessor
{private Customer _customer;  // 临时字段private decimal _discount;   // 临时字段,仅在部分方法中使用public void SetCustomer(Customer customer){_customer = customer;}public decimal CalculateDiscount(){if (_customer == null) return 0;_discount = _customer.IsPremium ? 0.1m : 0.05m;return _discount;}public void ProcessOrder(Order order){if (_customer == null) throw new InvalidOperationException("Customer not set");// 处理订单逻辑}
}

在上面的例子中,_customer_discount 字段只是为了完成 CalculateDiscount 方法而存在的,其他方法中则不需要它们。这使得 OrderProcessor 类复杂化,并且 _discount 在其他情况下可能无效。

4.2 重构后的代码
public class OrderProcessor
{public decimal CalculateDiscount(Customer customer){if (customer == null) return 0;return customer.IsPremium ? 0.1m : 0.05m;}public void ProcessOrder(Order order, Customer customer){if (customer == null) throw new InvalidOperationException("Customer not set");// 处理订单逻辑}
}

在重构后,我们移除了临时字段 _customer_discount,并将 Customer 参数直接传递给 CalculateDiscountProcessOrder 方法。这样 OrderProcessor 不再依赖于临时状态,类变得更简洁,代码的意图更加明确。

4.3使用 Null Object 模式(进阶用法)

在某些场景中,如果临时字段的空值被频繁检查,Null Object 模式也是一种有效的替代方案。例如,在上述代码中,如果 _customer 的空值情况较多且影响其他代码,可引入 Null Object 替代空值。

五、总结

取消临时字段的重构目的是为了让类的状态更明确,方法的职责更清晰。通过将临时字段转化为局部变量、辅助类或值对象,我们可以增强代码的清晰度,使其更易于维护和扩展。

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

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

相关文章

springboot029基于springboot的网上购物商城系统

🍅点赞收藏关注 → 添加文档最下方联系方式领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 基于…

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表,但是hbase是一个列式存储的表结构,与我们常用的mysql等关系型数据库的存储方式不同,mysql中的所有列的数据是按照行级别进行存储的,查询数据要整个一行查询出来,不想要的字段也需要…

二手交易平台测试用例设计和执行

🎄欢迎来到边境矢梦的csdn博文🎄 🎄追求开源思想和学无止境思想一直在提升技术的路上 🎄 🌈涉及的领域有:Java、Python、微服务架构和分布式架构思想、基本算法编程🌈 🎆喜欢的朋友可…

SpringBoot框架的简介及实现步骤

一,SpringBoot简介: Spring Boot 是一个由 Pivotal 团队开发的开源框架,它基于 Spring 框架,旨在简化新 Spring 应用的初始搭建以及开发过程。Spring Boot 提供了多种特性来帮助开发者快速地创建独立的、生产级别的基于 Spring 的应用。 在…

npm常用函数定义手册(持续更新)

使用国内源 # 查询当前使用的镜像源 npm get registry # 设置为淘宝镜像源 npm config set registry https://registry.npmmirror.com/ # 还原为官方镜像源 npm config set registry https://registry.npmjs.org/ sql.js npm install sql.js

蓝牙FTP 协议详解及 Android 实现

文章目录 前言一、什么是蓝牙 FTP 协议?二、FTP 的工作流程1.蓝牙设备初始化2. 设备发现与配对3. 建立OBEX FTP 连接4. 文件传输文件上传(通过OBEX PUT命令)文件下载(通过OBEX GET命令) 5. 关闭OBEX会话 三、进阶应用与…

七大AI知识库工具概览

在数字化转型的浪潮中,企业越来越注重知识管理的重要性。以下是七款各具特色的AI知识库工具,它们通过智能化手段助力企业在知识管理、团队协作及客户服务等方面取得显著成效。 HelpLook AI知识库 概述:作为一款SaaS软件,HelpLook…

[NewStar 2024] week5完结

每次都需要用手机验证码登录&#xff0c;题作的差不多就没再进过。今天把week5解出的部分记录下。好像时间过去很久了。 Crypto 没e也能完 这题给了e,p,q,dp,dq。真不清楚还缺啥 long_to_bytes(pow(c,dp,p)) 格格你好棒 给了a,b和提示((p2*r) * 3*a q) % b < 70 其中r…

26.校园快递物流管理系统(基于SSM和Vue的Java项目)

目录 1.系统的受众说明 2.相关技术 2.1 JAVA简介 2.2 SSM三大框架 2.3 MyEclipse开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 2.6访问数据库实现方法 3. 系统分析 3.1 需求分析 3.2 系统可行性分析 3.2.1技术可行性&#xff1a;技术背景 3.2.2经济可行性…

数据编排与ETL有什么关系?

数据编排作为近期比较有热度的一个话题&#xff0c;讨论度比较高&#xff0c;同时数据编排的出现也暗示着数字化进程的自动化发展。在谈及数据编排时&#xff0c;通常也会谈到ETL&#xff0c;这两个东西有相似点也有不同点。 数据编排和ETL&#xff08;提取、转换、加载&#x…

CSS教程(二)- CSS选择器

1. 作用 匹配文档中的某些元素为其应用样式。根据不同需求把不同的标签选出来。 2. 分类 分类 基础选择器 包含 标签选择器、ID选择器、类选择器、通用选择器等 复合选择器 包含 后代选择器、子代选择器、伪类选择器等 1 标签选择器 介绍 又称为元素选择器&#xff0c;根…

材质(二)——材质参数化,从源材质继承生成不同的材质实例

继承原材质&#xff0c;对外提供参数。 更改调制不同的参数&#xff0c;生成不同的材质实例。 类似于&#xff0c;类的继承。有一个基类Base.继承生成为子类 A_Base,B_Base,C_Base

鸿蒙笔记--Scroll

这一节了解一下Scroll控件,在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;Scroll控件是一个重要的可滚动容器组件&#xff0c;它允许在子组件的布局尺寸超过父组件尺寸时提供滚动功能。 scrollable&#xff1a; 含义&#xff1a;控制Scroll组件的滚动方向。 可选…

WordPress 2024主题实例镜像

目录 隐藏 1 WordPress 2024主题实例镜像启用的插件 2 WordPress 2024主题实例镜像截图 WordPress 2024主题实例镜像启用的插件 WordPress 2024主题实例镜像启用了2024主题&#xff0c;配置了&#xff1a; Akismet 反垃圾评论插件 Admin Notices Manager仪表盘通知隐藏…

Java 基于 SpringBoot+Vue 的水果在线销售系统开发(附源码,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

如何用Python代码计算文件的SHA256?

以下是使用 Python 计算文件的 SHA256 哈希值的例子。代码的功能是利用Python代码计算文件的SHA256&#xff0c;同时将结果打印到屏幕和文件。 import hashlib import sysdef calculate_sha256(file_path):sha256_hash hashlib.sha256()with open(file_path, "rb")…

腾讯云nginx SSL证书配置

本章教程,记录在使用腾讯云域名nginx证书配置SSL配置过程。 一、nginx配置 域名和证书,替换成自己的即可。证书文件可以自定义路径位置。服务器安全组或者防火墙需要开放80和443端口。 server {#SSL 默认访问端口号为 443listen 443 ssl; #请填写绑定证书的域名server_name c…

【双十一特惠】腾讯云省钱攻略:如何智取云计算资源

前言 双十一不仅是购物的狂欢节&#xff0c;对于云计算用户来说&#xff0c;更是一个节省成本的绝佳时机。腾讯云&#xff0c;作为国内领先的云计算服务商&#xff0c;每年双十一都会推出一系列优惠活动。本文将为您揭开如何在这个购物节中&#xff0c;最大化利用腾讯云的优惠…

【前端】Svelte:响应性声明

Svelte 的响应性声明机制简化了动态更新 UI 的过程&#xff0c;让开发者不需要手动追踪数据变化。通过 $ 前缀与响应式声明语法&#xff0c;Svelte 能够自动追踪依赖关系&#xff0c;实现数据变化时的自动重新渲染。在本教程中&#xff0c;我们将详细探讨 Svelte 的响应性声明机…

项目总结(3)

一.输入框集合 QLineEdit是一个单行文本编辑控件。 使用者可以通过很多函数&#xff0c;输入和编辑单行文本&#xff0c;比如撤销、恢复、剪切、粘贴以及拖放等。 通过改变QLineEdit的 echoMode() &#xff0c;可以设置其属性&#xff0c;比如以密码的形式输入。 文本的长度可…