重构-提取重复的代码

2023-11-11

在编写程序过程中,特别是刚刚入行没有多久的程序员,经常会犯的一个错误就是大段大段的复制粘贴代码。把功能相近的代码直接复制过来而不加以修改。这个习惯也许来源于你的老师也许来源于你本身的原因。总之,对于这一类程序员最好的设计模式就是“Ctrl+C(复制)”和“Ctrl+V(粘贴)”。

但是复制代码虽然在一定程度上提高了编程的速度,但是更多的是带来了不可预计的问题:若要修改这个功能的代码,却只修改了一部分,被复制的其他部分忘记修改;粘贴之后的代码,其中的变量忘记修改过来,造成了未知的问题,回头查找的时候却也找不到问题的所在;代码啰嗦等。

如何重构重复的代码呢?

  1. 把重复的代码封装成一个函数,让需要的地方调用这个函数即可;
  2. 如果重复的代码是出现在“互为兄弟类”中,也就是这两个类有共同的父类,可以把相同的代码提到父类中;
  3. 如果代码只是类似而不是完全相同,可以把相同的部分和相异的部分提炼出来,设计成模板模式;
  4. 如果两个互不相干的类出现重复的代码,可以把相同的部分,提到一个父类中或者提取到一个接口中;
  5. 重复代码的类只属于某一个函数,而且让另外的类可以直接调用这个类中函数。

设计模式-模板模式
就是把相同的部分提取出来,重点是提取相同的代码执行顺序(算法),而不是执行的细节。

#pragma once
class Bird {
	void showBird();
protected:
	virtual void eat();
	virtual void fly();
	virtual void say();
};

class XiQie : public Bird {
private:
	virtual void eat();
	virtual void fly();
	virtual void say();
};

class WuYa : public Bird {
private:
	virtual void eat();
	virtual void fly();
	virtual void say();
};
#include "Bird.h"
#include <stdio.h>

void Bird::showBird() {
	eat();
	fly();
	say();
}

void Bird::eat() {
	
}

void Bird::fly() {

}

void Bird::say() {

}

void XiQie::eat() {
	printf("喜鹊在吃\n");
}

void XiQie::fly() {
	printf("喜鹊在飞\n");

}

void XiQie::say() {
	printf("喜鹊在叫\n");
}

void WuYa::eat() {
	printf("乌鸦在吃\n");
}

void WuYa::fly() {
	printf("乌鸦在飞\n");
}

void WuYa::say() {
	printf("乌鸦在叫\n");
}

调用:

#include <stdio.h>
#include "Bird.h"
int main() {
	Bird* bird = new XiQie;
	bird->showBird();

	Bird* bird2 = new WuYa;
	bird2->showBird();
	return 0;
}

