首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【笔记】《重构: 改善既有代码的设计》

, 那么先重构那个程序然后再添加特性 1.2 重构的第一步 重构的第一步是为代码建立一组可靠的测试环境 测试需要自动对各种样例进行检验并给出结果, 结果需要自动化指出错误行号等信息减少人工比对 好的测试是重构的根本...依赖统计和性能度量大大优化来重构的效果 3 代码的坏味道 3.1 重复代码 如果项目内多个地方看到了相同的代码, 那就想办法将其合为一 3.2 过长函数 多对大函数进行分解, 每当需要长注释的时候就应该将所需的分段进行包装了...改为在if-else中调用子函数提高代码可读性, 让代码就像注释一样清楚 9.2 合并条件表达式 如果多个if检测条件不同但结果相同, 则用一个命名合适的函数将这多个if合在一起简化..../取值函数组成. 10.5 令函数携带参数 多个命名不同但是内部行为类似的函数, 应该用参数取代混乱的命名. 10.6 以明确的函数取代参数 10.5的反面, 主要是当参数可选范围很小时, 提高语义的清晰度使用...大型重构不必要一次性完成, 可以将其摊分在很长时间里, 一点一滴取得进步. 12.1 梳理并分解继承体系 让每个继承体系只承担一种责任, 最常见的就是让数据显示和数据处理两个部分分离, 让同一套显示代码以参数或委托的形式接受各种不同的数据

1.6K20

基于对比学习的时间序列异常检测方法

在异常变压器中,用高斯核学习先验差异,用变压器模块学习关联差异;MinMax关联学习也是至关重要的,并且包含了重构损失。...它学习了不同视角下输入的表示。 我们的洞察是,对于正常点,它们大多数情况下即使在不同的视角下也会共享相同的潜在模式(强相关性不容易被破坏)。...将多元时间序列输入中的每个通道被视为一个单一的时间序列,并划分为斑块。每个通道共享相同的自注意网络,表示结果被连接为最终输出。 图4:关于如何进行上采样的一个简单示例。...图5:对不同类型异常的DCdetector和异常变压器之间的地面-真实异常和异常得分的可视化比较。 图6:DCdetector中主要超参数的参数灵敏度研究。...此外,我们提出了一个无重构误差的纯对比损失函数,并通过经验证明了对比表示与广泛使用的重构表示相比的有效性。

