还不知道怎么重构吗?

华为OD机试新系统真题-谁没交卷(Java /Py/C++/Go/C/Js) 华为OD机试 新系统真题【谁没交卷】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【谁没交卷】多语言题解。 阅读详情

宏观

重构需要明白的知识点

• 为什么重构,重构的是什么,什么时候重构,怎样重构

• 重构:大规模重构,小规模重构

• 通过单元测试保证重构的质量

封装,抽象,继承,多态分别解决那些编程问题?

  • 封装 : 通过对访问权限控制来实现封装,封装的意义在于暴露少许接口或属性,避免业务调用者在不理解业务的前提下对接口或属性业务做修改。封装目的是:隐藏信息,保护数据,public private protected
  • 抽象: 通过 interface 或 abstract 或一个函数都能实现抽象特性。 抽象的意义:让开发者只关注功能点,不关注实现的设计思路,这样做的好处帮助我们过滤掉不必要的信息,抽象无处不在(方法命名也是抽象,所以经常被认为不是面向对象编程特性之一)
  • 继承: Java 中通过 extend 实现继承特性,继承意义:is a 的关系,提高代码复用。(继承不要过度使用,可以使用组合代替继承,继承耦合性太高。)
  • 多态: 继承,重写,接口都可以实现动态,多态意义:可扩展和复用,可扩展在第二个例子中使用接口实现多态,如果需要扩展只需要添加一个实现类,而对于 print 方法里的业务逻辑是不需要改动的。所以也是实现代码复用性

继承+重写实现实现多态

根据上面的代码需要满足以下语法机制

• 父类对象可以引用子类对象

DynamicArray dynamicArray = new SortedDynamicArray();

• 编程语言中可以使用继承,子类继承父类

public class SortedDynamicArray extends DynamicArray

只要这样才可以让 SortedDynamicArray 传递给 DynamicArray

DynamicArray dynamicArray = new SortedDynamicArray();
test(dynamicArray); // 打印结果:1、3、5
public static void test(DynamicArray dynamicArray) {
dynamicArray.add(5);
dynamicArray.add(1);
dynamicArray.add(3);
for (int i = 0; i < dynamicArray.size(); ++i) {
System.out.println(dynamicArray[i]);
}
}

• 子类可以重写父类方法 SortedDynamicArray 重写 DynamicArray 方法

public class SortedDynamicArray extends DynamicArray {
@Override public void add(Integer e) {
ensureCapacity();
for (int i = size-1; i>=0; --i) { // 保证数组中的数据有序
if (elements[i] > e) {
 elements[i+1] = elements[i];
} else {
 break;
}
}
elements[i+1] = e;
++size;
}
}

接口实现多态

面向对象比面向过程优势是什么?

• 基本区别:代码组织的方式不同,面向过程中方法和数据结构是分开的。面向对象的代码被组织成一组类,方法和数据结构被绑定在一起,定义在类中。

• OOP 面对复杂的业务逻辑则凸显出优势,1 把需求翻译为类 2 类之间建立交互关系 3 按照流程组装类。

• OOP 具有四大特性,封装 抽象 继承 多态

• OOP 更加人性化

常见违反面向对象规则

• 滥用 get 和 set 方法

• 对公共类没有做到单一职责原则

• 贫穷模式开发:指开发模式是面向过程开发,例如 mvc

接口与抽象类区别

抽象类如何定义

abstract 修饰;不允许实例化,只能被继承;可以有方法体和属性;子类继承父类必须实现父类中的抽象方法 抽象类表示 is-a 关系

