亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP面向對象五大原則之單一職責原則(SRP)詳解

2024-05-05 00:03:04
字體:
來源:轉載
供稿:網友

本文實例講述了PHP面向對象五大原則之單一職責原則(SRP)。分享給大家供大家參考,具體如下:

單一職責原則(Single Pesponsibility Principle, SRP)

單一職責有兩個含義: 一個是避免相同的職責分散到不同的類中, 別一個是避免一個類承擔太多職責

為什么要遵守SRP呢?

(1)可以減少類之間的耦合

如果減少類之間的耦合,當需求變化時,只修改一個類,從而也就隔離了變化;如果一個類有多個不同職責,它們耦合在一起,當一個職責發生變化時,可能會影響到其他職責。

(2)提高類的復用性

修改電腦比修理電視機簡單多了。主要原因就在于電視機各個部件之間的耦合性太高,而電腦則不同,電腦的內存、硬盤、聲卡、網卡、鍵盤燈等部件都可以很容易地單獨拆卸和組裝。某個部件壞了,換上新的即可。上面的例子就體現了單一職責的優勢。由于使用了單一職責,使得‘組件'可以方便地‘拆卸'和‘組裝'。

不遵守SRP會影響對類的復用性。當只需要用該類的某一個職責時,由于它和其他的職責耦合在一起,也就很難分離出。

遵守SRP在實際代碼開發中有沒有什么應用?有的。以數據持久層為例,所謂的數據持久層主要指的是數據庫操作,當然,還包括緩存管理等。這時就需要數據持久層支持多種數據庫。應該怎么做?定義多個數據庫操作類?想法已經很接近了,再進一步,就是使用工廠模式。

工廠模式(Faction)允許你在代碼執行時實例化對象。它之所以被稱為工廠模式是因為它負責‘生產對象'。以數據庫為例,工廠需要的就是根據不同的參數,生成不同的實例化對象。最簡單的工廠就是根據傳入的類型名實例化對象,如傳入MySQL,就調用MySQL類并實例化,如果是SQLite,則調用 SQLite的類并實例化,甚至還可以處理TXT、Execl等‘類數據庫'。

工廠類也就是這樣的一個類,它只負責生產對象,而不負責對象的具體內容。

以下是示例

定義一個適配器的接口

interface Db_Adpater{  /**   * 數據庫連接   * @param $config 數據庫配置   * @return mixed resource   */  public function connect($config);  /**   * 執行數據庫查詢   * @param $query 數據庫查詢的SQL字符串   * @param $handle 連接對象   * @return mixed   */  public function query($query,$handle);}

定義一個實現了DB_Adpater接口的MySQL數據庫操作類