解析:
定义个鸟类,里面有一个公共函数,就是展示这个鸟,展示这个鸟的一些行为,吃、飞、叫。首先要展示吃,然后在展示飞,最后再展示叫。这个先后顺序已经规定好了。任何一个继承这个类的子类必须按照这个顺序执行。所以每个子类只要把具体执行的内容完成就可以了,具体的执行顺序在父类中规定了一个模板。这就是设计模式中的-模板模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重构-提取重复的代码 的相关文章

  • C++设计模式(8)——命令模式

    命令模式 亦称 动作 事务 Action Transaction Command 意图 命令模式是一种行为设计模式 它可将请求转换为一个包含与请求相关的所有信息的独立对象 该转换让你能根据不同的请求将方法参数化 延迟请求执行或将其放入队列中
  • 设计模式三: 代理模式(Proxy) -- JDK的实现方式

    简介 代理模式属于行为型模式的一种 控制对其他对象的访问 起到中介作用 代理模式核心角色 真实角色 代理角色 按实现方式不同分为静态代理和动态代理两种 意图 控制对其它对象的访问 类图 实现 JDK自带了Proxy的实现 下面我们先使用JD
  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • 设计模式的 C++ 实现---工厂方法模式(二)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 前言 对于工厂方法模式 当增加新产品时 也需要对应增加一个工厂类 可以使用模版进行封装 减少代码工作量 实现举例 产品抽象基类 class Animal pu
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • C++设计模式-State状态模式

    State状态模式作用 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 UML图如下 State类 抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState类 具体状态 每一
  • 设计模式--Abstract server模式 VS Adapter 模式

    适配器类似于现实世界里面的插头 通过适配器 我们可以将分属于不同类的两种不同类型的数据整合起来 而不必去根据某一需要增加或者修改类里面的方法 Adapter mode和Proxymode的区别 Proxy的关注点是职能转移 通过引入Prox
  • HeadFirst 设计模式学习笔记10——MVC分析

    1 M V C Model View Controller 模式 视图 控制器 这是一种范型 模型对象正是应用系统存在的理由 你设计的对象 包含了数据 逻辑和其他在你的应用领域创建定制的类 视图通常是控件 用来显示和编辑 控制器位于二者中间
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • [C++]外观模式

    外观模式 Facade Pattern 隐藏系统的复杂性 并向客户端提供了一个客户端可以访问系统的接口 这种类型的设计模式属于结构型模式 它向现有的系统添加一个接口 来隐藏系统的复杂性 这种模式涉及到一个单一的类 该类提供了客户端请求的简化
  • Java设计模式之装饰者设计模式Decorator Pattern

    目录 一 基本概念 二 结构 1 图示 三 案例演示 被装饰对象的基类 一个接口 有cost 和description 两个抽象方法 具体被装饰的对象 实现上面这个接口 装饰者抽象类 基类 实现drink接口 具体的装饰者类 糖 具体装饰者
  • 程序员必知的23种设计模式之组合模式

    文章目录 1 模式引出 学校院系展示需求 1 1 传统方案 1 2 传统方案问题分析 2 组合模式基本介绍 2 1 方案修改 3 组合模式解决的问题 4 组合模式的注意事项和细节 1 模式引出 学校院系展示需求 编写程序展示一个学校院系结构
  • 设计模式——State(状态)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 应用举例 4 1 State TcpState 4 2 Context TcpConnection 4 3 ConcreteState ListeningTcp
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • Java监听器与观察者模式

    Java监听器与观察者模式 Java中的监听器 Listener 和观察者模式 Observer Pattern 都是用于处理对象间的事件通知和响应的设计模式 它们的目的是在对象之间建立一种松散的耦合 使得一个对象的状态变化可以通知到其他对
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

    文章目录 一 进行面向对象设计 1 划分职责 gt 需要有哪些类 2 定义类及其属性和方法 3 定义类与类之间的交互关系 4 将类组装起来并提供执行入口 二 如何进行面向对象编程 1 接口实现

