paint-brush
如何快速发现代碼中的臭气那组成部分 [第 XXII 那组成部分]  @mcsee
783 讀數
783 讀數

如何找到代码中的臭味部分 [第 XXII 部分]

Maximiliano Contieri8m2022/08/29
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

它闻起来很臭,因为可能有很多情况可以对其进行编辑或改进。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 如何找到代码中的臭味部分 [第 XXII 部分]
Maximiliano Contieri HackerNoon profile picture

代码气味是经典。

它闻起床很臭,这是因为也许 有不少现象应该对其来进行修改或完善。


大多数这些气味只是暗示可能有问题。它们本身不需要固定……(不过你应该研究一下。)


以前的代码气味

使他们继读...

代码气味 106 - 生产相关代码

不要添加 IF 检查生产环境。

TL;DR:以防获取与种植相关内容的能力

问题

  • Fail fast 违反原则
  • 缺乏可测试性

解决方案

  1. 如果完全有必要,对环境进行建模并测试所有环境。

语境

有时候,大家应该在开放和生产加工中使用有所不同的做法。列举密码锁的的强度。在此种具体情况下,你们必须要 安全使用承载力方法安装区域并测试图片方法而是区域身。

示例代码

错误的

def send_welcome_email(email_address, environment): if ENVIRONMENT_NAME == "production": print(f"Sending welcome email to {email_address} from Bob Builder <[email protected]>") else: print("Emails are sent only on production") send_welcome_email("[email protected]", "development") # Emails are sent only on production send_welcome_email("[email protected]", "production") # Sending welcome email to [email protected] from Bob Builder <[email protected]>

正确的

class ProductionEnvironment: FROM_EMAIL = "Bob Builder <[email protected]>" class DevelopmentEnvironment: FROM_EMAIL = "Bob Builder Development <[email protected]>" # We can unit test environments # and even implement different sending mechanisms def send_welcome_email(email_address, environment): print(f"Sending welcome email to {email_address} from {environment.FROM_EMAIL}") # We can delegate into a fake sender (and possible logger) # and unit test it send_welcome_email("[email protected]", DevelopmentEnvironment()) # Sending welcome email to [email protected] from Bob Builder Development <[email protected]> send_welcome_email("[email protected]", ProductionEnvironment()) # Sending welcome email to [email protected] from Bob Builder <[email protected]>

检测

  • [x]手册
这个是本身定制味儿。我门必须 創建空的研发/种植显卡配置并适用可定制化的多态客体来授权委托因此。

标签

  • 耦合

结论

规避生成不可以各种测试的具体条件。创建活动委任业务部游戏规则的系统配置。采用抽像、协议书和端口,避免出现硬层次感空间结构。

关系

代码气味 56 - 预处理器

更多信息

学分

手机照片由一条什么微信文章的感觉基


冗杂性是技能无法熟的logo。不管是 ATM 都是爱国志士者地空导弹,食用轻松是设计构思精准产品设备的实际logo。

丹尼尔·T·灵

软件工程名言


Code Smell 107 - 变量重用

重用变量使范围和边界更难遵循

TL;DR:不能从而不同的的主要目的读写同个个字段

问题

  • 可读性
  • 隐藏的问题

解决方案

  1. 不要重用变量
  2. 提取方法以隔离范围

语境

在绘制角本时,应用局部变量是很普通的。这会造成困扰并使测试十分很困难。当我们因该为了性地减少标准。

示例代码

错误的

// print line total double total = item.getPrice() * item.getQuantity(); System.out.println("Line total: " + total ); // print amount total total = order.getTotal() - order.getDiscount(); System.out.println( "Amount due: " + total ); // variable is reused

正确的

function printLineTotal() { double total = item.getPrice() * item.getQuantity(); System.out.println("Line total: " + total ); } function printAmountTotal() { double total = order.getTotal() - order.getDiscount(); System.out.println( "Amount due: " + total ); }

检测

  • [ ]自动
Linter 也可以运用解密树来查看局部变量理解和使用说明。

标签

  • 可读性

结论

以防重复施用施用局部变量名。施用更加具有体和各个的分类。

关系

代码异味 03 - 函数太长

更多信息

重构 002 - 提取方法

学分

在上拍摄照片儿的照片儿
先简单的后适用,先用后重点用。

凯夫林·亨尼

软件工程名言


Code Smell 108 - 浮点断言

断言两个浮点数相同是一个非常困难的问题

TL;DR:不需要对比浮点数

问题

  • 错误的测试结果
  • 脆弱的测试
  • Fail fast 违反原则