class Db_Adapter_Mysql implements Db_Adpater{  private $_dbLink;  //數據庫連接字符串標識  /**   * 數據庫連接函數   * @param $config 數據庫配置   * @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));  }  /**   * 執行數據庫查詢   * @param $query 數據庫查詢SQL字符串   * @param $handle 連接對象   * @return resource   */  public function query($query,$handle)  {    if($resource = @mysql_query($query,$handle))      return $resource;  }}

定義一個實現了DB_Adpater接口的SQLite數據庫操作類

class Db_Adapter_sqlite implements Db_Adpater{  private $_dbLink;  //數據庫連接字符串標識  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;    }  }}

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

class sqlFactory{  public static function factory($type)  {    if(include_once 'Drivers/' . $type . '.php')    {      $classname = 'Db_Adapter_'.$type;      return new $classname;    }    else      throw new Exception('Driver not found');  }}

調用時,就可以這么寫

$db = sqlFactory::factory('MySQL');$db = sqlFactory::factory('SQLite');

我們把創建數據庫連接這塊程序單獨拿出來,程序中的CURD就不用關心什么數據庫了,只要按照規范使用對應的方法即可。

工廠方法讓具體的對象解脫出來,使其不再依賴具體的類,而是抽象。

設計模式里面的命令模式也是SRP的體現,命令模式分離“命令的請求者”和“命令的實現者”方面的職責。舉一個很好理解的例子,就是你去餐館訂餐吃飯,餐館存在顧客、服務員、廚師三個角色。作為顧客,你要列出菜單,傳給服務員,由服務員通知廚師去實現。作為服務員,只需要調用準備飯菜這個方法(對廚師喊“該炒菜了”),廚師聽到要炒菜的請求,就立即去做飯。在這里,命令的請求和實現就完成了解耦。

模擬這個過程,首先定義廚師角色,廚師進行實際做飯、燒湯的工作。

以下是示例

/** * 廚師類,命令接受者與執行者 * 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();  }}

現在顧客可以按照菜單叫服務員了

class cookControl{  private $mealcommand;  private $drinkcommand;  //將命令發送者綁定以命令接收器上面來  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();  }}

好了,現在完成整個過程

$control = new cookControl;$cook = new cook;$mealcommand = new MealCommand($cook);$drinkcommand = new DrinkCommand($cook);$control->addCommand($mealcommand,$drinkcommand);$control->callmeal();$control->calldrink();

從上面的例子可以看出,原來設計模式并非純理論的東西,而是來源于實際生活,就連普通的餐館老板都懂設計模式這門看似高深的學問。其實,在經濟和管理活動中對流程的優化就是對各種設計模式的摸索和實踐。所以,設計模式并非計算機編程中的專利。事實上,設計模式的起源并不是計算機,而是源于建筑學。

在設計模式方面,不僅以上這兩種體現了SRP,還有別的(比如代理模式)也體現了SRP。SRP不只是對類設計有意義,對以模塊、子系統為單位的系統架構設計同樣有意義。

模塊、子系統也應該僅有一個引起它變化的原因,如MVC所倡導的各個層之間的相互分離就是SRP在系統總體設計中的應用。

SRP是最簡單的原則之一,也是最難做好的原則之一。我們會很自然地將職責連接在一起。找到并且分離這些職責是軟件設計需要達到的目的

一些簡單的應用遵循的做法如下:

根據業務流程,把業務對象提煉出來。如果業務的流程的鏈路太復雜,就把這個業務對象分離為多個單一業務對象。當業務鏈標準化后,對業務對象的內部情況做進一步處理,把第一次標準化視為最高層抽象,第二次視為次高層抽象,以此類推,直到“恰如其分”的設計層次

職責的分類需要注意。有業務職責,還要有脫離業務的抽象職責,從認識業務到抽象算法是一個層層遞進的過程。就好比命令模式中的顧客,服務員和廚師的職責,作為老板(即設計師)的你需要規劃好各自的職責范圍,即要防止越俎代庖,也要防止互相推諉。

 

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线观看| 亚洲欧美日本伦理| 亚洲综合中文字幕68页| 精品av在线播放| 国产精品老女人精品视频| 在线观看日韩欧美| 91精品国产综合久久香蕉922| 国产成人福利网站| 2019中文字幕全在线观看| 国产成人欧美在线观看| 欧美肥臀大乳一区二区免费视频| 国产精品久久久久久久久久东京| 日本亚洲欧洲色α| 欧美激情极品视频| 国产精品露脸自拍| 亚洲奶大毛多的老太婆| 精品国产自在精品国产浪潮| 久久久久免费视频| 日韩国产欧美精品一区二区三区| 美女扒开尿口让男人操亚洲视频网站| 精品亚洲va在线va天堂资源站| 亚洲aⅴ男人的天堂在线观看| 成人免费看片视频| 91沈先生在线观看| 97色伦亚洲国产| 国产在线观看不卡| 亚洲专区在线视频| 久久成人av网站| 日本久久久久亚洲中字幕| 中文字幕综合在线| 国产精品高潮呻吟久久av黑人| 自拍偷拍亚洲欧美| 国产精品扒开腿爽爽爽视频| 国产激情久久久久| 亚洲精品视频播放| 538国产精品一区二区免费视频| 最近2019中文免费高清视频观看www99| 在线成人免费网站| 亚洲精品99久久久久中文字幕| 97国产精品视频| 国产丝袜一区二区| 亚洲成人精品久久久| 欧美富婆性猛交| 国内伊人久久久久久网站视频| 92福利视频午夜1000合集在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 久久91亚洲精品中文字幕| 91精品久久久久久久久| 欧美激情精品久久久久| 亚洲电影成人av99爱色| 精品视频在线播放| 国产91精品不卡视频| 国产精品一区二区性色av| 欧美性生交xxxxxdddd| 91高清视频免费| 亚洲欧美一区二区精品久久久| 国产精品久久国产精品99gif| 欧美一级视频一区二区| 国产欧美日韩精品丝袜高跟鞋| 亚洲尤物视频网| 欧美影院成年免费版| 欧美极品第一页| 欧美午夜视频一区二区| 欧美黄网免费在线观看| 精品久久久久久久久久| 国产999精品| 色老头一区二区三区| 久久久精品2019中文字幕神马| 国产极品jizzhd欧美| 欧美床上激情在线观看| 精品久久久久久久久久久久久| 日日骚av一区| 国产999视频| 91亚洲精品在线观看| 欧美在线视频免费播放| 乱亲女秽乱长久久久| 亚洲美女av电影| 久久夜色精品国产| 国产视频在线观看一区二区| 欧美激情一级欧美精品| 色综合视频网站| 大荫蒂欧美视频另类xxxx| 国内精品视频一区| 日韩精品极品视频免费观看| 欧美日韩ab片| 亚洲欧美国产一本综合首页| 国产精品久久久久久av| 国产精品久久久久9999| 最近2019中文字幕一页二页| 久久在线免费观看视频| 国产欧美精品xxxx另类| 欧美另类老女人| 亚洲精品720p| 国产精品日日做人人爱| 国产欧美日韩中文字幕| 国产日韩欧美黄色| 国产精品高清在线观看| 2025国产精品视频| 亚洲社区在线观看| 欧美性生交xxxxxdddd| 日韩男女性生活视频| 91在线中文字幕| 国产精品你懂得| 日韩欧美成人区| 欧美激情视频网| 久久久久久久久久久久久久久久久久av| 97在线视频观看| 日韩中文字幕国产精品| 日韩一区av在线| 欧美激情视频在线免费观看 欧美视频免费一| 日韩一级黄色av| 疯狂欧美牲乱大交777| 久久99热精品这里久久精品| 亚洲国产另类 国产精品国产免费| 欧美专区中文字幕| 一区二区三区高清国产| 欧美成人精品一区二区三区| 亚洲精品国精品久久99热一| 日韩成人在线网站| 国产精品久久久久久av下载红粉| 伊人久久久久久久久久| 日韩精品视频在线观看免费| 国产精品偷伦一区二区| 欧美激情中文字幕乱码免费| 91免费综合在线| 亚洲男人天堂九九视频| 97视频com| 中文字幕亚洲字幕| 在线播放日韩专区| 国产精品jvid在线观看蜜臀| 51精品国产黑色丝袜高跟鞋| 奇门遁甲1982国语版免费观看高清| 欧美成人手机在线| 亚洲人a成www在线影院| 久国内精品在线| 国产精品久久久久久五月尺| 国产精品一区久久| 欧美精品videos另类日本| 欧美性猛交xxxxx免费看| 日韩高清人体午夜| 国外日韩电影在线观看| 久热爱精品视频线路一| 欧美国产第二页| 国产成人精品免费视频| 国产精品热视频| 亚洲电影中文字幕| 中日韩美女免费视频网站在线观看| 欧美日韩xxx| 国产亚洲免费的视频看| 国产精品高潮呻吟久久av无限| 国产精品福利久久久| …久久精品99久久香蕉国产| 亚洲午夜av电影| 久久亚洲春色中文字幕| 欧美性猛交xxxx乱大交蜜桃| 日韩av手机在线看| 免费av在线一区| 欧美日韩国产一中文字不卡| 日韩欧美在线字幕| 国产亚洲成精品久久| 欧美精品激情视频| 欧美日韩中文字幕日韩欧美| 国产精品自产拍在线观看中文| 国产日韩在线免费|