iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
自我挑戰組

初階面試常見題目彙整系列 第 7

初階面試常見題目回答-SOLID(SRP)-鐵人賽第七日

  • 分享至 

  • xImage
  •  

SOLID到底是硬在哪裡
為什麼往往聽到這個解釋不清楚就直接畫個大叉叉,。

SOLID 是面向物件設計和程式設計中的五個基本原則簡稱合併的
不過在進入SOLID之前,筆者要稍微提一下,
SOLID,是物件導向程式設計基本原則沒錯,也非常重要,
但不要把它當成務必要遵守的要點。

這邊就來依序介紹SOLID,
S: Single responsibility principle(SRP):單一職責原則(SRP)
"There should never be more than one reason for a class to change"
直翻:一個類別的改變不應該有多個原因

一個類別應只有一個原因去改變,關於這個要特別注意的一點,是單一職責而非單一一件事情。
舉個明確的例子給各位看看。

在這邊帶入筆者所寫得程式,
從最初Controller進入。

public class GetCarInfomationController : ControllerBase
{
    [HttpPost]
    public IActionResult Post(GetCarInfomationRequestModel model)
    {
        var returnData = model.GetCarInfomation();
        return Ok(new { message = "Car information received successfully." });
    }
}

可以看到,
在一開始的設計中GetCarInfomationRequestModel 這個Model,
有處理兩件事情,
一個是去接收傳入的值,
另一個是串建了取值的function,
這時候類別就有兩種可能產生改變,

接收HTTP POST請求處理 與 獲取車輛信息的相關邏輯,
這部分是可能有處理兩件職責,
那這個就有可能是違反SRP的狀況。

同時再重複說一次,
單一職責不代表是只做一件事情,
就像我這邊的單一職責是取得汽車詳細資訊,
而不是呼叫供應商取的資訊,
而且該單一職責的改動不會影響到不屬於該職責的其他程式。

假如有新寫一個Model,
而該職責是取得車子資料,
那麼如果獲取了車子執照或車子顏色,
都是屬於統一的職責,
不會違反SRP

GetCarDataModel model = new GetCarDataModel();
var getCarLicense = model.GetCarLicense();
var getCarColor = model.getCarColor();

那麼要處理一項業務,
必須要有很多職責才能處理要怎麼辦?
筆者在這邊舉個例子:

假設汽車訂單成立假設需要兩件事情
一是汽車詳細資訊
二是付款信息

那麼這兩項職責,
筆者更改其中任一項都不會影響到另一項,
所以這一個事情底下就會有兩個單一職責所組成,
而其中任一個職責有所更正都不會互相影響,
那麼這就不會是違反SRP。

所以單一職責不代表只能做一件事情,並且一項業務當中可能是透過多種單一職責組合而成的。

除此之外單一職責原則的核心思想是將不同的職責分開,
也就是不承擔多個不同的職責,
該理念在各個地方都可以進行,
就像筆者常常會使用到屬性上,

就以這個屬性來說,

public string Gasoline { get; set; },

單位是String,
再設計的時候,
就有可能被設定很多職責,
例如:
"97汽油100KL"
"最高可負擔50KL汽油"
"100"

可以看到,這個屬性可能會被分配,
單位、型號、最高油量等等的職責。

這時候筆者就會希望這個屬性,
可以負責這個業務,
但不要一個屬性分擔多個職責,

以筆者所述,
會組成如下的Model

public class GasolineModel
{
	public string 型號 { get; set; }
	public string 最高油量 { get; set; }
	public string 單位 { get; set; }
}

---- 歷史
Robert C. Martin in his 2000 paper
http://staff.cs.utu.fi/~jounsmed/doos_06/material/DesignPrinciplesAndPatterns.pdf
SOLID在早期被論文中提及,可以看到SRP最初沒像其他功能被明確提及,後由Michael Feathers整理,
是不是有更早期的筆者不太確定,各位有興趣再繼續追吧!


上一篇
初階面試常見題目回答-介面-鐵人賽第六日
下一篇
初階面試常見題目回答-SOLID(OCP)-鐵人賽第八日
系列文
初階面試常見題目彙整30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言