日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

單一職責到底是什么?十分鐘帶你掌握!

來源: 責編: 時間:2024-07-02 17:36:16 193觀看
導讀在日常開發工作中,經常會聽到有經驗的技術念叨xxx需要注意單一職責,那么,什么是單一職責?如何做才能保證職責單一?這篇文章幫你分析透。什么是單一職責?關于單一職責,看過很多版本的解釋,這里歸納最常見的三個版本:版本一:一個

在日常開發工作中,經常會聽到有經驗的技術念叨xxx需要注意單一職責,那么,什么是單一職責?如何做才能保證職責單一?這篇文章幫你分析透。i2h28資訊網——每日最新資訊28at.com

i2h28資訊網——每日最新資訊28at.com

什么是單一職責?

關于單一職責,看過很多版本的解釋,這里歸納最常見的三個版本:i2h28資訊網——每日最新資訊28at.com

  • 版本一:一個類只有一個引起變化的原因
  • 版本二:一個類都應該只負責一項職責
  • 版本三:一個類只能干一件事情

哪個版本的解釋比較合理呢?i2h28資訊網——每日最新資訊28at.com

單一職責原則,英文是:Single responsibility principle(SRP),是 Robert C. Martin提出的 SOLID原則中的一種,所以,我們先看看 作者對單一職責原則的描述,這里摘取了作者關于單一職責的原文:i2h28資訊網——每日最新資訊28at.com

The Single Responsibility Principle (SRP) states thateach software module should have one and only one reason to change.

原文翻譯為:單一職責原則指出,任何一個軟件模塊都應該有一個且只有一個修改的理由。i2h28資訊網——每日最新資訊28at.com

定義看起來很嚴謹,但似乎和現實是相沖突的,因為軟件設計本身就是一門關注長期變化的學問,變化是軟件中最常見不過的問題,在現實環境中,軟件系統為了滿足用戶和所有者的要求,勢必會作出各種修改,而系統的用戶或者所有者就是該設計原則所指的"被修改的原因"。i2h28資訊網——每日最新資訊28at.com

于是乎,作者又重新把單一職責描述為:i2h28資訊網——每日最新資訊28at.com

The single responsibility principle states that every moduleor class should have responsibility over a single part of the functionality provided by the software, and that responsibility should be entirely encapsulated by the class.

原文翻譯為:單一職責原則指出,每個模塊或類應該只負責軟件所提供功能的一部分,并且這個職責應該完全被該類封裝。i2h28資訊網——每日最新資訊28at.com

在這個定義中,每個模塊或者類只負責軟件的一部分功能,那這一部分是多少呢?這部分功能是否可以包含不同類型的行為呢?比如,電商中的訂單和物流都可以叫做電商的一部分功能,但是他們在業務意義上顯然是不同的領域,因此,該定義缺乏了定性。i2h28資訊網——每日最新資訊28at.com

于是乎,作者再次修改了單一職責的定義:i2h28資訊網——每日最新資訊28at.com

Each module should only be responsible to one actor.

原文翻譯為:任何一個軟件模塊都應該只對某一類行為者負責i2h28資訊網——每日最新資訊28at.com

這個定義,只要是能歸結成一類的行為,都可以屬于某個模塊的功能,這樣定義看起來更符合現實業務的語意。i2h28資訊網——每日最新資訊28at.com

軟件模塊是什么?

在上述單一職責幾個定義中都提到了軟件模塊,那么,軟件模塊到底是什么呢?i2h28資訊網——每日最新資訊28at.com

軟件模塊(Software Module)是指軟件系統中的一個獨立單元,它包含一組相關的功能和數據,這些模塊是通過封裝數據和功能來實現的,以便實現更高的代碼復用性、可維護性和可擴展性。通常具有以下特點:i2h28資訊網——每日最新資訊28at.com

  • 獨立性:模塊是相對獨立的代碼單元,可以單獨開發、測試和部署。模塊的獨立性提高了系統的靈活性,使得各個模塊可以獨立演化和更新,而不影響其他模塊。
  • 封裝性:模塊內部的數據和實現細節對外界隱藏,只通過公開的接口與其他模塊進行交互。封裝性提高了代碼的安全性和可維護性。
  • 職責單一:每個模塊通常只負責一組相關的功能,這有助于遵循單一職責原則,使得模塊更加易于理解和維護。
  • 可重用性:模塊設計得當,可以在不同的項目中重復使用,提高了開發效率和代碼質量。
  • 可替換性:模塊通過標準化的接口與外界交互,可以在不影響其他部分的前提下替換或更新某個模塊。

