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

关于重构的总结

异曲同工的类 两个函数做同一件事,却有着相同的签名 不完美的类库 类库往往不可能满足我们所有的工作 纯稚的数据类 它只拥有一些数据字段。...某个类做了应该由两个类做的事时 将类内联化 将这个类的所有特性搬移到另一个类中,然后移除原类 当一个类不再承担足够责任、不再有单独存在的理由时 隐藏“委托关系” 在服务类上建立客户所需的所有函数,用以隐藏委托关系...有一系列条件,得到相同的处理方式时 合并重复的条件片段 将这段重复的代码搬移到条件表达式之外 在条件表达式的每一个分支有着相同的一段代码时 移除控制标记 以break或return取代控制标志 某个变量带有...若干函数做了类似的工作,但函数本体中却包含了不同的值 以明确函数取代参数 针对参数的每一个可能值,建立一个独立的函数 有一个函数,行为的区别完全取决于不同的参数 保持对象完整 改为传递整个对象 当需要从某个对象取出若干值作为某个函数的参数时...函数上移 将该函数移至超类 有些函数,在子类中产生相同的结果 构造函数本体上移 在超类中新建一个构造函数,并在子类构造函数中调用它 各个子类的构造函数拥有几乎一致的本体时 函数下移 将函数移到相关子类中去

99410

python单元测试简介

