热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

重构:优化现有代码设计(第二版)笔记

本文介绍了重构的基本概念,通过具体示例展示了如何提炼函数以处理过长的代码段,并探讨了多种重构技术,如分阶段重构、封装变量等。

在软件开发过程中,重构是一项重要的技能,它帮助开发者改善代码质量,提高可维护性和可读性。本文将通过具体的示例,介绍如何通过重构来优化现有的代码设计。



初始重构集


在开始之前,了解为什么要进行重构以及如何提炼一个函数是非常重要的。特别是当面对过长的函数时,重构可以帮助我们将其拆分为更小、更易于管理的部分。



分阶段重构


分阶段重构是一种逐步改进代码的方法,通过将复杂的操作分解成多个简单的步骤来实现。这种方法不仅使代码更加清晰,还能减少引入错误的风险。



封装变量


封装变量是将变量的访问限制在一个特定的范围内,通常通过创建 getter 和 setter 方法来实现。这不仅可以保护数据的安全性,还可以在需要时添加额外的逻辑。


let defaultOwner = { firstName: "Martin", lastName: "Fowler" }; // before encapsulation

let defaultOwnerData = { firstName: "Martin", lastName: "Fowler" }; // after encapsulation

export function defaultOwner() {
return defaultOwnerData;
}

export function setDefaultOwner(arg) {
defaultOwnerData = arg;
}


将函数组合到类中


将函数和相关的数据组合到一个类中,可以为它们提供一个共同的环境,使代码更加模块化和易于管理。



将函数组合到转换器中


类似于结构型设计模式中的“猴子补丁”(monkey patching),将函数组合到转换器中可以在不修改原始代码的情况下扩展功能。


const rawReading = acquireReading();
const aReading = enrichReading(rawReading);
const basicChargeAmount = aReading.baseCharge;

function enrichReading(original) {
const result = _.cloneDeep(original);
result.baseCharge = calculateBaseCharge(result);
return result;
}


引入参数对象


将共有的行为数据放入一个类中,可以提高代码的复用性和可读性。例如,找出温度不在50到55之间的元素。



封装


封装是面向对象编程的核心概念之一,它通过隐藏内部细节并提供公共接口来保护数据和方法。



封装集合


封装集合是指将集合的访问限制在特定的方法中,从而保护集合的完整性和安全性。



封装记录


封装记录是将一组相关属性封装到一个类中,以便更好地管理和控制这些属性的访问。


let organization = { name: "Acme Gooseberries", country: "GB" }; // before encapsulation

class Organization {
constructor(data) {
this._name = data.name;
this._country = data.country;
}
get name() { return this._name; }
set name(arg) { this._name = arg; }
get country() { return this._country; }
set country(arg) { this._country = arg; }
}


用对象替换基本类型


将基本类型替换为对象可以增加代码的灵活性和可扩展性。例如,将订单优先级从字符串替换为一个对象。


orders.filter(o => "high" === o.priority || "rush" === o.priority); // before replacement

orders.filter(o => o.priority.higherThan(new Priority("normal"))); // after replacement


用查询替换临时变量


将临时变量替换为查询方法,可以使代码更加简洁和易读。例如,将临时变量转换为类的查询方法。


推荐阅读
  • Django框架的使用教程mysql数据库[三]
    Django的数据库1.在Django_test下的view.py里面model定义模型fromdjango.dbimportmodels#Createyourmodelshere ... [详细]
  • 手把手教你构建简易JSON解析器
    本文将带你深入了解JSON解析器的构建过程,通过实践掌握JSON解析的基本原理。适合所有对数据解析感兴趣的开发者。 ... [详细]
  • 应用程序配置详解
    本文介绍了配置文件的关键特性及其在不同场景下的应用,重点探讨了Machine.Config和Web.Config两种主要配置文件的用途和配置方法。文章还详细解释了如何利用XML格式的配置文件来调整应用程序的行为,包括自定义配置、错误处理、身份验证和授权设置。 ... [详细]
  • 首先说一下,这是我在CSDN上的第一个文章,其实这个账号早在几年前就申请了,不过当时只是为了下载一个资源,而且也不怎么懂信息技术相关的领域,后来就再也没怎么动过,直到今天我才开始使用这个账号 ... [详细]
  • 必知必会13条importosos.environ.setdefault(DJANGO_SETTINGS_MODULE,orm_practice.settings)impo ... [详细]
  • Android json字符串转Map
    Androidjson字符串转Map,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了在处理财务凭证查询时,如何实现从插入或修改页面返回至原始查询结果页面,并确保数据保持最新状态的方法。通过使用JavaScript和Java的Session管理技术,解决了动态页面中AJAX调用失效的问题。 ... [详细]
  • 一、数据更新操作DML语法中主要包括两个内容:查询与更新,更新主要包括:增加数据、修改数据、删除数据。其中这些操作是离不开查询的。1、增加数据语法:INSERTINTO表名称[(字 ... [详细]
  • 本文介绍了如何在三台CentOS 7.5虚拟机上通过Docker部署RabbitMQ集群,包括环境准备、容器创建、集群配置及故障处理等内容。 ... [详细]
  • 使用DataGridViewComboBoxColumn实现数据绑定与操作
    本文详细介绍如何在DataGridView中使用DataGridViewComboBoxColumn来加载、选择和保存数据库中的数据,提供具体的实现步骤和示例代码。 ... [详细]
  • Web安全入门:MySQL基础操作与SQL注入防范
    本文详细介绍了MySQL数据库的基础操作命令,包括数据库和表的基本管理,以及数据的增删查改等常用操作。同时,针对Web安全领域常见的SQL注入问题,提供了初步的理解和防范措施。 ... [详细]
  • mysql 分库分表策略_【数据库】分库分表策略
    关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多, ... [详细]
  • 本文通过SystemTap工具详细分析了lvextend命令在SUSE12sp3系统上的执行流程。首先介绍了必要的软件安装步骤,随后展示了如何编写并运行SystemTap脚本来追踪命令执行过程中的函数调用,最后结合实际输出结果对关键函数进行了深入分析。 ... [详细]
  • 本文介绍了如何有效解决在Java编程中遇到的 'element cannot be mapped to a null key' 错误,通过具体的代码示例展示了问题的根源及解决方案。 ... [详细]
  • 本文探讨了如何在Django中创建一个能够根据需求选择不同模板的包含标签。通过自定义逻辑,开发者可以在多个模板选项中灵活切换,以适应不同的显示需求。 ... [详细]
author-avatar
阿宝宝86
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有