為了更好地說明軟件模塊,這里以一個電商系統為例,它可能包含以下幾個模塊:i2h28資訊網——每日最新資訊28at.com

(1) 用戶管理模塊:i2h28資訊網——每日最新資訊28at.com

  • 功能:處理用戶的注冊、登錄、個人信息管理等。
  • 接口:提供用戶注冊、登錄、信息更新等服務。

(2) 訂單管理模塊:i2h28資訊網——每日最新資訊28at.com

  • 功能:處理訂單的創建、更新、查詢等。
  • 接口:提供訂單創建、訂單狀態更新、訂單查詢等服務。

(3) 支付處理模塊:i2h28資訊網——每日最新資訊28at.com

  • 功能:處理訂單的支付、退款等。
  • 接口:提供支付請求、支付狀態查詢、退款等服務。

(4) 庫存管理模塊:i2h28資訊網——每日最新資訊28at.com

  • 功能:處理商品的庫存查詢、更新等。
  • 接口:提供庫存查詢、庫存更新等服務。

單一職責示例

為了更好的說明任何一個軟件模塊都應該只對某一類行為者負責這個定義,下面我們通過2個 Java反例來進行演示。i2h28資訊網——每日最新資訊28at.com

反例1

假設有一個 Employee員工類并且包含以下 3個方法:i2h28資訊網——每日最新資訊28at.com

public class Employee {   // calculatePay() 實現計算員工薪酬  public Money calculatePay();  // save() 將Employee對象管理的數據存儲到企業數據庫中  public void save();  // postEvent() 用于促銷活動發布  public void postEvent();}

剛看上去,這個類設計得還挺符合實際業務,員工有計算薪酬、保存數據、發布促銷等行為,但是這 3個方法對應三類不同的行為者,計算薪酬屬于財務的行為,保存數據屬于數據管理員的行為,發布促銷屬于銷售的行為。i2h28資訊網——每日最新資訊28at.com

因此,Employee類將三類行為耦合在一起,違反了單一職責原則。假如一個普通員工不小心調用了calculatePay()方法,把每個員工的薪酬計算成了實際工資的2位,那可想而知這是一個災難性的問題。i2h28資訊網——每日最新資訊28at.com

如果增加新需求,要求員工能夠導出報表,因此,需要在 Employee類中增加了一個新的方法,代碼如下:i2h28資訊網——每日最新資訊28at.com

// 導出報表void exportReport();

接著需求又一個一個增加,Employee類就得一次一次的變動,這會導致什么結果呢?i2h28資訊網——每日最新資訊28at.com

一方面,Employee類會不斷地膨脹;另一方面,可能業務需求完全不同,卻始終需要在同一個 Employee類上改動,合理嗎?i2h28資訊網——每日最新資訊28at.com

聯想一下你的日常開發,是否也有這樣的設計?把很多不同的行為都耦合到同一個類中,然后隨著業務的增加,該類急劇膨脹,最后無法維護。i2h28資訊網——每日最新資訊28at.com

該如何解決這種問題呢?i2h28資訊網——每日最新資訊28at.com

解決這個問題的方法有很多,特定的行為只能由特定的行為者來操作,因此,需要把 Employee類拆解成 3種行為者(財務、數據管理員、銷售),Employee類拆分之后的代碼如下:i2h28資訊網——每日最新資訊28at.com

// 財務行為public class FinanceStaff {  public Money calculatePay();}// 數據管理員行為public class TechnicalStaff {    public void save();}// 銷售行為public class OperatorStaff {    public String postEvent();}

反例2

假設需要開發一個電商系統,其中有一個 Order訂單類,負責處理訂單的創建、訂單的支付以及訂單的通知,代碼如下:i2h28資訊網——每日最新資訊28at.com

public class Order {    public void createOrder() {        // 訂單創建邏輯    }    public void processPayment() {        // 支付處理邏輯    }    public void sendNotification() {        // 發送通知邏輯    }}

在上述代碼中,Order類同時承擔了訂單創建、支付處理和通知發送的職責,違反了單一職責原則,因為一個類有多個引起變化的原因。i2h28資訊網——每日最新資訊28at.com

為了遵循SRP,我們需要將不同的職責分離到不同的類中,因此可以創建三個類:Order類負責訂單創建,PaymentProcessor類負責支付處理,NotificationService類負責通知發送,每個類都只承擔一個職責,從而遵循了單一職責原則。代碼如下:i2h28資訊網——每日最新資訊28at.com

public class Order {    public void createOrder() {        // 訂單創建邏輯    }}public class PaymentProcessor {    public void processPayment(Order order) {        // 支付處理邏輯    }}public class NotificationService {    public void sendNotification(Order order) {        // 發送通知邏輯    }}

上面2個示例代碼的拆分都遵從了原則:因相同原因而發生變化的事物聚集在一起,因不同原因而改變的事物分開。這就是單一職責的真正體現,也是定義內聚和耦合的一種方式。i2h28資訊網——每日最新資訊28at.com

總結

從作者 Robert C. Martin對單一職責的 3次定義變更,我們可以看出:i2h28資訊網——每日最新資訊28at.com