public class MessageQueueLogger extends Logger
(Logger logger = new Logger(…); 会报编译错误
protected abstract void doLog(Level level, String message);
@Override
public void doLog(Level level, String mesage) {
// 格式化 level 和 message, 输出到日志文件
fileWriter.write(...);
}

接口如何定义

• 接口里面不能有属性和方法体

• 类实现接口,必须实现接口中的方法体

• 接口是 has -a 关系

抽象类和接口能解决什么编程问题

• 因为抽象类可以继承,所以拥有代码复用的特性,当然不止有这个好处,否则我们直接继承类就可以。另一个好处就是实现多态的特性

当下面代码调用的时候会报错,是因为 logger 父类中没有 log()方法

• 接口:抽象类更多的是代码复用,接口更偏向于解耦。

如何决定要抽象类还是接口

抽象类

• 解决代码复用问题

• is-a 关系

接口

• 解决抽象问题

• has-a 关系

为什么基于接口编程而非实现编程,有必要为每个类都定义接口吗

基于接口而非实现编程,这句话可以理解为基于抽象而非实现编程。

需求

把以前通过阿里云上传下载的代码修改为私有服务器上传和下载,下面图片是上传阿里云的代码

解决方案

如果想解决这个问题,在编写代码的时候我们要遵循基于接口而非实现编程的原则

• 函数命名不能保留任何实现细节

• 封装具体的实现细节,例如对于一些特殊的实现我们要封装。不要暴露给调用者,例如图片中的获取 token 相关信息

• 为实现类定义抽象接口。接口的定义只表明做什么,而不是怎么做。并且要思考是否通用,当新添加新的实现不会修改接口

什么时候定义接口

• 接口和实现相分离,封装不稳定的实现,暴露稳定的接口

参考资料

  • 设计模式之美
9、自动定理证明的发展历程与关键技术 本文全面介绍了自动定理证明的发展历程、关键技术及其实际应用,包括消解原理、参数化、支撑集策略等核心方法,并探讨了算法优化、数据结构优化及并行计算等提升效率的手段。同时,文章展望了未来发展方向,如深度学习在定理证明中的应用、交互式定理证明以及高阶逻辑的研究前景。 阅读详情

相关推荐

结合 Conda 手动安装 RepeatMasker

RepeatMasker 是一个广泛使用的生物信息学工具,用于识别和屏蔽(mask)基因组序列中的 重复序列(repeats) 。在使用过程中需要调用重复序列数据库(Repbase 和 Dfam),如果使用Conda安装的话会出现许多问题,因此推荐手动安装。在此记录我手动安装RepeatMasker的流程,希望对各位同学有所帮助。

m0_65437087的博客 2534

重构之你可能不知道的重构场景

什么是重构? “重构”一词想必你已经听腻了,就是整理代码呗,不不不,重构旨在不改变调用者行为的前提下,对内部逻辑进行调整优化,提高其理解性,降低其修改成本,它是一门艺术,是程序员至高无上的荣耀…… 何时重构?怎么重构? 经常听到周边的人抱怨没有时间重构,重构并不是单独抽出时间集中处理的,而是当你想要做某个功能时,随手把需要重构的地方安排了。 逻辑重复 重复代码是最核心常见的预警信息,如果有两...

weixin_33913377的博客 125

全自动数据分析 - Claude Code Sub-Agents:自动化数据分析工厂

别忘了!claude code也是agent框架,类似langgraph,crewAI,autogen等等agent框架。我改造claude code搞一个数据分析智能体AI。试试看行不行!:让数据分析变得像聊天一样简单!

liangdabiao的博客 1072

重构:你可能不知道的重构场景

     什么是重构?   “重构”一词想必你已经听腻了,就是整理代码呗,不不不,重构旨在不改变调用者行为的前提下,对内部逻辑进行调整优化,提高其理解性,降低其修改成本,它是一门艺术,是程序员至高无上的荣耀……      何时重构?怎么重构?   经常听到周边的人抱怨没有时间重构,重构并不是单独抽出时间集中处理的,而是当你想要做某个功能时,随手把需要重构的地方安排了。...

qianfeng_dashuju的博客 724

《深入 UFS Explorer:自定义 RAID 配置指南》

UFS Explorer支持以虚拟模式组装任何受支持的RAID配置,以便后续访问其内容或恢复丢失数据。启动RAID构建器;向RAID构建器主内容区域的列表中添加RAID组件;为不可用组件插入占位符(需当前RAID级别支持且软件兼容);调整组件的准确顺序;在“虚拟RAID配置”区域设置RAID参数;以虚拟模式组装阵列各部分。程序主窗口“存储设备导航面板”中打开的任何存储设备(包括驱动器、逻辑卷、磁盘镜像、虚拟磁盘及其他复杂存储设备)均可作为RAID组件。

melonbo的专栏 1398

【STM32实战】利用STM32CubeMX配置PWM互补输出驱动电机

本文详细介绍了如何利用STM32CubeMX配置STM32高级定时器的PWM互补输出功能,以驱动电机等需要半桥/全桥电路的应用。通过图形化界面设置定时器参数、使能互补通道并配置关键的死区时间,结合代码示例演示了如何启动PWM输出和动态调整占空比,确保输出安全、精确的互补信号,避免MOS管直通风险,提升驱动可靠性。

weixin_29161785的博客 534

代碼重構,你所不知道的二手代碼

  原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ivantian2008.blog.51cto.com/622133/912246 转载自 51cto  田皓宇的博客     昨天好友愛飛翔童鞋關心的詢問道:伊凡,今天的工作如何,bug改的還算是順利嗎?我比較模棱連科的答到:還行吧。之後簡單的"抱怨"了幾句。之...

chyimemory的专栏 192

主板USB接口全部失效解决方案(通用串行总线USB控制器有黄色叹号)保姆级教程亲测有效

通用串行总线控制器总是有叹号解决办法 办公室的崩腾时代老电脑,疫情期间没人用,来了开机之后发现鼠标键盘都用不了,本以为是主机放时间长出了问题,后来想起来就百度了“鼠标键盘都失效”的标题,结果发现了“串行总线控制器总是感叹号”的关联问题。正好办公室电脑都装有teamviwer常用来远程办公(在家偷懒)。所以通过远程发现电脑室可以运行的。并在控制面板发现:通用串行总线控制器总是感叹号,插入外设时USB无反应。如图:​ 并且右键选中其中一个,点击最后一个选项:“属性” 可以发现“设备状态”中会提示“由...

xiao_bai_0_0的博客 2万+

这样基于Netty重构RPC框架你不可能知道

​原创申明:本文由公众号【名师猿灯塔】原创,转载请说明出处标注 今天是猿灯塔“365天原创计划”第6天。 今天呢!灯塔君跟大家讲: 基于Netty重构RPC框架 一.CyclicBarrier方法说明 1.单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。。(最开始58 同城的站点架构用一个词概括就是“ALL IN ONE”。就...

猿灯塔的博客 347

杰理AC696N系列芯片,烧录的时候烧录器连接上芯片之后电脑显示无法识别该设备,该怎么解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1705

【深度学习】脸部修复,CodeFormer,论文,实战

Blind face restoration是一个高度 ill-posed 的问题,通常需要辅助引导来 1) 改善从降级输入到期望输出的映射,或者 2) 补充在输入中丢失的高质量细节。在本文中,我们展示了在一个小的代理空间中学到的离散码本先验可以通过将盲目的面部恢复建模为 a code prediction task来大大减少恢复映射的不确定性和模糊性,同时为生成高质量面部提供丰富的视觉元素。

