重构代码是构建和维护软件的一个重要方面。本教程中,我将尽可能简单地向您展示 phpstorm
的重构功能。
当手动重构代码时,无论是使用旧代码还是创建新代码,在重命名方法时,都很容易出错,例如忘记使用代码的地方。 这就是为什么我喜欢定期使用PhpStorm的重构功能。
假设这是你第一次听说这个术语,引用 Martin Fowler
对于重构的描述:
重构是用于改进现有代码库的设计的可控技术。它的本质是应用一系列小的行为,比如保留性的变换,每一个看似"很小的,不值得去做"的行为,然而,这些变换中的每一个的累积效应是相当显著的。通过在小步骤中执行它们,可以降低引入错误的风险。 您还可以避免在执行重组时让系统损坏,这允许您在较长时间内逐渐重构系统。
重构涵盖了一系列不同的技术,包括移动,提取,复制,删除和重命名。 这些功能涵盖了您可能对代码持续进行的所有类型的更改。
很高兴的是,PhpStorm
的重构功能,作为核心包的一部分,已经支持所有这些。 在本教程中,我将逐步介绍其中的几个; 特别:
- 将代码提取到新方法
- 重命名函数
- 更改函数的签名
将代码提取到新方法
我做的最多的重构就是将代码提取到新方法,我已经数不清我遇到过多少次长函数了,这些函数可以更好的组织成一系列更小的,可复用,可测试的函数。
以下函数作为示例:
public function populate($data)
{
if (is_array($data) && empty($data)) {
throw new HydrationException();
}
$this->id = $data['id'];
$this->userId = $data['userId'];
$this->entry = $data['entry'];
$this->created = $data['created'];
$this->updated = $data['updated'];
}
我们说该函数的最后五行在类的其他部分需要或者在其他单独的函数中服务的话,我们要做的就是将它提取到一个单独的方法里。所以,我们要突出提取所有的行,然后点击 "Refactor -> Extract -> Method"
,显示 "Extract Method"
对话框,您可以在下面看到,预填充的一组默认选项。
我们需要做的一件简单的事就是填写方法名称,其余的选项可以保持默认,但是我还是做了一件事,给唯一的参数 $data
指定类型提示。
这种方式,函数就变得很清晰了,并且生成的 PhpDoc
块也将包含该信息。 单击 “Refactor”
都会生成新方法,并替换突出显示的代码,并调用它,您可以在下面看到它。
public function populate($data)
{
if (is_array($data) && empty($data)) {
throw new HydrationException();
}
$this->hydrateMemberVariables($data);
}
///...intervening code
public function populate($data)
{
if (is_array($data) && empty($data)) {
throw new HydrationException();
}
$this->hydrateMemberVariables($data);
}
重命名函数
现在我们已经将代码提取到一个单独的方法,如何重命名现有的函数,也许它的名字不是那么直观,也可能不是遵循命名最佳实践。 让我们看看如何做到这一点。
这个重构以非常相似的方式运行,但是我们要访问它。 这一次,我们将使用上下文菜单,而不是主要的 "Refactor"
菜单,如下面的屏幕截图所示,如果您使用的是 Windows
或 Linux
,请右键单击,或者如果您使用的是 Mac
,则可以双击。
进入 "Refactor -> Rename"
,弹出一个小窗口,其中的名称突出显示,你可以从下面看出, 从这里,将名称更改为更合适的名称,我将它更改为 getJournalId
。
如果您想要更多选项,请点击 Shift + f6
(检查键盘映射),打开 "Rename"
对话框,您可以在下面看到。 你可以更具体看到重命名如何发生,你也可以在 PhpStorm
搜索注释和字符串以及出现的文本。
似乎并不是所有的都是有必要的,但是,如果你在注释和注释中引用了函数,那么对于自己和未来的开发人员来说,保持文档与代码的同步更改是有帮助的。
当你点击 "Refactor"
时,PhpStorm
将搜索函数并显示,无论是定义还是调用它,并显示一个预览窗口,显示它找到的所有事件, 此时,停止片刻, 不要自动单击 "Do Refactor"
。
这个原因是,根据您选择的方法名称,PhpStorm
可能已经发现它与您的实现无关,只是另一个供应商的库中的一个。如果是这种情况,请右键或双指点击不相关的那个,然后点击排除。 完成后,单击 "Do Refactor"
完成函数重命名。
更改函数的签名
现在重构最后一步,改变函数的签名。 在下面的代码中,我有原先的populate()方法,它接受一个参数 $ data
,这是一个数组,提供类型提示。
/**
* @param $data
*/
public function populate($data)
{
if (is_array($data) && empty($data)) {
throw new HydrationException();
}
$this->hydrateMemberVariables($data);
}
现在我们使用第三种重构方法,使用键盘快捷键 cmd + F6
, 和之前一样,检查你的键盘映射。
这将打开“更改签名”对话框,您可以在上面看到,它所支持的更改方法:
- 能见度
- 名称
- 参数
- 参数顺序
通过点击 $data
我可以添加数组到 type-hint
。 单击 Enter
确认更改,并更新 "Signature Preview"
窗口。 与重命名函数一样,我们可以预览更改或完成重构,完成后,我们的方法被更新,方法的 PhpDoc
注释也是如此,我们可以看到下面:
/**
* @param array $data
*/
public function populate(array $data)
{
if (is_array($data) && empty($data)) {
throw new HydrationException();
}
$this->hydrateMemberVariables($data);
}
总结
以上,展示了如何使用一些 PhpStorm
的内置重构支持执行了三种类型的重构一个PHP类。当然 PhpStorm
还有提供了更多的方式,如安全删除,使静态化,如果你不太熟悉它,就要绝对进一步探讨了。
原文链接:https://www.matthewsetter.com/refactoring-code-with-phpstorm/