随机推荐

  • ESP32-C3入门教程 基础篇(一、ADC采样)

    经过前面的折腾 设计好了自己的测试开发板 搭建好了开发环境 然后正式开始进行功能测试了 测试顺序先从简单的开始吧 一步一步来 目录 前言 1 ADC采样示例测试 1 1 DMA连续采样 1 2 单次采样 1 3 测试源码 2 ESP32 C
  • linux之perf(2)list事件

    Linux之perf 2 list事件 Author Onceday Date 2023年9月3日 漫漫长路 才刚刚开始 参考文档 Tutorial Perf Wiki kernel org perf list 1 Linux manual
  • DevOps理念:开发与运维的融合

    在现代软件开发领域 DevOps 不仅仅是一个流行的词汇 更是一种文化 一种哲学和一种方法论 DevOps 的核心理念是通过开发和运维之间的紧密合作 实现快速交付 高质量和持续创新 本文将深入探讨 DevOps 文化的重要性 原则以及如何在
  • C语言 - 整形在内存中的存储方式

    一 以补码的形式存储在内存当中 1 有符号型的整数二进制首位0表示正 1表示负数 2 正数的原码 反码 补码都相同 如 3 负数的反码为原码的首位数不变 其他位按位取反所得 补码为反码 1 如 当然 要得到负数的原码 可以反过来 即补码 1
  • 基于SpringCloud的Microservices架构实战案例-在线API管理

    simplemall项目前几篇回顾 1基于SpringCloud的Microservices架构实战案例 序篇 2基于SpringCloud的Microservices架构实战案例 架构拆解 3基于SpringCloud的Microserv
  • C语言读取load格式文件,求指导,如何用c语言实现读取*.raw格式图像

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这个程序是读取jpg图像的 后续加上jpg图像打开和存放 include include include include include define SOI 0xD8 文件头 define E
  • 【Redis篇】Redis缓存之双写一致性

    1 引言 redis做为缓存 mysql的数据如何与redis进行同步呢 本质上问的就是双写一致性 注意 回答这个问题前一定要结合自己的业务背景 分两种情况 一个是你的业务一致性要求高 另一个是你的业务允许延迟一致 2 双写一致性 2 1
  • 大数据技术之数据质量管理

    一 数据质量概述 1 数据质量简介 数据质量的高低代表了该数据满足数据消费者期望的程度 这种程度基于他们对数据的使用预期 只有达到数据的使用预期才能给予管理层正确的决策参考 数据质量管理作为数据仓库的一个重要模块 主要可以分为数据的健康标准
  • 前端实现导出excel表格(单行表头)

    需求 实现勾选行导出为表格 一 安装插件 npm install save file saver xlsx 运行项目报如下警告的话 运行npm install xlsx 0 16 0 save 来降低版本号 最初我安装的版本号是0 18 1
  • android天气预报开题报告,开题报告-基于Android手机移动天气预报系统.doc

    毕业设计 论文 开题报告 题目 基于Android手机移动天气预报系统 一 选题依据 目的和意义 天气预报就是对未来时期内天气变化的预先估计和报告 它是根据大气科学的基本理论和技术对每一地区的未来天气做出分析和预测 这是大气科学为国民经济建
  • 比尔盖茨现身西雅图SAS 2007“治疗失眠”

    结束了4月18 21号的访华活动 比尔盖茨又现身在了西雅图5月8号开始的为时两天的第八届微软战略合作伙伴高峰会议上 Strategic Account Summit Conference 这次会议请来了众多重量级的大腕嘉宾 包括负责微软网络
  • Springboot 接口方式硬通知实现ConfigurationProperties 、@Value 动态刷新

    前言 看到这个文章标题 也许有的看官就觉得很多余 因为Nacos 可以设置 NacosValue value XXX autoRefreshed true 实现动态刷新 又因为cloud config的 RefreshScope 实现动态刷
  • 基于Warshall算法的连通图及欧拉图判定方法

    1736年欧拉解决了哥尼斯堡七桥问题 他在这一具体问题的基础上进一步研究 最终找到了一个简便的原则可以鉴别一个图 多重图 能否一笔画成 本文中 笔者使用布尔矩阵来存储一个无向图 并结合集合论中 传递闭包 的概念给出了一种欧拉图的判定方法 本
  • (系统的推送)友盟推送

    今年再次负责这个模块 最大亮点就是支持了系统的推送 也就是说你设备退出后台应用了 发推送还可以收到推送 https info umeng com detail id 169 cateId 1 测试方案 选择测试模式 可以无限制的发送数量 公
  • Pytorch深度学习入门与实战三——循环神经网络

    1 常见的循环神经网络 RNN LSTM GRU RNN torch nn RNN 单纯的RNN会出现随着地柜次数的增加 权重指数级爆炸或小时的问题 从而难以捕捉长时间的关联 导致RNN训练是收敛困难 LSTM 引入门的机制 使网络有更强的
  • 草料二维码统计扫描信息

    目录 1 注册账号并登陆 2 创建活码 2 1 点击活码后编辑 2 1 1 新建 gt 空白建码 也可以选择模板 3 查看统计信息 3 1 扫描创建的活码 3 2 数据分析 gt 扫描量统计 需求说明 由于服务推广需要统计扫码人数 所以使用
  • 相似图像的检测方法

    背景 以图搜图 是日常生活中我们经常会用到 例如在选购一款商品时 想要对比价格 往往会在各个购物app上通过搜图的形式来看同一款产品的价格 当你碰到某种不认识的植物时 也可以通过以图搜图的方式来获取该种植物的名称 而这些功能大都是通过计算图
  • Hook 学习系列(一) —— State Hook

    React Hook State Hook 使用多个 state 变量 以 use 开头的函数被称为 Hook React Hook 是 React 16 8 引入的新特性 它用在函数组件中 允许开发者不使用 class 的情况下 使用状态
  • QT 正则表达式 QRegExp 使用

    直接贴代码 QRegExp rx startxref s d rx setMinimal false int pos 0 while pos rx indexIn trl pos 1 pos rx matchedLength qDebug
  • 重构-提取重复的代码

    在编写程序过程中 特别是刚刚入行没有多久的程序员 经常会犯的一个错误就是大段大段的复制粘贴代码 把功能相近的代码直接复制过来而不加以修改 这个习惯也许来源于你的老师也许来源于你本身的原因 总之 对于这一类程序员最好的设计模式就是 Ctrl