q742971636的博客 2991

别人重构了整套代码,汝还不知道哪里有问题,相差几个等级?

  以前在纽微特期间,吾将整套终端代码重构了。自然的会引起新的故障。李某冷嘲热讽了一番。那么,这之间相差几个等级?   吾知道有问题,汝不知道。这就是一个等级。   吾知道重构方案。即怎么重构。   吾能够动手重构。动嘴谁不会啊?真正动手,就会发现各种问题,有时不得不临时后退一步。   吾能几天内完成重构。说明什么?说明胸有成竹。   吾能对整套代码进行重构。一个小功能重构倒是正常,而一...

柳鲲鹏 572

等保测评-瀚高数据库

一般适用于等保测评

m0_54146694的博客 1631

重构代码太耗时?VSCode AI Copilot这5个功能让你效率翻倍,90%开发者还不知道

重构代码太耗时?掌握VSCode AI Copilot的代码重构5大技巧,提升开发效率。适用于JavaScript、Python等多语言场景,智能生成、自动优化、快速重命名、上下文感知、错误预防,让修改更安全高效。90%开发者忽略的功能细节,值得收藏。

ByteShoal的博客 621

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

DevContainers使用率暴增500%,你还不知道它如何重构开发流程?

统一开发环境难题,从源头解决配置不一致。通过开发工具链的容器化封装(VSCode+Docker+DevContainers),实现开箱即用的标准化开发流程,广泛用于微服务、跨团队协作与CI/CD集成,提升效率50%以上,省去环境调试时间,值得收藏并点击了解具体实践方案。

codeink的博客 790

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

AI如何重构历史地理研究范式:7个已被验证的学术突破案例,90%学者还不知道

AI历史地理学习正推动学科范式革新:通过时空建模、古地图OCR、多源文本挖掘等方法,提升历史事件定位精度与区域变迁分析效率。涵盖考古遗址识别、古籍地名消歧等7个已验证学术突破场景,显著降低人工考证成本。值得收藏。

FastDebug的博客 207

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【IDEA重构黄金法则】:3步精准抽取接口,90%开发者不知道的5个避坑要点

掌握IDEA抽取接口重构技巧,高效解耦代码、提升可维护性。本文详解3步精准抽取接口流程,覆盖Spring Boot等主流场景,揭示90%开发者忽略的5个避坑要点,如抽象粒度把控、实现类迁移规范等。实操性强,值得收藏。

GatherTide的博客 155

浅谈压缩感知(二十七):压缩感知重构算法之稀疏度自适应匹配追踪(SAMP)

