日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单一职责原则(SRP)

發(fā)布時間:2025/4/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单一职责原则(SRP) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
單一職責原則(Single Pesponsibility Principle, SRP) 單一職責有兩個含義: 一個是避免相同的職責分散到不同的類中, 別一個是避免一個類承擔太多職責 為什么要遵守SRP呢? (1)可以減少類之間的耦合 如果減少類之間的耦合,當需求變化時,只修改一個類,從而也就隔離了變化;如果一個類有多個不同職責,它們耦合在一起,當一個職責發(fā)生變化時,可能會影響到其他職責。 (2)提高類的復用性 修改電腦比修理電視機簡單多了。主要原因就在于電視機各個部件之間的耦合性太高,而電腦則不同,電腦的內(nèi)存、硬盤、聲卡、網(wǎng)卡、鍵盤燈等部件都可以很容易地單獨拆卸和組裝。某個部件壞了,換上新的即可。上面的例子就體現(xiàn)了單一職責的優(yōu)勢。由于使用了單一職責,使得‘組件’可以方便地‘拆卸’和‘組裝’。 不遵守SRP會影響對類的復用性。當只需要用該類的某一個職責時,由于它和其他的職責耦合在一起,也就很難分離出。 遵守SRP在實際代碼開發(fā)中有沒有什么應用?有的。以數(shù)據(jù)持久層為例,所謂的數(shù)據(jù)持久層主要指的是數(shù)據(jù)庫操作,當然,還包括緩存管理等。這時就需要數(shù)據(jù)持久層支持多種數(shù)據(jù)庫。應該怎么做?定義多個數(shù)據(jù)庫操作類?想法已經(jīng)很接近了,再進一步,就是使用工廠模式。 工廠模式(Faction)允許你在代碼執(zhí)行時實例化對象。它之所以被稱為工廠模式是因為它負責‘生產(chǎn)對象’。以數(shù)據(jù)庫為例,工廠需要的就是根據(jù)不同的參數(shù),生成不同的實例化對象。最簡單的工廠就是根據(jù)傳入的類型名實例化對象,如傳入MySQL,就調(diào)用MySQL類并實例化,如果是SQLite,則調(diào)用 SQLite的類并實例化,甚至還可以處理TXT、Execl等‘類數(shù)據(jù)庫’。 工廠類也就是這樣的一個類,它只負責生產(chǎn)對象,而不負責對象的具體內(nèi)容。 以下是示例 定義一個適配器的接口 interface Db_Adpater {/*** 數(shù)據(jù)庫連接* @param $config 數(shù)據(jù)庫配置* @return mixed resource*/public function connect($config);/*** 執(zhí)行數(shù)據(jù)庫查詢* @param $query 數(shù)據(jù)庫查詢的SQL字符串* @param $handle 連接對象* @return mixed*/public function query($query,$handle); } 定義一個實現(xiàn)了DB_Adpater接口的MySQL數(shù)據(jù)庫操作類 class Db_Adapter_Mysql implements Db_Adpater {private $_dbLink; //數(shù)據(jù)庫連接字符串標識/*** 數(shù)據(jù)庫連接函數(shù)* @param $config 數(shù)據(jù)庫配置* @return resource* @throws Db_Exception*/public function connect($config){if($this->_dbLink = @mysql_connect($config->host . (empty($config->port) ? '' : ':' . $config->prot) ,$config->user, $config->password, true)){if(@mysql_select_db($config->database, $this->_dbLink)){if($config->charset){mysql_query("SET NAME '{$config->charset}'", $this->_dbLink);}return $this->_dbLink;}}throw new Db_Exception(@mysql_error($this->_dbLink));}/*** 執(zhí)行數(shù)據(jù)庫查詢* @param $query 數(shù)據(jù)庫查詢SQL字符串* @param $handle 連接對象* @return resource*/public function query($query,$handle){if($resource = @mysql_query($query,$handle))return $resource;} } 定義一個實現(xiàn)了DB_Adpater接口的SQLite數(shù)據(jù)庫操作類 class Db_Adapter_sqlite implements Db_Adpater {private $_dbLink; //數(shù)據(jù)庫連接字符串標識public function connect($config){if($this->_dbLink = sqlite_open($config->file, 0666, $error)){return $this->_dbLink;}throw new Db_Exception($error);}public function query($query, $handle){if($resource = @sqlite_query($query,$handle)){return $resource;}} }

現(xiàn)在如果需要一個數(shù)據(jù)庫操作的方法怎么做,只需定義一個工廠類,根據(jù)傳入不同的生成需要的類即可

class sqlFactory {public static function factory($type){if(include_once 'Drivers/' . $type . '.php'){$classname = 'Db_Adapter_'.$type;return new $classname;}elsethrow new Exception('Driver not found');} } 調(diào)用時,就可以這么寫 $db = sqlFactory::factory('MySQL'); $db = sqlFactory::factory('SQLite'); 我們把創(chuàng)建數(shù)據(jù)庫連接這塊程序單獨拿出來,程序中的CURD就不用關心什么數(shù)據(jù)庫了,只要按照規(guī)范使用對應的方法即可。 工廠方法讓具體的對象解脫出來,使其不再依賴具體的類,而是抽象。 設計模式里面的命令模式也是SRP的體現(xiàn),命令模式分離“命令的請求者”和“命令的實現(xiàn)者”方面的職責。舉一個很好理解的例子,就是你去餐館訂餐吃飯,餐館存在顧客、服務員、廚師三個角色。作為顧客,你要列出菜單,傳給服務員,由服務員通知廚師去實現(xiàn)。作為服務員,只需要調(diào)用準備飯菜這個方法(對廚師喊“該炒菜了”),廚師聽到要炒菜的請求,就立即去做飯。在這里,命令的請求和實現(xiàn)就完成了解耦。 模擬這個過程,首先定義廚師角色,廚師進行實際做飯、燒湯的工作。 以下是示例 /*** 廚師類,命令接受者與執(zhí)行者* Class cook*/ class cook {public function meal(){echo '番茄炒雞蛋',PHP_EOL;}public function drink(){echo '紫菜蛋花湯',PHP_EOL;}public function ok(){echo '完畢',PHP_EOL;} } //然后是命令接口 interface Command {public function execute(); }

輪到服務員出場,服務員是命令的傳送者,通常你到飯館吃飯都是叫服務員吧,不能直接叫廚師,一般都是叫“服務員,給我來盤番茄炒西紅柿”。所以,服務員是顧客和廚師之間的命令溝通都。

class MealCommand implements Command {private $cook;//綁定命令接受者public function __construct(cook $cook){$this->cook = $cook;}public function execute(){$this->cook->meal();//把消息傳給廚師,讓廚師做飯,下同} } class DrinkCommand implements Command {private $cook;//綁定命令接受者public function __construct(cook $cook){$this->cook = $cook;}public function execute(){$this->cook->drink();} } 現(xiàn)在顧客可以按照菜單叫服務員了 class cookControl {private $mealcommand;private $drinkcommand;//將命令發(fā)送者綁定以命令接收器上面來public function addCommand(Command $mealcommand, Command $drinkcommand){$this->mealcommand = $mealcommand;$this->drinkcommand = $drinkcommand;}public function callmeal(){$this->mealcommand->execute();}public function calldrink(){$this->drinkcommand->execute();} } 好了,現(xiàn)在完成整個過程 $control = new cookControl; $cook = new cook; $mealcommand = new MealCommand($cook); $drinkcommand = new DrinkCommand($cook); $control->addCommand($mealcommand,$drinkcommand); $control->callmeal(); $control->calldrink(); 從上面的例子可以看出,原來設計模式并非純理論的東西,而是來源于實際生活,就連普通的餐館老板都懂設計模式這門看似高深的學問。其實,在經(jīng)濟和管理活動中對流程的優(yōu)化就是對各種設計模式的摸索和實踐。所以,設計模式并非計算機編程中的專利。事實上,設計模式的起源并不是計算機,而是源于建筑學。 在設計模式方面,不僅以上這兩種體現(xiàn)了SRP,還有別的(比如代理模式)也體現(xiàn)了SRP。SRP不只是對類設計有意義,對以模塊、子系統(tǒng)為單位的系統(tǒng)架構設計同樣有意義。 模塊、子系統(tǒng)也應該僅有一個引起它變化的原因,如MVC所倡導的各個層之間的相互分離就是SRP在系統(tǒng)總體設計中的應用。 SRP是最簡單的原則之一,也是最難做好的原則之一。我們會很自然地將職責連接在一起。找到并且分離這些職責是軟件設計需要達到的目的 一些簡單的應用遵循的做法如下: 根據(jù)業(yè)務流程,把業(yè)務對象提煉出來。如果業(yè)務的流程的鏈路太復雜,就把這個業(yè)務對象分離為多個單一業(yè)務對象。當業(yè)務鏈標準化后,對業(yè)務對象的內(nèi)部情況做進一步處理,把第一次標準化視為最高層抽象,第二次視為次高層抽象,以此類推,直到“恰如其分”的設計層次 職責的分類需要注意。有業(yè)務職責,還要有脫離業(yè)務的抽象職責,從認識業(yè)務到抽象算法是一個層層遞進的過程。就好比命令模式中的顧客,服務員和廚師的職責,作為老板(即設計師)的你需要規(guī)劃好各自的職責范圍,即要防止越俎代庖,也要防止互相推諉。

轉載于:https://www.cnblogs.com/chenqionghe/p/4749915.html

總結

以上是生活随笔為你收集整理的单一职责原则(SRP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天综合av | 国产伦精品一区二区三区四区 | 欧美在线播放一区二区 | 久久久88 | 波多野结衣视频在线播放 | 免费看操片 | 国产精品久久久久无码av | 综合五月 | 黄色aaa毛片 | 日本天堂免费a | 99视频在线精品免费观看2 | 97毛片 | 久久免费视频一区 | www视频在线免费观看 | 久久疯狂做爰流白浆xx | 最新91视频 | 日本精品一区二区三区在线观看 | 国产精品亚洲一区 | 亚洲天堂2015 | av色资源 | 庆余年三 | 一级黄色片网址 | 高潮毛片7777777毛片 | 奇米网久久| 国产嫩草影院久久久久 | 98久久久| 国产日韩精品在线观看 | av日韩国产 | 99久久久久久 | 成人网站在线进入爽爽爽 | 欧美一级日韩一级 | 嫩草视频在线观看 | 成人一级视频在线观看 | 久久综合色婷婷 | 国产精品亚洲视频 | 日本网站在线播放 | 影音先锋久久 | 超碰蜜桃| 韩国bj大尺度vip福利网站 | 欲求不满的岳中文字幕 | 亚洲精品乱码久久久久久黑人 | 国产精品中文在线 | 黄色片在线免费观看 | 蜜桃91丨九色丨蝌蚪91桃色 | 韩国三级hd中文字幕 | 高潮疯狂过瘾粗话对白 | 日韩一级特黄 | 冈本视频在线观看 | 郑艳丽三级| 亚洲人成久久 | 打开免费观看视频在线播放 | 天天色天天色天天色 | 日本不卡在线视频 | 91成人在线观看喷潮 | 热热久 | 国产精品乱码一区二区视频 | 欧美亚洲国产另类 | 中国18videosex极品 | www.欧美国产 | 精品国产乱码久久久久久牛牛 | 二区欧美| 少妇闺蜜换浪荡h肉辣文 | 日韩久久av| 亚洲一区精品视频在线观看 | 免费的污网站 | www黄色片 | 99久久伊人 | 亚洲精品无码久久 | 亚洲不卡视频在线 | 91aaaa| 少妇av一区 | 国产精品久久久精品三级 | 日韩av一| 久草视频在线免费播放 | 欧美日韩视频在线播放 | 国产欧美日本在线 | www操操操 | 99成人| 一区精品二区国产 | 国产99自拍 | 成人亚洲欧美 | 欧美成a | 欧美a在线看 | 国产主播喷水 | 日韩一区二区在线观看 | 久久网国产| 国产成人免费网站 | 日韩在线视频中文字幕 | 精品国产乱码一区二 | 国产视频在线观看视频 | 精品人伦一区二区三区蜜桃网站 | av激情影院 | www色亚洲 | av永久在线 | 国产成人精品一区二区在线观看 | 国产高清片 | 久久伊人操| 精品久久久久久久久久久aⅴ | 性高湖久久久久久久久aaaaa |