  • 單一職責原則本質上就是要理解分離關注點。
  • 單一職責原則可以應用于不同的層次,小到一個函數,大到一個系統。
  • 軟件設計也不可能一成不變。

回歸到實際的工作中,我們可以把一個系統模塊看作一個單一職責的行為者,比如:訂單系統只關注訂單相關的行為,交易系統只關注交易相關的行為,我們也可以把類作為一個單一職責的行為者,比如:訂單類,把訂單相關的 CRUD聚合在一起,支付類,把支付相關的信息聚合在一起。i2h28資訊網——每日最新資訊28at.com

因此,任何一個軟件模塊都應該只對某一類行為者負責這個定義才更適合單一職責。i2h28資訊網——每日最新資訊28at.com

最后,單一職責原則是面向對象設計的重要原則之一,它可以提高代碼的可維護性、可讀性和可擴展性,在日常開發中,遵循 SRP可以有效地降低類之間的耦合度,提高系統的穩定性和靈活性,從而寫出更高質量的代碼。i2h28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-98188-0.html單一職責到底是什么?十分鐘帶你掌握!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python一個非常實用的庫:Typer

下一篇: 一網打盡:12 個 find() 函數在 Python 中的創意實踐

標簽:
  • 熱門焦點
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享?,F在大家能見到最多的藍牙耳機
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • Temu起訴SHEIN,跨境電商戰事升級

    來源 | 伯虎財經(bohuFN)作者 | 陳平安日前據外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein“利用市場支配力量強迫服裝廠商與之簽訂獨家
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內,目前主要售賣美食相關的
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元“人在職場,應該選擇什么樣的著裝?”近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • 半導體需求下滑 三星電子DS業務部門今年營業虧損預計超10萬億韓元