73920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    何时应该重构代码?如何重构代码?

    日常工作中,相信大家都见过一些看见就想骂人的代码,那么今天呢,我们就来聊聊何时应该重构代码,以及如何重构代码。...大多数重构都为程序引入了更多的间接层,重构往往把大型的对象拆成多个小型的对象,把大型的函数拆成多个小型的函数。 但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。...如果临时变量承担多个责任,它就应该被替换为多个临时变量。每个变量只承担一个责任,同一个临时变量承担两件不同的事情会令代码阅读者糊涂 7.移除对参数的赋值 代码对一个参数进行复制。...在这种情况下,你可以将这些各自分离的函数同一起来,并通过参数来处理那些变化情况,用以简化问题。 6.以明确函数取代参数 你有一个函数,其中完全取决于参数值而采用不同行为。...针对该参数的每一个可能值,建立一个独立函数。 如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。

    1.7K30

    狗屎一样的代码!快,重构我!

    狗屎一样的代码如何重构? 重构不止是代码整理,它提供了一种高效且受控的代码整理技术。...大多数重构都为程序引入了更多的间接层,重构往往把大型的对象拆成多个小型的对象,把大型的函数拆成多个小型的函数。但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。...如果临时变量承担多个责任,它就应该被替换为多个临时变量。每个变量只承担一个责任,同一个临时变量承担两件不同的事情会令代码阅读者糊涂 7、移除对参数的赋值 代码对一个参数进行复制。...在这种情况下,你可以将这些各自分离的函数同一起来,并通过参数来处理那些变化情况,用以简化问题。 6、以明确函数取代参数 你有一个函数,其中完全取决于参数值而采用不同行为。...针对该参数的每一个可能值,建立一个独立函数。 如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。

    1.1K40

    改动一行代码,PyTorch训练三倍提速,这些「高级技术」是关键

    文章探讨了如何在最小代码更改的情况下扩展 PyTorch 模型训练,并表明重点是利用混合精度(mixed-precision)方法和多 GPU 训练模式,而不是低级机器优化。...不要从头开始训练 现如今,从头开始训练文本或图像的深度学习模型通常是低效的。我们通常会利用预训练模型,并对模型进行微调,以节省时间和计算资源,同时获得更好的建模效果。...损失函数使用 fabric.backward (),而不是 loss.backward ()。 这些微小的改动提供了一种利用 PyTorch 高级特性的途径,而无需对现有代码进行进一步重构。...而张量并行允许训练那些对单个 GPU 而言可能过大的模型,通过将模型分解并分布到多个设备上进行训练。 张量并行是如何工作的呢?想象一下矩阵乘法,有两种方式可以进行分布计算 —— 按行或按列。...例如,我们可以将一个大型矩阵乘法操作分解为多个独立的计算,每个计算可以在不同的 GPU 上进行,如下图所示。然后将结果连接起来以获取结果,这有效地分摊了计算负载。

    68330

    狗屎一样的代码!快,重构我!

    大多数重构都为程序引入了更多的间接层,重构往往把大型的对象拆成多个小型的对象,把大型的函数拆成多个小型的函数。但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。...如果临时变量承担多个责任,它就应该被替换为多个临时变量。每个变量只承担一个责任,同一个临时变量承担两件不同的事情会令代码阅读者糊涂 7、移除对参数的赋值 代码对一个参数进行复制。...在这种情况下,你可以将这些各自分离的函数同一起来,并通过参数来处理那些变化情况,用以简化问题。 6、以明确函数取代参数 你有一个函数,其中完全取决于参数值而采用不同行为。...针对该参数的每一个可能值,建立一个独立函数。 如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    78530

    ECCV 2018 | UBC&腾讯AI Lab提出首个模块化GAN架构,搞定任意图像PS组合

    换句话说,在本例中,研究者利用更多数据来学习更简单的转换函数。这种直觉与最近介绍的模块化网络相一致,本文在概念上采用并扩展了这种网络,用于生成图像任务。...我们的方法相比基线方法生成了更好的结果(例如,看看最后一列的微笑或多属性迁移的结果)。它使用了多个转换模块来改变不同的属性,并且每个转换器模块学习一个特定的从一个领域到另一个领域的映射。...有多个判别器模块 D_i 连接到重构器上,以将生成图像从真实图像中分辨出来,并对相应的属性做出预测。所有的模块拥有相同的接口,即 E 的输出、R 的输入、T_i 的输入和输出有相同的形状和维度。...ModularGAN 有四种不同的模块构成:编码器模块 E、转换器模块 T、重构器模块 R 以及判别器 D。这些模块可以同时进行训练,并根据测试阶段的生成任务用于构建不同的生成网络。...之后,依次应用几个残差块,其输出用 f' 表示。使用变换后的特征图 f' 和具有 Tanh 激活函数的附加卷积层来生成尺寸为 H×W 的单通道特征图 g。

    72910

    改动一行代码,PyTorch训练三倍提速,这些「高级技术」是关键

    文章探讨了如何在最小代码更改的情况下扩展 PyTorch 模型训练,并表明重点是利用混合精度(mixed-precision)方法和多 GPU 训练模式,而不是低级机器优化。...以下是文章原文: 构建基准 在接下来的部分中,Sebastian 将探讨如何在不进行大量代码重构的情况下改善训练时间和准确率。...损失函数使用 fabric.backward (),而不是 loss.backward ()。 这些微小的改动提供了一种利用 PyTorch 高级特性的途径,而无需对现有代码进行进一步重构。...而张量并行允许训练那些对单个 GPU 而言可能过大的模型,通过将模型分解并分布到多个设备上进行训练。 张量并行是如何工作的呢?想象一下矩阵乘法,有两种方式可以进行分布计算 —— 按行或按列。...例如,我们可以将一个大型矩阵乘法操作分解为多个独立的计算,每个计算可以在不同的 GPU 上进行,如下图所示。然后将结果连接起来以获取结果,这有效地分摊了计算负载。

    47030

    告别垃圾代码,请收下这几个锦囊妙计!

    大多数重构都为程序引入了更多的间接层,重构往往把大型的对象拆成多个小型的对象,把大型的函数拆成多个小型的函数。 但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。...如果临时变量承担多个责任,它就应该被替换为多个临时变量。每个变量只承担一个责任,同一个临时变量承担两件不同的事情会令代码阅读者糊涂 7、移除对参数的赋值 代码对一个参数进行复制。...在这种情况下,你可以将这些各自分离的函数同一起来,并通过参数来处理那些变化情况,用以简化问题。 6、以明确函数取代参数 你有一个函数,其中完全取决于参数值而采用不同行为。...针对该参数的每一个可能值,建立一个独立函数。 如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    45410

    告别垃圾代码,请收下这几个锦囊妙计!

    大多数重构都为程序引入了更多的间接层,重构往往把大型的对象拆成多个小型的对象,把大型的函数拆成多个小型的函数。 但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。...如果临时变量承担多个责任,它就应该被替换为多个临时变量。每个变量只承担一个责任,同一个临时变量承担两件不同的事情会令代码阅读者糊涂 7、移除对参数的赋值 代码对一个参数进行复制。...在这种情况下,你可以将这些各自分离的函数同一起来,并通过参数来处理那些变化情况,用以简化问题。 6、以明确函数取代参数 你有一个函数,其中完全取决于参数值而采用不同行为。...针对该参数的每一个可能值,建立一个独立函数。 如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    54230

    狗屎一样的代码!快,重构我!

    大多数重构都为程序引入了更多的间接层,重构往往把大型的对象拆成多个小型的对象,把大型的函数拆成多个小型的函数。 但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。...如果临时变量承担多个责任,它就应该被替换为多个临时变量。每个变量只承担一个责任,同一个临时变量承担两件不同的事情会令代码阅读者糊涂 7、移除对参数的赋值 代码对一个参数进行复制。...在这种情况下,你可以将这些各自分离的函数同一起来,并通过参数来处理那些变化情况,用以简化问题。 6、以明确函数取代参数 你有一个函数,其中完全取决于参数值而采用不同行为。...针对该参数的每一个可能值,建立一个独立函数。 如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    74530

    为什么要重构?如何重构?这个宝典请一定收藏!

    小型重构:对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名和注释、消除超大类或函数、提取重复代码等等。小型重构更多的是使用统一的编码规范。...和类名不同的是,方法命名一般为动词或动词短语,与参数或参数名共同组成动宾短语,即动词 + 名词。一个好的函数名一般能通过名字直接获知该函数实现什么样的功能。...然后你可以在同一个对象中将这个大型函数分解为多个小型函数。...和引用服务之后的Invoker实例,并实现了服务销毁的逻辑 具体实现类XxxProtocol:实现export暴露服务和refer引用服务具体逻辑 优先考虑泛型 声明中具有一个或者多个类型参数(type...TDD的开发周期 Image [6].png 添加一个测试 -> 运行所有测试并检查测试结果 -> 编写代码以通过测试 -> 运行所有测试且全部通过 -> 重构代码,以消除重复设计,优化设计结构 两个基本的原则

    79020

    放大的艺术 | 基于深度学习的单图超分辨

    由于固有的信息缺失,低清图像对应的高清图像不唯一,所以往往用先验或正则项对模型参数加以约束。 降级模型 要训练监督式超分辨模型的第一个问题是:如何获得“低清-高清”样本对?...考虑模糊与噪声的降级模型 二、如何评价超分图像的质量 超分辨的目的是生成与高清图像尽可能相同的图像,所以如何评价超分图像与高清图像的相似度是一个至关重要的问题。...其次,FSRNN将非线性映射扩展成“收缩-映射-扩张”三步,在映射前使用1x1的卷积进行收缩降维,在映射后再通过多个1x1卷积核扩张维度,目的是降低映射过程的参数量与复杂度。...第三,FSRCNN使用多个小尺寸卷积替代原来的单层大尺寸卷积,在提高感受野同时也降低了计算复杂度(两个3x3卷积与一个5x5卷积的感受野大小相同但是总参数量更小)。...作者在分析前人的研究工作时发现,训练好的超分辨网络中多个非线性映射层之间的卷积核十分相似,这个现象使它们产生了在每一步非线性映射中使用相同卷积核的想法,并使用递归结构来实现。

    2.2K30

    整洁代码之道——重构

    总之,我们要做的是重构不是重写,要先从小范围的局部重构开始,然后逐步扩展到整个模块。 重构 — 作用 重构,绝对是软件开发写程序过程中最重要的事之一。那么什么是重构,如何解释重构。...令函数携带参数:如果若干函数做了类似的工作,只是少数几个值不同导致行为略有不同,合并这些函数,以参数来表达不同的值。...以明确函数取代参数:有一个函数其中的逻辑完全取决于参数值而采取不同行为,针对该参数的每一个可能值建立一个单独的函数。...保持对象完整性:如果你需要从某个对象取若干值,作为函数的多个参数传进去,特别是需要传入较多参数比如5个参数或者更多参数时,这种情况建议直接将这个对象直接传入作为函数参数,这样既可以减少参数的个数,增加了对象间的信赖性...图11 Run ‘Overly long method’ 结果 得到图11分析结果之后,我们就可以有针对性的去进行优化重构了,知道哪些类哪些函数需要去优化,具体重构优化是一般可以将过长的函数拆分成几个不同的小函数

    1.6K60

    这代码写的太烂了!你以为我真想写“垃圾代码”吗?

    大多数重构都为程序引入了更多的间接层,重构往往把大型的对象拆成多个小型的对象,把大型的函数拆成多个小型的函数。 但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。...如果临时变量承担多个责任,它就应该被替换为多个临时变量。每个变量只承担一个责任,同一个临时变量承担两件不同的事情会令代码阅读者糊涂 7、移除对参数的赋值 代码对一个参数进行复制。...在这种情况下,你可以将这些各自分离的函数同一起来,并通过参数来处理那些变化情况,用以简化问题。 6、以明确函数取代参数 你有一个函数,其中完全取决于参数值而采用不同行为。...针对该参数的每一个可能值,建立一个独立函数。 如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。...八、处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    98730

    代码重构的原则和技巧

    小型重构:对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名和注释、消除超大类或函数、提取重复代码等等。小型重构更多的是使用统一的编码规范。...和类名不同的是,方法命名一般为动词或动词短语,与参数或参数名共同组成动宾短语,即动词 + 名词。一个好的函数名一般能通过名字直接获知该函数实现什么样的功能。...然后你可以在同一个对象中将这个大型函数分解为多个小型函数。...实例,并实现了服务销毁的逻辑 具体实现类XxxProtocol:实现export暴露服务和refer引用服务具体逻辑 优先考虑泛型 声明中具有一个或者多个类型参数(type parameter)的类或者接口...TDD的开发周期 添加一个测试 -> 运行所有测试并检查测试结果 -> 编写代码以通过测试 -> 运行所有测试且全部通过 -> 重构代码,以消除重复设计,优化设计结构 两个基本的原则 仅在测试失败时才编写代码并且只编写刚好使测试通过的代码

    58930

    【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)

    ), Substitute Algorithm(替换算法), Extract Class(提炼类); -- Extract Method(提炼函数) : 将重复的代码放到一个函数中, 并让函数名称清晰的解释函数的用途...From Template Method(塑造模板函数) 获得一个 Template Method 设计模式, 使用模板函数将相似的部分设置到模板中, 不同的部分用于模板的参数等变量; -- 算法切换...多个客户端使用类中的同一组代码, 或者两个类的接口有相同的部分, 此时可以将相同的子集提炼到一个独立接口中; -- Duplicate Observed Data(复制被监视的数据) : 一些领域数据放在..., 将函数中所需的数据都由参数传入; ② 将函数中所用到的数据设置在全局数据中, 尽量不要使用全局数据; -- 对象参数 : 使用对象封装参数, 不需要把函数需要的所有数据用参数传入, 只需要将函数用到的数据封装到对象中即可...与 发散式变化 区别 : 发散式变化是在一个类受多种变化影响, 每种变化修改的方法不同, 霰弹式修改是 一种变化引发修改多个类中的代码; -- 目标 : 使外界变化 与 需要修改的类 趋于一一对应;

    78210

    重构·改善既有代码的设计.02之代码的“坏味道”

    当感觉需要用注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名。 如何提炼一段代码,一个很好的技巧是:寻找注释。 Large Class 过大的类。...通常如果类内的数个变量有着相同的前缀或字尾,这就意味有机会把它们提炼到某个组件内。 Long Parameter List 过长参数列表。...对于OO(面向对象)语言来说,只需传给它足够的、让函数能从中获得自己需要的东西就行了。函数需要的东西多半可以在函数的宿主类中找到。 Divergent Change 发散式变化。...试想一种情况:当你看到一段代码,有着很长的注释,然后你发现,这些注释之所以存在是因为代码写的很糟糕。视图用注释来说明函数的用意以及实现。...“花合理实践抓出大多数bug”好过“穷尽一生抓出所有bug” 重构的第一步:构建可靠的测试环境 类应该包含他们自己的测试代码 确保所有测试都完全自动化,让它们检查自己的测试结果 一套测试就是一个强大的

    14610

    关于重构的总结

    散弹式修改 一个变化引起多个类修改 依恋情结 一个函数对某个类的兴趣高于对自己所处类的兴趣,通常是过多访问其它类的数据 数据泥团 有些数据经常一起出现,比如两个类具有相同的字段、许多函数有相同的参数...表达式非常复杂、难以阅读时;表达式太长时 分解临时变量 针对每次赋值,创造一个独立、对应的临时变量 临时变量有不同用途且被多次赋值时;临时变量承担多个责任时 移除对参数的赋值 以一个临时变量取代该参数的位置...将该参数去掉 函数本体不再需要某个参数时 将查询函数和修改函数分离 建立两个不同的函数,其中一个负责查询,另一个负责修改 某个函数既返回对象状态值,又修改对象状态时 令函数携带参数 建立单一函数,以参数表达那些不同的值...若干函数做了类似的工作,但函数本体中却包含了不同的值 以明确函数取代参数 针对参数的每一个可能值,建立一个独立的函数 有一个函数,行为的区别完全取决于不同的参数 保持对象完整 改为传递整个对象 当需要从某个对象取出若干值作为某个函数的参数时...塑造模板函数 将这些操作分别放进独立函数中,并保持他们都有相同的签名,于是原函数也变得相同了,再将原函数移至超类 一些子类相应的某些函数以相同的顺序执行某些操作,但各个操作的细节上有些不同时 以委托取代继承

    99410

    论文笔记26 -- (视频压缩)【CVPR2020】M-LVC: Multiple Frames Prediction for Learned Video Compression

    对于第一类,Wu提出了一种基于递归神经网络(RNN)的插值视频压缩方法[32],其中运动信息通过传统的基于块的运动估计来获得,并通过图像压缩方法进行压缩。...因此,本文方案具有更高的可扩展性(即可以使用更多或更少的参考),更易于解释(即通过运动补偿实现预测),并且根据我们的观察结果更易于训练。...Ball’e等人在[4]中引入了一个输入自适应熵模型,该模型使用零均值高斯分布对每个潜在表示进行建模,并通过参数变换预测标准差。...> 最终解码残差 最终解码残差,当前预测帧 -> 当前重构帧(用于下一帧编码) 存储I帧的压缩文件(.bpg) 封装编码结果并存储到文件(.bin) 解码流程: 加载I帧.bpg文件并解码为.png文件...注意,结果是通过分别使用x264和x265编解码器的veryfast模式获得的。在这里,我们还将使用其他设置与H.264和H.265的结果进行比较。

    1.2K30
    领券