如何使用 PhpStorm 將 new 重構成依賴注入?

   2016-09-08 0
核心提示:為了可測試性與低耦合,我們會使用 依賴注入 取代 new 建立物件,對於 legacy code,當然可以使用手動的方式重構,透過 PhpStorm,我們可以使用更簡單的方式將 new 重構成 依賴注入 。 Motivation 若使用 TDD 方式開發,為了隔離測試,一定會使用依賴注入建立

為了可測試性與低耦合,我們會使用 依賴注入 取代 new 建立物件,對於 legacy code,當然可以使用手動的方式重構,透過 PhpStorm,我們可以使用更簡單的方式將 new 重構成 依賴注入

Motivation

若使用 TDD 方式開發,為了隔離測試,一定會使用依賴注入建立物件,在深入探討依賴注入一文中曾以可測試性角度探討之,不過在實務上,一直沒有以工具的角度探討如何實踐,本文將使用 PhpStorm,實際將 legacy code 的 new 重構成 依賴注入

Version

PHP 7.0.0

Laravel 5.2.39

PhpStorm 2016.1.2

實際案例

PostService.php 1 1 GitHub Commit : 建立 PostService()

app/Services/PostService.php
namespace App\Services;

use App\Repositories\PostRepository;
use Illuminate\Database\Eloquent\Collection;

class PostService
{

/**
* @return Collection
*/

public function showLatest3Posts()
{

$postRepository = new PostRepository();
return $postRepository->getLatest3Posts();
}
}

在 legacy code,我們常會發現 class 直接在 method 內被 new ,以執行結果角度而言是對的,但有以下兩個問題 :

  1. 由於 PostRepositoryshowLatest3Posts() 內直接被 new ,因此無法對 PostRepository 做隔離,導致無法對 PostService 做單元測試。
  2. 由於 PostRepositoryshowLatest3Posts() 內直接被 new ,導致 PostService 直接相依於 PostRepository ,耦合性太高,無法被抽換,違反 SOLID 原則的 開放封閉原則依賴反轉原則

要解決這兩個問題,又不影響執行結果,最簡單的方式就是將 new 重構依賴注入

Extract Field

如何使用 PhpStorm 將 new 重構成依賴注入?

將來要將 $postRepository 重構成 field,使用 constructor injection 方式。

將滑鼠游標放在 $postRepository 變數上,按熱鍵 ? + T,出現 Refactor This 選單,選擇 Extract Field

如何使用 PhpStorm 將 new 重構成依賴注入?

可以重構成兩種方式,因為將使用 constructor injection 來建立物件,不需要 new ,因此選擇 $postRepository

如何使用 PhpStorm 將 new 重構成依賴注入?

PhpStorm 會自動使用原來變數名稱為 field 名稱。

  • Initialize in : 選 Current method
  • Visibility : 選 private

注意 Initialize in 並不是選擇 Class constructor ,因為我們要用的是 constructor injection,而不是在 constructor 去 new 一個物件給 field。

如何使用 PhpStorm 將 new 重構成依賴注入?

PhpStorm 幫我們加上了 field,這是我們預期的。

但 PhpStorm 一樣是在 method 去 new 產生物件,只是改成 field,這不是我們想要的。

如何使用 PhpStorm 將 new 重構成依賴注入?

將 method 內有 new 的一行手動刪除。

如何使用 PhpStorm 將 new 重構成依賴注入?

在 field 加上 PHPDoc 描述型別。

在 PhpStorm 要替 field 加上 PHPDoc 很簡單,只要在 field 上面輸入 /** ,再按 ? 空白鍵,就會出現 /** @var */

@var 之後輸入型別,輸入 Po 之後就會出現語法提示讓你用挑的。

如何使用 PhpStorm 將 new 重構成依賴注入?

在 field 加上型別描述,為 constructor injection 的 type hint

Generate Constructor

如何使用 PhpStorm 將 new 重構成依賴注入?

按熱鍵 ? + N,出現 Generate 選單,選擇 Constructor

如何使用 PhpStorm 將 new 重構成依賴注入?

選擇你要使用依賴注入的 field。

如何使用 PhpStorm 將 new 重構成依賴注入?

PhpStorm 自動幫我們在 constructor 產生依賴注入。

PostService.php 2 2 GitHub Commit : 將 PostService() 重構成依賴注入

app/Services/PostService.php
namespace App\Services;

use App\Repositories\PostRepository;
use Illuminate\Database\Eloquent\Collection;

class PostService
{

/** @var PostRepository */
private $postRepository;

/**
* PostService constructor.
* @param PostRepository $postRepository
*/

public function __construct(PostRepository $postRepository)
{

$this->postRepository = $postRepository;
}

/**
* @return Collection
*/

public function showLatest3Posts()
{

return $this->postRepository->getLatest3Posts();
}
}

單元測試

如何使用 PhpStorm 將 new 重構成依賴注入?

馬上跑單元測試, 綠燈 打完收工。

PostServiceTest.php 3 3 GitHub Commit : 單元測試 : 建立 PostServiceTest

