[新手開發記錄] 測試通過之後進行重構

CS33發表於2020-05-28

我準備開發一個名校公開課的漢化資料下載和討論版,功能就是站長髮布資訊和資料下載連結,使用者可以在下面討論,並且可以生成各種平臺的分享方式分享出去。這一系列文章就記錄這一過程。當然博文功能也是必不可少的。

重構

重構的意思是調整程式碼的結構,使得其結構更加合理,更加易於維護,減少不必要的程式碼重複,把合適的程式碼放在合適的位置實現,而這個過程中,整個應用的功能表現是不會有任何變化的。
由於我們有了測試,所以我們重構過程中可以通過測試來確保我們並沒有破壞應用的功能。
簡單的開發過程和重構案例:

  1. 13-PDO簡介-《php7 基礎課程》 - Laracasts 視訊教程
  2. 14-PDO重構-《php7 基礎課程》 - Laracasts 視訊教程

控制器

現在我們在測試的兩個路由看起來如下:

Route::post('/courses', function(){

    App\Course::create(request(['title', 'description']));

});

Route::get('/courses', function(){

    $courses = App\Course::all();

    return view('courses.index', compact('courses'));

});

通過閉包實現了服務後臺的資料處理,我們現在想建立一個控制器,這樣模型(Model)、檢視(View)、控制器(Control)就分開了,也就是 MVC 的含義。
參考:

  1. 5-分離PHP邏輯和檢視 -《php7 基礎課程》 - Laracasts 視訊教程
  2. 23-控制器(Controller)類的重構-《php7 基礎課程》 - Laracasts 視訊教程

我們新建一個 CoursesController 控制器:

php artisan make:controller CoursesController

開啟以後,我們給它新增兩個方法,把原本路由閉包中的程式碼遷移到這兩個方法中:

    public function index()
    {
        $courses = Course::all();

        return view('courses.index', compact('courses'));
    }

    public function store()
    {
        Course::create(request(['title', 'description']));        
    }

記得在控制器頭部匯入模型檔案:

use App\Course;

然後路由就修改成如下,將資料處理的功能分包給了控制器:

Route::post('/courses', 'CoursesController@store');

Route::get('/courses', 'CoursesController@index');

不出意外,再次測試,仍然是通過測試,這是一個成功的重構。

新的測試

現在我們可以看到,CoursesController 中的 store() 方法,在成功儲存資料之後,沒有任何操作,而現實中,我們希望能夠跳轉到某個頁面,比如跳轉到 index 頁面。
我們把測試其中一行從這樣:

$this->post('/courses', $attributes);

改成這樣:

$this->post('/courses', $attributes)->assertRedirect('/courses');

然後繼續測試,顯然會報錯,它期待一個跳轉,但是沒有。
所以我們繼續在控制器的 store() 方法中修改,新增跳轉邏輯:

    public function store()
    {
        Course::create(request(['title', 'description']));

        return redirect('/courses');
    }

再執行測試,又一次全部通過。

檢視修改

如果你記得,我的檢視現在是很簡單的:

<!DOCTYPE html>
<html>
<head>
    <title>Courses</title>
</head>
<body>
    <h1>Courses</h1>

    <ul>
        @foreach($courses as $course)
        <li>{{ $course->title }}</li>
        @endforeach
    </ul>
</body>
</html>

我也需要對檢視進行一定的修改,這裡就不展開了。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章