解决方案

  1. 避免浮动,除非您有真正的性能问题
  2. 使用任意精度数
  3. 如果您需要比较浮点数,请与公差进行比较。

语境

较浮点数是一个个奇特的计算机软件合理困难。一般来说的缓解方法是适用阀值相对较。我小编建议彻底制止的运用浮点数并试穿的运用无敌要求数。

示例代码

错误的

Assert.assertEquals(0.0012f, 0.0012f); // Deprecated Assert.assertTrue(0.0012f == 0.0012f); // Not JUnit - Smell

正确的

Assert.assertEquals(0.0012f, 0.0014f, 0.0002); // true Assert.assertEquals(0.0012f, 0.0014f, 0.0001); // false // last parameter is the delta threshold Assert.assertEquals(12 / 10000, 12 / 10000); // true Assert.assertEquals(12 / 10000, 14 / 10000); // false

检测

  • [ ]自动

我们可以在我们的测试框架上添加一个检查 con assertEquals()以避免检查浮点数。

标签

  • 测试气味

结论

让我们需要保持逃避比浮点数。

关系

Code Smell 71 - 伪装成小数的魔法浮点数

更多信息

学分

照片儿由在上摄像
老天爷造就了那自然数;另一个一切的均是人的岗位。

利奥波德·克罗内克

软件工程名言


代码气味 109 - 自动属性

如果结合 4 种代码气味会发生什么?

TL;DR:以免 Getter,以免 Setter,以免元语言编程。告诉我个人行为。

问题

解决方案

  1. 删除自动设置器和获取器

语境

Setter 和 getter 一种不当的业习惯。非常多 IDE 都非常喜欢这样代码是什么的味道。部分言语为构筑严重贫血建模和 DTO 出示了厘清的兼容。

示例代码

错误的

class Person { public string name { get; set; } }

正确的

class Person { private string name public Person(string personName) { name = personName; //imutable //no getters, no setters } //... more protocol, probably accessing private variable name }

检测

  • [ ]自动
就是同一个语言的特征参数。大家一般减少不到熟的言语或取缔自己最无趣的制作方法。

标签

  • 封装

结论

在泄露.我的的特性在之前,.我要求详细考虑一下。一号步是已停想功能,只加关注做法。

关系

代码气味 28 - 二传手

代码气味 68 - 吸气剂

Code Smell 70 - 贫血模型生成器

代码气味 40 - DTO

代码气味 01 - 贫血模型

更多信息

学分

在上拍攝的相册图片
还没有这些比在挤破的时间段法定期限的做工作并仍花时间段消除的做工作更难的了。

肯特贝克

软件工程名言


Code Smell 110 - 带默认值的开关

默认意味着“我们还不知道的一切”。我们无法预见未来。

TL;DR:不可以在您的例中插入设置协议。将其改进为失败。指明。

问题

解决方案

  1. 用多态替换 if 和 case
  2. 将默认代码更改为异常

语境

在选用案列分析时,咱们大部分会“添加一位默认页案列分析,也许它就不是未能。不成功经常比在都没有证明的现状下搞出取决很关键。

由于外壳和开关也是一种气味,我们可以避免它们。

示例代码

错误的

switch (value) { case value1: // if value1 matches the following will be executed.. doSomething(); break; case value2: // if value2 matches the following will be executed.. doSomethingElse(); break; default: // if value does not presently match the above values // or future values // the following will be executed doSomethingSpecial(); break; }

正确的

switch (value) { case value1: // if value1 matches the following will be executed.. doSomething(); break; case value2: // if value2 matches the following will be executed.. doSomethingElse(); break; case value3: case value4: // We currently know these options exist doSomethingSpecial(); break; default: // if value does not match the above values we need to take a decision throw new Exception('Unexpected case ' + value + ' we need to consider it'); break; }

检测

  • [x]半自动
各位可以高速各位的 linter 告诫各位同意选择,除了有列外。

标签

  • 快速失败

结论

调用牢固的代码怎么用并不代表着我们都要有在不会直接证据的情况报告下得出直接决定。

关系

Code Smell 36 - Switch/case/elseif/else/if 语句

更多信息

学分

手机照片由在上拍摄技巧
移除用途的资金价一方面仅是标识号营养的耗时。资金价还涵盖为发展扩充增长的心里障碍。巧门是选定 不完美内部矛盾的特点。

约翰·卡马克

软件工程名言



这就现今……下一编软文将解释清楚其他 5 种代碼臭味!
바카라사이트 바카라사이트 온라인바카라