app/Services/PostService.php
use App\Post;
use App\Services\PostService;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class PostServiceTest extends TestCase
{

use DatabaseMigrations;

/** @test */
public function 顯示最新3筆文章()
{

/** arrange */
factory(Post::class, 100)->create();

/** act */
$actual = App::make(PostService::class)
->showLatest3Posts()
->pluck('id')
->all();

/** assert */
$expected = [100, 99, 98];
$this->assertEquals($expected, $actual);
}
}

Conclusion

  • Legacy code 蠻免會使用 new 去建立物件,為了降低耦合度與增加可測試性,勢必改用依賴注入,透過 PhpStorm 的重構,可以快速地將 new 重構成依賴注入,非常方便。

Sample Code

完整的範例可以在我的 GitHub 上找到。

 
标签: PhpStorm
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • PHP 设置调试工具XDebug PHPStorm IDE
    PHP 设置调试工具XDebug PHPStorm IDE
    先下载PHP扩展Xdebughttps://xdebug.org, 可以复制自己的phpinfo粘贴到https://xdebug.org/wizard.php中, 会生成需要下载的版本, php.ini的设置语句.下载好之后放入php目录的ext文件夹中, 然后设置php.ini, 在最后加上zend_extension = C:\path\php\ext\php_x
  • PHPStorm+Xdebug断点调试PHP
    PHPStorm+Xdebug断点调试PHP
    前言:何为DEBUG?相信很多程序员都知道debug这个单词,也明白它的意思,但是对于这词的由来,恐怕少有人知道。关于debug的由来,要追溯到1937年。1937年,美国青年霍德华.艾肯找到IBM公司为其投资200万美元研制计算机,第一台成品艾肯把它取名为:马克1号(m
  • PhpStorm 2017.1 EAP 171.2272 发布
    PhpStorm 2017.1 EAP 171.2272 发布
    PhpStorm 2017.1 EAP 171.2272发布了。PHPStorm 是 JetBrains 公司开发的一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。如果你之前已经安装了2017.1phpStorm EAP (171.2152),你很快
    02-05 PhpStorm
  • Mac PHPStorm 使用心得
    PHPStorm 是什么?「 PHPStorm 」 是一个轻量级且便捷的 PHP IDE。其旨在提供用户效率、可深刻理解用户的编码、提供智能代码补全、快速导航以及即时错误检查。PHPStorm 使用心得 (一)全局搜索(command + shift + F)显示类中的方法 (command + 7)函数追踪
  • [实践OK]使用WebStorm/Phpstorm实现remote host
    主要是设置自动保存到远程这个选项:勾选 [V]Tools-deployment-Automatic UploadPhpStorm Save and Upload on ctrl+s, 'Tools - Deployment-config' mark as default serve...Just set server configuration on 'Tools - Deployment-config' mark as default
  • PhpStorm v2016.3发布,工具框架更新,PHP编辑新体验!
    PhpStorm v2016.3发布,工具框架更新,PHP编辑
    下载最新版PhpStorm试用 工具和框架 Remote Interpreters中支持Docker 加入Docker,在PhpStorm中可以添加远程PHP解释器。 PHPSpec 支持 2016.3版本中加入PHPSpec支持。 PHPUnit, Behat, PHPSpec自动识别和配置 现在将会收到提示,建议自动配置PHPUnit, Behat,
    11-10 PhpStormPHP
  • Phpstorm配置phpunit对php进行单元测试
    Phpstorm配置phpunit对php进行单元测试
    在 phpstorm 中配置 php 项目的单元测试,项目使用 Composer 进行管理,为了避免在项目中直接引入 phpunit 相关代码包,使项目的 vendor 目录变得臃肿,这里采用全局安装方式安装了 phpunit 代码包。 composer global require phpunit/phpunit=5.0.* 安装完成
  • 如何修改 PhpStorm 預設的 Class Template?
    如何修改 PhpStorm 預設的 Class Template?
    當使用 PhpStorm 建立 class 時,預設會產生 Created by PhpStorm 的註解,並包含 作者 、 日期 、 時間 等資訊,有的人喜歡,有的人不喜歡,若你不希望每次建立 class 時都有這個檔頭,可以自行修改;除此之外,在 PHP 7 為了讓強行別檢查發揮作用,我們會在
    10-07 PhpStormPHP
  • Mac OS X下PhpStorm+MAMP PRO+Xdebug+FireFox集成开发和断点调试环境配置
    Mac OS X下PhpStorm+MAMP PRO+Xdebug+FireFox集
    一、环境及软件1、macbook pro2、Phpstorm3、MAMP PRO4、FireFox二、环境搭建1、PhpStorm导入项目下载PhpStorm并安装,网上随便找个注册码即可破解,安装后打开界面选择ToolBar → VCS → Checkout from Version Control → Git,填写Git Repository URL,选
  • 远程连接MySQL以及PHPStorm远程开发你的php项目
    远程连接MySQL以及PHPStorm远程开发你的php项目
    在上一篇博文中介绍了如何在完整地搭建LAMP环境。其中提到了新建一个可以在任意IP地址远程连接MySQL的用户,今天这篇博文就详细介绍下如何在你的电脑上远程连接mysql,并且介绍如何用phpstorm来远程开发你的php项目。 我的开发环境是MAC,所以我这篇博文里面
点击排行