主要内容: SAMP的算法流程 SAMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一、SAMP的算法流程 前面所述大部分OMP及其前改算法都需要已知信号的稀疏度K,而在实际中这个一般是不知道的,基于此背景,稀疏度自适应匹配追踪(Sparsity Adaptive MP)被提出。SAMP不需要知道稀疏度K,在迭代循环中,根据新残差与旧残差的比较来确...

weixin_34001430的博客 1492

关于代码重构你应该知道的内容

文章引自《重构:改善既有代码设计》 1 什么叫做重构 重构是在不改变软件可观察行为的前提下改善其内部结构, 重构的本质就是在代码写好之后改进它的设计 2 为什么要进行代码重构 如果没有重构,程序的设计会逐渐 腐败变质 重构使软件 更容易理解,通过重构代码来协助开发人理解不熟悉的代码 如果对代码进行重构,就可以深入理解 代码的行为,重构帮助找到 隐藏BUG 完成同样一件事,设计不良的程序往往...

Long-Tai 9592

重构是什么,为什么要重构,怎么重构

        前言: 我们做程序员这一行的哈,说白了就是用机器能识别的语言跟机器打交道,但是经常会出现的一种情况是,我们所写的代码只有自己和机器能看得懂,其他人看懂有一定的困难性,甚至有时候过了一段时间连自己都看不懂了。。。那么此时你应该感叹自己当时的水平高超,还是该好好的反思一下了? 一,重构是什么         OK,闲言碎语不多讲,啥叫重构呢?随手打开百度,输入“重构”,点开百度百科...

qq_36282233的博客 1万+

相关性的练习:建立不知道和知道的相关性

在人与AI的映照中,我看到一种更宏观的学习力图景:不断地用先验去推演未知,用探索去修正模型,让“相关性”成为驱动理解和创造的底层逻辑。梁宁指出,大脑的学习是“由点到线、由线成网”的过程:当一件事能被放进已有的认知网络中,它才真正变成你的能力。她在课程中举例说,一个优秀的学习者,总是能在熟悉的领域中发现新的不确定性,也能在陌生的领域中找到熟悉的结构。梁宁在她的课程中强调,真正的学习是“在脑中建立模型的过程”,即通过不断比较、联想、匹配,把零散的信息纳入一个更大的结构,从而实现理解的跃迁。

m0_63680154的博客 745

为什么不重构呢?

重构是提高质量的重要工具。许多开发方法都依赖于重构,尤其是对于敏捷方法,在更多计划驱动的组织中也是如此。但事实上,是否以重构来处理设计中的某些问题呢?是否存在重构的障碍呢?不重构的原因存在...

我相信...... 725

那些老鸟程序员知道而新手不知道的小技巧

重构是程序员的主力技能。 工作日志能提升脑容量。 先用profiler调查,才有脸谈优化。 注释贵精不贵多。杜绝大姨妈般的“例注”。漫山遍野的碎碎念注释,实际就是背景噪音。 普通程序员+google=超级程序员。(一个不错的vpn) 单元测试总是合算的。 不要先写框架再写实现。最好反过来,从原型中提炼框架。 代码结构清晰,其它问题都不算事儿。 好的项目作风硬派,一键测试,一键发布,一键部署; 烂的项

蝈蝈的博客 1304

关于重构的原则和思想总结

永远不要忘记「两顶帽子」重构与开发是两顶帽子,要时常交换进行,不可以同时戴上。

itbird的专栏 1420

CH02_重构的原则(什么是重构、为什么重构、何时重构)

重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。重构的关键在于运用大量微小且保持软件行为的步骤,一步步达成大规模的修改。每个单独的重构要么很小,要么由若干小步骤组合而成。可观察行为:整体而言,经过重构之后的代码所做的事应该与重构之前大致一样。重构与性能优化有很多相似之处:两者都需要修改代码,并且两者都不会改变程序的整体功能。

qq_27953479的博客 1603

《重构 改善既有代码的设计》之重构原则

1 简介 过年回家了,在家里已经呆了两天,两天里陪父母烧锅,教他们使用红米手机,聊天,吃饭。家里很好,只是父母年纪又大了一岁,很心疼它们,听他们讲年后还要出去打工挣钱,不知道说什么,觉得很对不起他们。我真的是太没用了。父亲总是吸烟,烟瘾很重,一晚上要吸很多根,我很担心,但总是劝不停。两天没有总结这本刚看完的《重构》了,所以今晚上,虽然很冷,还是坐在椅子边上认真的敲一些字,总结一下吧。 重构 改善既...

不当初 2164
上一篇: FeignClint之后扫描包报错
下一篇: Kafka介绍
王雪芬-ghqr-264962
博客等级 码龄11年 363粉丝 215原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王雪芬-ghqr-264962

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值