    7月17日消息,據外媒報道,去年下半年開始的半導體需求下滑,影響到了三星電子、SK海力士、英特爾等諸多廠商,營收明顯下滑,部分廠商甚至出現了虧損。作為
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發搭載了聯發科天璣9200+旗艦
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩国产一区二区三区| 欧美在线日韩在线| 亚洲高清不卡在线观看| 亚洲国产二区| 一区二区三区欧美在线| 亚洲综合欧美日韩| 欧美一级久久久| 麻豆精品精品国产自在97香蕉| 欧美激情精品久久久久久变态| 欧美视频官网| 韩国精品一区二区三区| 亚洲欧洲久久| 亚洲婷婷在线| 久久久久五月天| 欧美激情精品久久久久久| 欧美三级电影一区| 韩国欧美一区| 一区二区三区高清不卡| 久久精品视频在线免费观看| 欧美精品www| 国产日韩欧美一区在线| 亚洲人www| 欧美怡红院视频| 欧美极品一区| 国产在线一区二区三区四区| 日韩一区二区高清| 久久精品首页| 欧美视频在线观看 亚洲欧| 国产一区二区中文| 亚洲午夜电影在线观看| 免费久久99精品国产自在现线| 国产精品毛片va一区二区三区| 亚洲国产成人久久综合| 香蕉成人啪国产精品视频综合网| 欧美激情一区在线| 黄色日韩网站| 亚洲一区二区在线观看视频| 欧美成人dvd在线视频| 国产欧美精品日韩精品| 一本久道久久综合婷婷鲸鱼| 国产欧美日韩精品一区| 尤物yw午夜国产精品视频明星| 亚洲天堂久久| 欧美精品成人在线| 伊人久久噜噜噜躁狠狠躁| 亚洲视频导航| 欧美黄色一区二区| 极品av少妇一区二区| 亚洲欧美日韩国产成人精品影院| 欧美精品久久久久a| 一区二区亚洲| 久久国产99| 国产欧美精品在线播放| 亚洲色无码播放| 欧美激情欧美狂野欧美精品| 尤妮丝一区二区裸体视频| 欧美有码在线视频| 国产精品久久久久免费a∨大胸 | 亚洲国产精品一区| 久久不射网站| 国产精品你懂的| 亚洲午夜av| 欧美日韩人人澡狠狠躁视频| 亚洲成人在线免费| 久久亚洲视频| 韩国免费一区| 久久天堂国产精品| 国内精品久久久久久| 欧美中文字幕久久| 国产欧美日韩视频| 亚洲欧美国产va在线影院| 欧美涩涩视频| 中文成人激情娱乐网| 免费黄网站欧美| 亚洲高清久久久| 久久米奇亚洲| 一区二区亚洲精品| 久久久久亚洲综合| 激情成人av在线| 久久在线免费视频| 亚洲黄色小视频| 欧美成人一区二免费视频软件| 在线免费日韩片| 另类图片国产| 亚洲人体大胆视频| 欧美日韩国产在线看| 日韩亚洲视频在线| 欧美色综合网| 亚洲欧美变态国产另类| 国产精品视频不卡| 欧美一区二区三区精品| 国产视频欧美| 久久婷婷丁香| 91久久精品美女| 欧美日本韩国一区| 亚洲一二三四久久| 国产欧美日韩一区二区三区在线| 欧美在线视频一区二区| 伊人精品成人久久综合软件| 免费观看一级特黄欧美大片| 日韩视频永久免费观看| 国产精品免费视频观看| 久久av红桃一区二区小说| 在线精品高清中文字幕| 欧美日韩高清在线观看| 亚洲一区在线免费观看| 国产亚洲一区在线播放| 老鸭窝91久久精品色噜噜导演| 亚洲欧洲精品成人久久奇米网 | 麻豆av一区二区三区久久| 亚洲黑丝在线| 欧美深夜影院| 欧美在线3区| 亚洲高清三级视频| 欧美日韩一区二区在线视频| 午夜精品影院| 亚洲成色777777在线观看影院| 欧美精品一区在线发布| 香蕉尹人综合在线观看| 亚洲国产成人porn| 欧美日韩一区二区在线| 欧美亚洲日本一区| 亚洲国产精品久久| 国产精品对白刺激久久久| 欧美伊人久久久久久午夜久久久久| 一区二区在线观看视频| 欧美日韩国产经典色站一区二区三区| 亚洲女与黑人做爰| 亚洲高清电影| 国产精品久久波多野结衣| 久久久久网站| 日韩一区二区高清| 国产一区二区日韩| 欧美美女福利视频| 欧美中文字幕精品| 99精品久久久| 狠狠色狠狠色综合日日91app| 欧美日韩不卡视频| 久久精品国产亚洲aⅴ| 99re这里只有精品6| 国产综合久久| 欧美日韩一区二区在线视频| 久久嫩草精品久久久精品| 亚洲视频欧洲视频| 亚洲高清一区二区三区| 国产精品一区二区欧美| 欧美成人免费网| 欧美一区二区三区久久精品茉莉花| 亚洲日韩欧美视频一区| 国产一区二区三区在线观看视频| 欧美日韩人人澡狠狠躁视频| 裸体素人女欧美日韩| 香蕉久久一区二区不卡无毒影院| 亚洲欧洲日本专区| 国产午夜精品麻豆| 欧美日韩在线精品一区二区三区| 久久婷婷久久一区二区三区| 亚洲男人av电影| 亚洲精品美女在线| 黄色精品免费| 国产欧美亚洲日本| 欧美色偷偷大香| 欧美成人在线免费视频| 久久精品五月| 性做久久久久久久久| 宅男在线国产精品| 最新国产乱人伦偷精品免费网站| 国产视频精品xxxx| 国产精品青草综合久久久久99 | 蜜桃av久久久亚洲精品| 久久本道综合色狠狠五月| 欧美系列亚洲系列| 久久综合色天天久久综合图片| 午夜欧美精品久久久久久久| 99国产精品国产精品久久| 亚洲经典三级| 在线观看欧美激情| 黄色成人在线网址| 国产网站欧美日韩免费精品在线观看| 欧美视频免费在线| 欧美日本三区| 欧美精品久久久久久久久老牛影院| 久久久久久色| 久久电影一区| 欧美在线精品免播放器视频| 亚洲免费一在线| 亚洲在线视频观看| 亚洲天堂免费在线观看视频| 一区二区欧美在线观看| 一区二区三区国产精华| 艳女tv在线观看国产一区| 日韩视频三区| 一区二区三区精品视频| 99精品国产在热久久下载| 99精品视频一区二区三区| 亚洲精品女人| 亚洲精品中文字幕女同| 亚洲另类在线一区| 99精品免费视频| 一区二区三区日韩精品视频| 一区二区三区**美女毛片| 亚洲视频中文字幕| 午夜精品福利一区二区三区av| 欧美亚洲一区三区|