如何通过重构规范您的代码(包括 PHP 示例)

已发表: 2021-06-22

像生活中的许多其他事情一样,我们的代码也需要一些纪律。 我很确定世界上没有开发人员愿意编写不干净的代码。 但是,不干净的代码仍然存在。 它可能由多种原因引起 - 可能是由于业务压力、缺乏文档、团队成员之间缺乏互动或开发人员无能。 需要采取适当的措施使代码更清晰,并避免将来因此可能出现的问题。 幸运的是,我们可以通过一种规范的技术来解决这些问题,以重构称为Refactoring的代码。

重构是一种改进现有程序源代码的内部结构并保持其外部行为的技术。 这是一个循序渐进的过程来改进代码,否则会花费我们大量的时间和精力。

代码重构

不干净代码的缺点

通过添加新程序来扩大源代码大小而不进行长时间的重构,使得代码变得凌乱和不干净。 这使得项目的维护和进一步开发变得非常困难。 不干净的代码有很多缺点:

  1. 它增加了项目的维护成本。
  2. 添加新功能需要花费大量时间,有时甚至无法添加。
  3. 它减慢了向项目引入新人的速度。
  4. 它包含重复的代码。
  5. 它没有通过所有测试。

还有许多其他缺点,但这些问题会花费组织大量的金钱和时间。

干净代码的优势

干净和规范的代码有其自身的优势:

  1. 它不包含重复的代码。
  2. 它通过了所有测试。
  3. 使代码更具可读性和更容易理解。
  4. 它使代码更易于维护且成本更低。

干净代码的优点有很多。 将凌乱的不干净代码变成更易于维护的干净代码的过程称为重构过程。

重构过程

重构应该作为一系列小的改动来完成,每一个改动都会稍微改进现有的代码,并允许程序继续运行而不破坏它。 重构后,代码应该比以前更干净。 如果它仍然不干净,那么重构就没有意义了。 这只是时间和精力的损失。 在重构过程中不应添加新代码以创建新功能。 它应该在重构后通过所有测试。

何时重构

在以下情况下应执行重构:

  • 向项目添加重复代码。 因为重复的代码很难维护,一个地方的更改可能需要许多其他地方的更新。
  • 添加一个功能。 重构使添加新功能变得更加容易。
  • 修复错误时,您应该重构,因为它会使错误自动发现。
  • 代码审查是在将更改部署到生产之前重构代码的最后阶段。

处理代码异味

代码问题有时被称为代码异味。 这些是重构过程中解决的问题。 它们更容易找到和修复。

例如:

  • 很难使用的大型方法和类。
  • 面向对象编程概念的不完整或不正确的使用。
  • 难以添加任何更改的代码。
  • 项目中重复和弃用的代码。
  • 高度耦合的代码。

重构技术

重构技术是重构代码所采取的步骤。 一些重构技术是:

1.提取方法

// 问题

function printInvoice() { $this->printHeader(); // Print details. print("name: " . $this->name); print("amount " . $this->getPrice()); }

// 解决方案

function printInvoice() { $this->printBanner(); $this->printDetails($this->getPrice()); } function printDetails($price) { print("name: " . $this->name); print("amount " . $outstanding); }

如果您有可以分组的代码片段,请为该部分代码添加新方法并替换旧代码。 它使代码更加孤立并消除重复。

2. 提取变量

// 问题

if (($student->getMarksinMath() > 60) && ($student->getMarksInPhysics() > 60) && ($student->getMarksinChemistry() > 60) && $this->pass) { // do something }

// 解决方案

$mathResult = $student->getMarksinMath() > 60; $physicsResult = $student->getMarksinPhysics() > 60; $chemistryResult = $student->getMarksinChemistry() > 60; $hasPassed = $this->pass; if ($mathResult && $physicsResult && $chemistryResult && $hasPassed) { // do something }

对于问题中显示的大型表达式,非常难以理解,可以为每个表达式创建不同的变量。 它使代码更具可读性。 但这种方法应谨慎应用。 但是,它有其自身的缺点。 即使条件为假,代码也会执行,而问题并非如此。

3. 内联方法

// 问题

function printResult() { return ($this->getResult()) ? “Pass” : “Fail”; } function getResult() { return $this->totalMarks > 300; }

// 解决方案

function getRating() { return ($this->totalMarks > 300) ? “Pass” : “Fail”; }

当方法体比较明显时,使用这个技巧。 用方法内容替换方法并删除方法。 它最大限度地减少了不需要的方法的数量。

4. 内联温度

// 问题

$mathMark = $student->getMathResult(); return $mathMark > 60;

// 解决方案

return $student->getMathResult() > 60;

如果有一个不需要的临时变量只保存表达式结果,请删除带有表达式本身的变量。 它有助于摆脱不必要的变量。

5. 用对象替换数组

// 问题

$row = []; $row[0] = "Virat Kohli"; $row[1] = 70;

// 解决方案

$row = new Player(); $row->setName("Virat Kohli"); $row->setNumberofCentury(70);

如果有一个包含各种类型数据的数组,请将其替换为一个对象。 因为类的字段比具有各种类型数据的数组更容易记录和维护。

6. 参数化方法

// 问题

function fivePercentRaise() { } function tenPercentRaise() { }

// 解决方案

function raise(percent) { }

如果多个方法对数据执行类似的操作,则将所有方法替换为一种方法并将数据作为参数传递。 它删除了重复和冗余的方法。

7. 将查询与修饰符分开

// 问题

function getInterest() { $this->interestAmount = $this->principal * 10 / 100; return $this->interestAmount; }

// 解决方案

function setInterest() { $this->interestAmount = $this->principal * 10 / 100; } function getInterest() { return $this->interestAmount; }

如果一个方法正在返回值并更改对象,则拆分这两个方法。 一个用于修改,另一个用于返回结果。 它消除了无意修改对象的机会。