聊聊 Service 命名與設(shè)計(jì)
Service 類(lèi)到底是什么含義?我相信如果碰到一個(gè)叫 SomethingService 的類(lèi),沒(méi)法馬上明白它到底起什么作用。

說(shuō)實(shí)話(huà),我們都很困惑。
經(jīng)過(guò)多年的專(zhuān)業(yè)開(kāi)發(fā),在大量的代碼中游走,有一點(diǎn)是顯而易見(jiàn)的,開(kāi)發(fā)人員不太擅長(zhǎng)給事物命名。
作為一個(gè)菜鳥(niǎo)開(kāi)發(fā)者,我知道當(dāng)看到 SomeService 或 WhateverManager 類(lèi),或者是 WhatevsManagerService 時(shí),你都會(huì)不知所措或疑惑不解。
Class 命名就像工作頭銜
BD?實(shí)際是一個(gè)銷(xiāo)售人員。Social Media 專(zhuān)家?可能是 3 周學(xué)會(huì)如何在 Instagram 上發(fā)布貓咪照片。軟件工程師?實(shí)際上是堆砌代碼的碼農(nóng)。
工作頭銜和工作角色有時(shí)候不掛鉤,我們更喜歡把頭銜弄得比角色更花哨。
Class 命名也是如此。
服務(wù)(service)類(lèi)
任何以 Service 為后綴的代碼基本上都是一個(gè)邏輯垃圾箱。任何添加到程序中的新功能,最后總是以某種服務(wù)類(lèi)的方式來(lái)實(shí)現(xiàn)。
一個(gè)服務(wù)類(lèi)需要大量的構(gòu)造函數(shù)參數(shù),使得測(cè)試起來(lái)非常麻煩。要測(cè)試一個(gè)新方法 GetUserCount()?可能需要 mock 7 個(gè)完全不相關(guān)的類(lèi)來(lái)實(shí)例化這個(gè)服務(wù)類(lèi)。
如果 GetUserCount() 只依賴(lài)于服務(wù)類(lèi)中的一個(gè)構(gòu)造函數(shù)參數(shù),那么最好把它移到自己的類(lèi)中。這樣一來(lái),你就有一個(gè)非常簡(jiǎn)單的類(lèi),只有一個(gè)構(gòu)造函數(shù)參數(shù)。
當(dāng)然,單獨(dú)的 GetUserCount 類(lèi)看起來(lái)不是那么酷,但至少你知道它到底是做什么的。
測(cè)試變得輕而易舉。
Manager 類(lèi)
你很可能見(jiàn)過(guò)類(lèi)似 UserManager 這樣的類(lèi),它管理用戶(hù)。
像服務(wù)類(lèi)一樣,它們也是邏輯垃圾箱。但是有一點(diǎn)區(qū)別。如果說(shuō)服務(wù)類(lèi)是一個(gè)普通的垃圾箱,那么 Manager 類(lèi)就像一個(gè)紙板垃圾箱,它更特殊一點(diǎn)。
你會(huì)面臨和服務(wù)類(lèi)一樣的處理單元測(cè)試的問(wèn)題。在做最微小的操作之前,你需要 mock 一大堆東西。
Util 類(lèi)和 Helper 類(lèi)
"我們不知道把這些代碼塞在哪里好,所以就弄了一個(gè) Util 類(lèi)"。
這些都是煩人的東西。關(guān)于這一點(diǎn),沒(méi)有什么好說(shuō)的了。
怎么破?
很簡(jiǎn)單。給出與職責(zé)相匹配的合適名稱(chēng)。把一個(gè)類(lèi)命名為GetUser,并且只有一個(gè)方法,這并不丟人。實(shí)現(xiàn)也簡(jiǎn)單,每個(gè)人都知道它是做什么的。容易進(jìn)行單元測(cè)試。
停止代碼膨脹,簡(jiǎn)化這些類(lèi)。比如,構(gòu)建只有一個(gè)方法的類(lèi)。
關(guān)于作者:
Nicklas Millard 是一家快速發(fā)展中的銀行擔(dān)任軟件工程師,負(fù)責(zé)構(gòu)建關(guān)鍵任務(wù)的金融服務(wù)基礎(chǔ)設(shè)施。
此前,他曾是 Big4 高級(jí)技術(shù)顧問(wèn),為商業(yè)客戶(hù)和政府機(jī)構(gòu)開(kāi)發(fā)軟件。
他的 LinkedIn:https://www.linkedin.com/in/nicklasmillard/
英文原文:
https://medium.com/datadriveninvestor/the-true-meaning-of-service-and-manager-class-names-d09a08731fd9
END
往期資源 需要請(qǐng)自取
喜歡就"在看"唄^_^

