1. 程式人生 > >.NET Core TDD 前傳: 編寫易於測試的程式碼 -- 單一職責

.NET Core TDD 前傳: 編寫易於測試的程式碼 -- 單一職責

第1篇: 講述了如何創造"縫".  "縫"(seam)是需要知道的概念.

本文是第5篇, 也是最後一篇, 介紹的是單一職責

類做了太多的工作

例子, 某軟體公司, 原有專案開發, 測試, 售前, 售後, 財務等員工. 後來由於公司沒錢, 裁掉了測試, 讓開發兼職; 過了段時間, 又裁掉了需求和售後, 還是由你這個開發來兼職; 再過了段時間, 又裁掉了財務和售前, 還是由你來兼職.

某天上班之後, 你剛想寫程式碼, 就接到了客戶來電, 說鍵盤不好用, 讓你去給除錯一下. 花了1個小時從客戶那裡除錯回來又剛想寫點程式碼, 某客戶說發票沒給, 你又去快遞發票. 回來之後又想寫程式碼, 又有客戶來電話諮詢你公司的XXX管理系統, 經過半個小時的講解, 客戶沒興趣. 這時已經到了中午, 你卻發現你的本職工作一點都做.

在現實世界中, 給某個員工賦與很多衝突的角色或職責是很不明智的.

在軟體開發裡也是這樣的, 在為一個類賦予太多的職責會引出很多維護和測試的問題.

單一職責

單一職責是面向物件軟體設計的準則之一, 它說的是: "一個類只能因為一個原因去改變".

這就是說我們應該增加 因為相同原因而做出改變的東西 的內聚性, 而降低 由於不同原因而做出改變的東西 的耦合性.

這句話通常被描述為: "一個類或一個方法只應該做一件事情, 並且要把它做好".

如果一個類有了太多的職責, 那麼職責間的互動就會埋藏於類裡, 這樣做就很難一次修改一個職責. 對於測試來說, 這些互動之間也沒有明顯的"縫隙".

依賴項的構建工作並不是目標類本身的職責, 這項工作應該和類本身的職責分開. 所以我們會使用依賴注入配置好的物件. 我們應該對類進行抽取, 讓其成為單一職責的類.

引起的問題

如果一個類有多個職責, 那麼在測試上它會有以下問題:

  • 如果一個類/方法有太多的功能, 那麼針對它的測試就會特別多, 很容易讓人難於理解也很難維護.
  • 測試的設定也會更加的麻煩. 
  • 由於有多個原因去修改該類, 那麼它的測試類/方法就會修改的更加頻繁.

危險訊號

什麼樣的類/方法會違反單一職責呢?

  • 如果你在描述該類功能的時候用到了"和", "或", "還", "並且"等詞.
  • 類或者方法的程式碼很多.
  • 注入了太多的依賴項.
  • 一個類改變的太頻繁了也可能意味著這個類的職責可能不止一個.

解決方案

如果一個類有很多職責, 那麼可以這樣做:

  • 識別出類裡面各個獨立的職責.
  • 給每個職責貼上標籤.
  • 解耦, 把其它功能抽取到單獨的類, 最後保證每個類都是單一職責.

例子

舉一個很簡單的典型例子:

這個類, 有4個依賴項, 不算特別多, 但是也不少. 它的名字在這裡就是它的描述, 裡面包含了"或"的意思. 在它的方法引數裡, 有一個標識, 像這樣會改變方法的高階行為的標識, 通常就意味著該方法會有不止一個職責. 而方法體裡面, 我們可以看到它確實有兩個職責, 分別是傳送郵件和打電話給客戶.

優化後

經過識別, 抽取後, 該類應該分成下面兩個類:

EmailCommand:

CallCommand:

這個系列的帖子就到這了.

下面開始介紹TDD.

相關推薦

.NET Core TDD : 編寫易於測試的代碼 -- 縫

廠商 關鍵字 com omap 註入 大堆 解決 而是 不知道 有時候不是我們不想做單元測試, 而是這代碼寫的實在是沒法測試.... 舉個例子, 如果一輛汽車在產出後沒完成測試, 那麽沒人敢去駕駛它. 代碼也是一樣的, 如果項目未能進行該做的測試, 那麽客戶就不敢去使用它

.NET Core TDD : 編寫易於測試的代碼 -- 構建對象

rep 文章 建立 ini 代碼 ali 請求 uid 依賴項 該系列第1篇: 講述了如何創造"縫". "縫"(seam)是需要知道的概念. 本文是第2篇, 介紹的是如何避免在構建對象時寫出不易測試的代碼. 本文的概念性內容大部分都來自Misko Hevery的這篇博客

.NET Core TDD : 編寫易於測試程式碼 -- 構建物件

該系列第1篇: 講述了如何創造"縫".  "縫"(seam)是需要知道的概念. 本文是第2篇, 介紹的是如何避免在構建物件時寫出不易測試的程式碼. 本文的概念性內容大部分都來自Misko Hevery的這篇部落格文章. 構建 還是用上文裡汽車的例子. 通常情況下, 我們是先去建造汽車, 組裝好汽車後,

.NET Core TDD : 編寫易於測試程式碼 -- 縫

有時候不是我們不想做單元測試, 而是這程式碼寫的實在是沒法測試.... 舉個例子, 如果一輛汽車在產出後沒完成測試, 那麼沒人敢去駕駛它. 程式碼也是一樣的, 如果專案未能進行該做的測試, 那麼客戶就不敢去使用它, 即使使用了也會遇到“車禍”.  為什麼要測試/測試的好處 它可以儘早發現bug,