但是,将代码放入单独的文件并不意味着它可以作为一个单元进行测试。 单位是什么?在最好的情况下,它是一个纯函数,您可以通过某种方式进行处理-对于给定的输入,该函数始终会为您提供相同的结果。...重构是一种改进程序代码设计的出色方法。并且由于任何更改实际上都可能会修改程序的行为,因此在进行单元测试时最安全的做法是。 这个“鸡与蛋”问题意味着要将测试添加到现有代码中,您必须承担破坏程序的风险。...它遍历页面上的所有锚,并title在每个锚上检查属性。如果存在,则将其传递给prettyDate函数。如果prettyDate返回结果,则使用结果更新innerHTML链接的。...连同该prettyDate函数,它还选择了一些DOM元素并在window加载事件处理程序中对其进行了更新。运用与以前相同的原理,我们应该能够重构该代码并对其进行测试。...重构,第二阶段 下一个测试prettyDate.update, one day later几乎执行相同的操作,不同的是,它向传递了不同的日期prettyDate.update,因此对于这两个链接期望不同的结果

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

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

    重构不止是代码整理,它提供了一种高效且受控的代码整理技术 2.为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。...3.合并重复的条件代码 在表达式的每个分支上都执行了相同的一段代码。将这段重复代码搬移到条件表达式之外。 4.移除控制标记 在一系列布尔表达式中,某个变量带有”控制标记”的作用。...4.分离查询函数和修改函数 某个函数既返回对象状态值,又修改对象值。建立两个不同函数,其中一个负责查询,另一个负责修改。 5.令函数携带参数 若干函数做了类似的工作,但在函数本体中包含了不同的值。...建立单一函数,以参数表达那些不同的值。 有这样两个函数:它们做着类似的工作,但因少数几个值致使行为略有不同。...八.处理概括关系 1.字段上移 两个子类拥有相同的字段。将该字段移至超类。 2.函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    1.7K30

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

    2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。...3、合并重复的条件代码 在表达式的每个分支上都执行了相同的一段代码。将这段重复代码搬移到条件表达式之外。 4、移除控制标记 在一系列布尔表达式中,某个变量带有”控制标记”的作用。...4、分离查询函数和修改函数 某个函数既返回对象状态值,又修改对象值。建立两个不同函数,其中一个负责查询,另一个负责修改。 5、令函数携带参数 若干函数做了类似的工作,但在函数本体中包含了不同的值。...建立单一函数,以参数表达那些不同的值。 有这样两个函数:它们做着类似的工作,但因少数几个值致使行为略有不同。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    45410

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

    2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。...3、合并重复的条件代码 在表达式的每个分支上都执行了相同的一段代码。将这段重复代码搬移到条件表达式之外。 4、移除控制标记 在一系列布尔表达式中,某个变量带有”控制标记”的作用。...4、分离查询函数和修改函数 某个函数既返回对象状态值,又修改对象值。建立两个不同函数,其中一个负责查询,另一个负责修改。 5、令函数携带参数 若干函数做了类似的工作,但在函数本体中包含了不同的值。...建立单一函数,以参数表达那些不同的值。 有这样两个函数:它们做着类似的工作,但因少数几个值致使行为略有不同。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    54230

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

    重构不止是代码整理,它提供了一种高效且受控的代码整理技术 2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。...3、合并重复的条件代码 在表达式的每个分支上都执行了相同的一段代码。 将这段重复代码搬移到条件表达式之外。 4、移除控制标记 在一系列布尔表达式中,某个变量带有”控制标记”的作用。...4、分离查询函数和修改函数 某个函数既返回对象状态值,又修改对象值。 建立两个不同函数,其中一个负责查询,另一个负责修改。 5、令函数携带参数 若干函数做了类似的工作,但在函数本体中包含了不同的值。...建立单一函数,以参数表达那些不同的值。 有这样两个函数:它们做着类似的工作,但因少数几个值致使行为略有不同。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    74530

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

    2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。...3、合并重复的条件代码 在表达式的每个分支上都执行了相同的一段代码。 将这段重复代码搬移到条件表达式之外。 4、移除控制标记 在一系列布尔表达式中,某个变量带有”控制标记”的作用。...4、分离查询函数和修改函数 某个函数既返回对象状态值,又修改对象值。 建立两个不同函数,其中一个负责查询,另一个负责修改。 5、令函数携带参数 若干函数做了类似的工作,但在函数本体中包含了不同的值。...建立单一函数,以参数表达那些不同的值。 有这样两个函数:它们做着类似的工作,但因少数几个值致使行为略有不同。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    78530

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

    2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。...3、合并重复的条件代码 在表达式的每个分支上都执行了相同的一段代码。将这段重复代码搬移到条件表达式之外。 4、移除控制标记 在一系列布尔表达式中,某个变量带有”控制标记”的作用。...4、分离查询函数和修改函数 某个函数既返回对象状态值,又修改对象值。建立两个不同函数,其中一个负责查询,另一个负责修改。 5、令函数携带参数 若干函数做了类似的工作,但在函数本体中包含了不同的值。...建立单一函数,以参数表达那些不同的值。 有这样两个函数:它们做着类似的工作,但因少数几个值致使行为略有不同。...八、处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    98730

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

    2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。...3、合并重复的条件代码 在表达式的每个分支上都执行了相同的一段代码。 将这段重复代码搬移到条件表达式之外。 4、移除控制标记 在一系列布尔表达式中,某个变量带有”控制标记”的作用。...以break/return语句取代控制标记。 5、以多态取代条件表达式 有个条件表达式根据对象类型的不同而选择不同的行为。...5、令函数携带参数 若干函数做了类似的工作,但在函数本体中包含了不同的值。建立单一函数,以参数表达那些不同的值。 有这样两个函数:它们做着类似的工作,但因少数几个值致使行为略有不同。...(八)处理概括关系 1、字段上移 两个子类拥有相同的字段。将该字段移至超类。 2 、函数上移 有些函数在各子类中产生完全相同的结果。将该函数移至超类。

    1.1K40

    重构·改善既有代码的设计.04之重构手法(下)完结

    某个函数既返回对象状态值,又修改对象状态。 5、Parameterize Method 令函数携带参数。 若干函数做了类似的工作,但在函数本体中却包含了不同的值。...1、Pull Up Field 字段上移。 两个子类拥有相同的字段。将该字段移至超类。...有些函数,在各个子类中产生完全相同的结果。...10、Form Template Method 塑造模板函数。 有一些子类,其中相应的某些函数以相同顺序执行类似的操作,但各个操作的细节上有所不同。...在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托函数。 5. 小结 到此已经汇总了书中全部的重构手法,依旧保持个人观点,部分重构手法是以牺牲一定的代码阅读性为代价。

    19410

    怎样开发可重用组件并发布到NPM

    模板语言赋予了 HTML 相同的能力 —— 模板能以局部形式导入到 HTML 的其他片段。 比如你可以只需为页脚编写一次标记,然后将其包含在其他模板中即可。...当复制工作组件的标记时,它具有到该点的CSS快照的隐式链接。 如果你随后更新模板或重构CSS,则需要更新分散在你网站周围的所有模板的版本。...HTML 标记的元素: 1 // "custom element is on the page" 2 所有涉及到获取资源或渲染的工作都应该在这里...但是关于标记和样式,我们的自定义元素相当于空的无样式 。 要将HTML和CSS封装为组件的一部分,还需要附加一个shadow DOM。 最好在构造函数中执行此操作。...与大多数其他 HTML 元素一样,自定义元素可以包含子元素 —— 但默认情况下不是。 到目前为止,前面的自定义元素还不能将任何子元素渲染到屏幕上。 要显示标记之间的内容,还需要用到 slot 元素。

    1.1K20

    图神经网络的自监督学习

    一般来说,大多数关于图的深度学习工作都集中在(半)监督学习场景上,其中模型由带有手动标签的特定下游任务来训练。...思想和上面说的node attribute masking相同,就是对象变成了邻接矩阵。...S2GRL:两个节点间的交互不仅仅限于它们的直接连接,为此,S2GRL将邻接矩阵重构任务推广到预测两个给定节点的k跳连通性(k-hop connectivity prediction)。...具体地,给定标记节点集和未标记节点集,首先在标记集上训练图神经网络。训练结束后,对未标记集进行预测,预测出的高可信度标签被视为伪标签,移动到标记节点集。...然后,在更新后的标记集上训练新的图神经网络,并多次执行上述操作。 M3S 应用深度聚类和对齐机制在多阶段自训练的基础上生成伪标签。

    1.6K20

    【深度学习】迁移学习中的领域转移及迁移学习的分类

    在MTL中,每个学习任务都可以看作是一个域。MTL的目标是最大化模型的泛化性,并提高模型在一个或多个任务上的性能。所有领域都有一个共享的特性集,而它们的学习任务不同但又相关。...最近一些关于不同领域的相关性和冗余的研究放宽了这一限制,并使MTL可以在多种类型的输入上工作(Zamir等人,2019)。...在UDA设置下,Ds和Dt具有相同的学习任务,Ds中有足够的标记样本,而Dt中只有未标记样本(Zhao et al., 2022b)。...本质上,UDA通过对齐源域和目标域中的特征分布来减少域漂移。它使ML和DL模型在不同的领域之间更加一般化和可转移,而不需要从目标领域获得标记的数据样本。...UDA方法利用标记和未标记的数据,从而提高了模型在目标任务上的性能。大多数UDA方法旨在减少协变量移位。

    96810

    .Net 编译器平台 --- Roslyn

    编译器层还包含编译器单次调用的不可变快照,包括程序集引用、编译器选项和源代码文件。 C#语言和Visual Basic语言有两个不同的API表示。...这两个API在形式上类似,但为每种语言进行了高保真度的定制。 该层不依赖于Visual Studio组件。...这意味着一旦获取了一个树,它就是代码当前状态的快照,并且永远不会改变。这允许多个用户在不同线程中同时与相同的语法树交互,而无需进行锁定或复制。...因此,与语法节点不同,只有一个结构用于表示所有类型的标记,其中包含根据所表示的标记类型具有不同含义的属性组合。 例如,整数文字标记表示一个数值。...变量在源代码区域中的流动情况。 更加推测性问题的答案。 使用工作区 工作区层是对整个解决方案进行代码分析和重构的起点。

    33930

    代码重构(六):代码重构完整案例

    因为在每次重构之前,我们修改的是代码的内部结构,而代码模块对外的调用方式不会变的。所以我们所创建的测试用例可以帮助验证我们重构后的程序是否可以正常的工作,是否重构后还符合我们的需求。...在每次重构后,我们都会执行上述测试代码,然后观察结果是否与之前的相同。当然如果你的是单元测试的话,完全可以把对结果检查的工作交给单元测试中的断言来做。 ?...在封装新方法时,要给这个新的方法名一个恰当的函数名,见名知意。 ? 下方这块代码就是我们对上面这两个红框中的代码的提取。在提取时,将依赖于statement()函数中的数据作为新函数的参数即可。...移动的方法是保留Rental中这两个函数的声明,在Movie中创建相应的函数,将函数的内容移到Movie中后,再Rental中调用Movie中的方法。下方是我们经过这次重构后我们Movie类中的内容。...下方代码就是上面大的红框中所对应的代码实现。Price是我们定义好的协议,在协议中规定了遵循该协议的类要实现的方法。而在每个具体实现类中实现了相同的接口,但是不同的类中相同的方法做的事情不同。

    1.9K70

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

    改为在if-else中调用子函数提高代码可读性, 让代码就像注释一样清楚 9.2 合并条件表达式 如果多个if检测条件不同但结果相同, 则用一个命名合适的函数将这多个if合在一起简化....这个重构要注意不要引发副作用且要保证语义的完整性和可读性 9.3 合并重复的条件片段 一组条件表达式中都出现了相同的代码, 那么将这段代码包装好并提炼到条件式外面 9.4 移除控制标记 尽量用break..., 让调用者提前测试并正常返回来避免引发异常 11 处理概括关系 11.1 字段上移 两个子类拥有相同字段时, 上移到基类, 注意别破坏访问控制性 11.2 函数上移 同11.1, 这类操作能大大减少测试难度...如果两个函数相似但不相同, 则可以试着用模板类来优化并提取 11.3 构造函数本体上移 只在子类中保留构造函数有区别的部分, 然后主体通过调用基类构造来实现 11.4 函数下移 11.2的反面, 主要是当一些子类完全用不到某个操作时下移...11.8 提炼接口 实际上就是多继承在Java中的替代品 11.9 折叠继承体系 将基类和子类合并 11.10 塑造模板函数 就是使用模板来提炼那些操作流程相似只是类型不同的函数.

    1.6K20

    19.USENIXSec21 DeepReflect:通过二进制重构发现恶意行为(经典)

    对于第二个挑战,自动标记和验证这些行为是很困难的,因为没有单独标记的恶意软件函数的数据集(与使用反病毒标签的开放数据集的恶意软件检测和分类系统不同)。...为了对定位的恶意软件组件进行分类,我们: (1) 对恶意软件样本中所有已识别的函数进行聚类 (2) 使用分析人员在日常工作流程中所做的注释(即少量人工分析的函数行为标签)来标记聚类结果 这种方法是半监督的...我们评估了DEEPREFLECT的性能,包括五个工作: (1) 识别恶意软件中的恶意活动 (2) 聚类相关的恶意软件组件 (3) 将分析人员的注意力集中在重要事情上 (4) 揭示不同恶意软件家族之间的共享行为...调用不同类型API可执行不同类型功能,直接的表示了高层的函数行为,是很关键的特征。 本文工作API特征的选择受到先前恶意软件检测工作[18]的启发。...此外,聚类质量存在问题,相同功能却被聚集在不同类簇中,分析了3个案例,主要因为小地方存在差异,聚类算法过于敏感。

    1.2K20

    代码重构(四):条件表达式重构规则

    继续更新有关重构的博客,前三篇是关于类、函数和数据的重构的博客,内容还算比较充实吧。今天继续更新,本篇博客的主题是关于条件表达式的重构规则。有时候在实现比较复杂的业务逻辑时,各种条件各种嵌套。...说白了也就是不同的条件有着同样的返回结果。当然一般在你程序设计之初不会出现此问题,因为在我们设计程序时,如果不同的条件返回相同的结果,我们肯定会将其合并的。...在上述夸张的Demo中一眼就能看出来如何进行重构了(在日常开发迭代中,因为业务逻辑的复杂性或者多次迭代的原因,往往不是那么一目了然)。接下来我们就要对不同条件,但返回相同结果的部分进行合并。...在Book类实例化时,需要为书的对象指定该书的类型(三种类型中的一种)。在Book类中,还有一个核心方法,那就是计算书的价格。在charge()函数中,根据不同的书的种类,给出了不同的价格。...今天博客中的Demo在github上的分享地址为:https://github.com/lizelu/CodeRefactoring-Swift

    1.6K90

    前端修仙之路:从“路人”到大神,走对这几步很重要

    HTML 与 CSS基础 前端的领域里,任何东西都离不开HTML 与 CSS。HTML与CSS基本上控制了你看到的所有东西,HTML用来定义内容而CSS负责样式与布局。...在学习这些的时候不要太担心自己会忘了,反正记不住。你应该着重于记录这些并且理解HTML和CSS是怎么工作的。...最佳实践实际上就是一系列的在日常开发中总结出来的约定俗成的规范的集合,来让你更快地开发与构建更高质量的代码。...Semantic Markup:语义标记 HTML与CSS最佳实践中重要的一条就是怎么来写出有语义可读性的标记。好的语义即是你使用了合适的HTML标签与CSS的类名来传达出你想表达的结构含义。...你可以在 CSS Vendor Prefixes这篇文章里获取更多的知识。这就意味着你需要花费更多的时间来在不同的浏览器之间进行测试。 ?

    91450

    Facebook最新对抗学习研究:无需平行语料库完成无监督机器翻译

    我们提出构建一种模型,它用两种不同的语言从单语语料库(monolingual corpora)中提取句子,然后将它们映射到相同的潜在空间中。...通过学习从这个共享的特征空间中以两种语言进行重构,该模型有效地学习了在不使用任何标记数据的情况下进行翻译。...关键点是在两种语言(或领域)之间建立一个共同的潜在空间,并根据两个原则通过在两个领域进行重构来学习翻译:(1)模型必须能够从噪声版本中以给定的语言重构句子,如在标准去噪自动编码器中。...除了这些重构目标之外,我们还使用对抗正则化术语将源句子和目标句子的潜在表示限制为相同的分布,由此模型试图欺骗鉴别器,该鉴别器被同时训练以识别给定的潜在句子表示的语言。...例如,在WMT数据集上,在对100000对句子进行完全监督的机器翻译系统中,我们可以达到同样的翻译质量。

    94050
    领券