.NET Core TDD : 編寫易於測試程式碼 -- 單一職責

第1篇: 講述了如何創造"縫".  "縫"(seam)是需要知道的概念. 本文是第5篇, 也是最後一篇, 介紹的是單一職責 類做了太多的工作 例子, 某軟體公司, 原有專案開發, 測試, 售前, 售後, 財務等員工. 後來由於公司沒錢, 裁掉了測試, 讓開發兼職; 過了段時間, 又裁掉了

.NET Core TDD : 編寫易於測試程式碼 -- 全域性狀態

第1篇: 講述了如何創造"縫".  "縫"(seam)是需要知道的概念. 本文是第4篇, 將介紹全域性狀態引起的問題. 全域性狀態 全域性狀態, 也可以叫做應用程式狀態, 它是一組變數, 這些變數維護著應用程式的高階狀態. 在程式裡, 全域性狀態可能都存放在一個全域性狀態物件裡, 例如AS

.NET Core TDD : 編寫易於測試程式碼 -- 依賴項

第1篇: 講述了如何創造"縫".  "縫"(seam)是需要知道的概念. 本文是第3篇, 講述依賴項和迪米特法則. 迪米特法則 (Law of Demeter) 還是使用建造汽車的例子. 生產汽車的時候需要輪胎, 組裝時需要什麼型號的輪胎, 就請求該型號的輪胎, 然後相關人員會從庫房把該型號的輪

.NET Core TDD OA 信用盤平臺搭建: 編寫易於測試的代碼構建對象

建造者 五個 包括 值類型 bject 方法 之前 關系 服務 聯系方式:QQ:2747044651 網址http://zhengtuwl.com常情況下, 我們是先去建造汽車, 組裝好汽車後, 我們再去駕駛它. 軟件開發也類似, 我們應該把對象構造完畢之後, 再去用它.

使用Bitbucket Pipeline進行.Net Core項目的自動構建、測試和部署

net yml cimage 參考 www 模板 -c 免費 clas 1. 引言 首先,Bitbucket提供支持Mercurial和Git版本控制系統的網絡托管服務。簡單來說,它類似於GitHub,不同之處在於它支持個人免費創建私有項目倉庫。除此之外,Bitbucke

輕松掌握VS Code開發.Net Core及創建Xunit單元測試

blog logs 寫文章 編譯 分享 單獨 etc 2.0 ren 前言 本篇文章主要還是介紹使用 VS Code 進行.Net Core開發和常用 CLI命令的使用,至於為啥要用VS Code ,因為它是真的是好看又好用 :) ,哈哈,主要還是為了跨平臺開發做準備。 開

學習 ASP.NET Core 2.1:集成測試中使用 WebApplicationFactory

UNC enc sta 測試 修改 構造 creat -a msdn WebApplicationFactory 是 ASP.NET Core 2.1 新特性 MVC functional test infrastructure 中帶來的新東東,它封裝了 TestServe

ASP.NET Core 入門教程 5、ASP.NET Core MVC 檢視值入門

一、前言 1、本教程主要內容 ASP.NET Core MVC 檢視引擎(Razor)簡介 ASP.NET Core MVC 檢視(Razor)ViewData使用示例 ASP.NET Core MVC 檢視(Razor)ViewBag使用示例 ASP.NET Core NVC 檢視(Razor)強型別傳值

ASP NET Core檔案上與下載 多種上方式

                                                                                                    前言前段時間專案上線,實在太忙,最近終於開始可以研究研究ASP.NET Core了.打算寫個系列,但是還沒想好

ASP.NET Core檔案上與下載(多種上方式)

前言前段時間專案上線,實在太忙,最近終於開始可以研究研究ASP.NET Core了.打算寫個系列

.Net Core 檔案上與下載

參考連結: 遇到的問題: 按 參考1 中測試,下載檔案檔名總是變成方法名(DownloadFile),並且沒有副檔名,儲存後改副檔名可正常檢視。 參考 連結3 測試無效,未解決下載問題。 參考 連結2,問題解決。 程式碼實現如下: 檔案上傳 [

.NET CORE與Spring Boot編寫控制檯程式應有的優雅姿勢

本文分別說明.NET CORE與Spring Boot 編寫控制檯程式應有的“正確”方法,以便.NET程式設計師、JAVA程式設計師可以相互學習與加深瞭解,注意本文只介紹用法,不會刻意強調哪種語言或哪種框架寫的控制檯程式要好。 本文所說的編寫控制檯程式應有的“正

.NetCore技術研究-.NET Core遷移的準備工作

前段時間遷移.NET Core做了大量的試水和評估,今天整理一下分享給大家。大致有以下幾個部分: 1. .NET Core的由來 2. 為什麼要遷移.NET Core 3. .NET Core3.X主要特性 4. .NET Standard和.NET Core 5. .NET Core Roadma

asp.net core 使用 TestServer 來做整合測試

# asp.net core 使用 TestServer 來做整合測試 ## Intro 之前我的專案裡的整合測試是隨機一個埠,每次都真實的啟動一個 WebServer,之前也有看到過微軟文件上 `TestServer` 的介紹,當時沒仔細看過以為差不多就沒用,一直是啟動了一個真正的 WebServer

如何編寫單元測試程式碼

                                         如何編寫

如何編寫Junit測試程式碼

package com.snt.aaa.config.service.impl; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans