欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > PHP面向?qū)ο笪宕笤瓌t之單一職責(zé)原則(SRP)詳解

PHP面向?qū)ο笪宕笤瓌t之單一職責(zé)原則(SRP)詳解

熱門標(biāo)簽:地圖標(biāo)注專員怎么樣 房產(chǎn)中介用的是什么外呼系統(tǒng) 上海做外呼線路的通信公司 遼寧ai電銷機(jī)器人價格 寧波外呼營銷系統(tǒng) 電話機(jī)器人銷售主要負(fù)責(zé)什么 四川保險智能外呼系統(tǒng)供應(yīng)商 長沙做地圖標(biāo)注公司 福建銀行智能外呼系統(tǒng)價格

本文實例講述了PHP面向?qū)ο笪宕笤瓌t之單一職責(zé)原則(SRP)。分享給大家供大家參考,具體如下:

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

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

為什么要遵守SRP呢?

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

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

(2)提高類的復(fù)用性

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

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

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

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

工廠類也就是這樣的一個類,它只負(fù)責(zé)生產(chǎn)對象,而不負(fù)責(zé)對象的具體內(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ù)庫連接字符串標(biāo)識
  /**
   * 數(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ù)庫連接字符串標(biāo)識
  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;
    }
    else
      throw new Exception('Driver not found');
  }
}

調(diào)用時,就可以這么寫

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

我們把創(chuàng)建數(shù)據(jù)庫連接這塊程序單獨(dú)拿出來,程序中的CURD就不用關(guān)心什么數(shù)據(jù)庫了,只要按照規(guī)范使用對應(yīng)的方法即可。

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

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

模擬這個過程,首先定義廚師角色,廚師進(jì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();
}

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

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)在顧客可以按照菜單叫服務(wù)員了

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();

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

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

模塊、子系統(tǒng)也應(yīng)該僅有一個引起它變化的原因,如MVC所倡導(dǎo)的各個層之間的相互分離就是SRP在系統(tǒng)總體設(shè)計中的應(yīng)用。

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

一些簡單的應(yīng)用遵循的做法如下:

根據(jù)業(yè)務(wù)流程,把業(yè)務(wù)對象提煉出來。如果業(yè)務(wù)的流程的鏈路太復(fù)雜,就把這個業(yè)務(wù)對象分離為多個單一業(yè)務(wù)對象。當(dāng)業(yè)務(wù)鏈標(biāo)準(zhǔn)化后,對業(yè)務(wù)對象的內(nèi)部情況做進(jìn)一步處理,把第一次標(biāo)準(zhǔn)化視為最高層抽象,第二次視為次高層抽象,以此類推,直到“恰如其分”的設(shè)計層次

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

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

您可能感興趣的文章:
  • PHP面向?qū)ο笪宕笤瓌t之里氏替換原則(LSP)詳解
  • 舉例解析Java的設(shè)計模式編程中里氏替換原則的意義
  • 詳解Java設(shè)計模式編程中的里氏替換原則
  • 深入理解JavaScript系列(8) S.O.L.I.D五大原則之里氏替換原則LSP
  • PHP面向?qū)ο笪宕笤瓌t之依賴倒置原則(DIP)詳解
  • PHP面向?qū)ο笪宕笤瓌t之接口隔離原則(ISP)詳解
  • PHP面向?qū)ο笪宕笤瓌t之開放-封閉原則(OCP)詳解
  • PHP基于面向?qū)ο髮崿F(xiàn)的留言本功能實例
  • PHP面向?qū)ο笾锸咸鎿Q原則簡單示例

標(biāo)簽:宜春 延安 澳門 常德 深圳 工商登記 宿遷 佛山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP面向?qū)ο笪宕笤瓌t之單一職責(zé)原則(SRP)詳解》,本文關(guān)鍵詞  PHP,面向,對象,五大,原則,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP面向?qū)ο笪宕笤瓌t之單一職責(zé)原則(SRP)詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP面向?qū)ο笪宕笤瓌t之單一職責(zé)原則(SRP)詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    天天看天天摸天天操| 亚洲人吸女人奶水| 日韩1区2区3区| 中文字幕一区二区三区乱码不卡| 日本妇女毛茸茸| 中文字幕在线不卡国产视频| 高清beeg欧美| 91香蕉一区二区三区在线观看| 久久精品网站免费观看| 狠狠色伊人亚洲综合成人| 国产精久久一区二区三区| 亚洲精品一区二区三区福利| 麻豆精品在线看| 国产特黄级aaaaa片免| 精品国产电影一区二区| 美美哒免费高清在线观看视频一区二区 | 精品三级在线看| 奇米四色…亚洲| 久久精品—区二区三区舞蹈| 久久久久久97三级| 国产精品1区2区3区在线观看| 成人信息集中地| 中文字幕制服丝袜一区二区三区| 不卡一区二区中文字幕| 欧美怡红院视频| 亚洲成人午夜电影| 免费看污黄网站在线观看| xfplay精品久久| 国产精品12区| 色先锋资源久久综合| 一区二区三区资源| 国产视频久久久久久| 欧美va日韩va| 国产精品99久久久久久宅男| 国产日韩欧美在线观看视频| 亚洲精品国产精华液| 白嫩情侣偷拍呻吟刺激| 精品91自产拍在线观看一区| 国产成人自拍高清视频在线免费播放| 神马久久精品综合| 一区二区日韩av| 中国av免费看| 国产欧美日韩卡一| 91免费国产在线观看| 制服丝袜亚洲网站| 国产综合色视频| 一本色道综合亚洲| 天天色综合天天| 四虎影视1304t| 一区二区三区在线视频免费观看| 国产美女视频免费观看下载软件| 久久久久久久综合狠狠综合| 不卡免费追剧大全电视剧网站| 欧美裸体一区二区三区| 久久国产综合精品| 91久久精品日日躁夜夜躁欧美| 日韩国产欧美在线观看| 成人精品一二三区| 一区二区三区中文字幕精品精品| 国产激情在线免费观看| 国产精品电影院| 亚洲观看黄色网| 国产精品国产三级国产三级人妇 | 婷婷六月综合亚洲| 乱老熟女一区二区三区| 亚洲韩国一区二区三区| avhd101老司机| 亚洲综合无码一区二区| 日本成人午夜影院| 亚洲综合自拍偷拍| 刘亦菲国产毛片bd| 亚洲成人av中文| 天天看片中文字幕| 日本视频一区二区| 一本一本久久a久久精品综合麻豆| 青青草国产成人av片免费| 2021亚洲天堂| 捆绑调教一区二区三区| 欧美性一级生活| 国产麻豆成人精品| 欧美一区二视频| 不卡的电视剧免费网站有什么| 日韩精品中文字幕一区二区三区| 99久久伊人网影院| 久久精品日韩一区二区三区| 国产伦精品一区二区免费| 国产精品久久久久久久久晋中 | 男人的天堂久久精品| 一本到不卡精品视频在线观看| 麻豆精品一区二区| 欧美日韩国产另类一区| 丁香一区二区三区| 337p日本欧洲亚洲大胆色噜噜| 无码人妻aⅴ一区二区三区玉蒲团| 中文字幕欧美激情| 国精产品一区二区三区| 亚洲国产精品视频| 一本一道久久a久久精品| 国产麻豆9l精品三级站| 欧美v日韩v国产v| 妖精视频一区二区| 亚洲精品成人精品456| 懂色av粉嫩av蜜臀av一区二区三区| 三级在线观看一区二区| 在线亚洲一区二区| 成人动漫一区二区在线| 国产偷国产偷亚洲高清人白洁| 久久久久久久久免费看无码| 亚洲专区一二三| 色狠狠桃花综合| 成人黄色在线看| 久久免费视频色| 成年人免费观看视频网站| 亚洲电影第三页| 欧美色中文字幕| 91在线一区二区三区| 亚洲欧洲一区二区三区| 欧美成人777| 高清beeg欧美| 国产精品久久影院| 亚洲最大的黄色网址| 成人网男人的天堂| 中文字幕乱码久久午夜不卡| 天天干天天操天天拍| 精品一区二区三区在线观看| 精品少妇一区二区三区日产乱码 | 亚洲美女视频在线| 色欲综合视频天天天| 不卡的av电影在线观看| 国产精品不卡在线观看| 四虎精品免费视频| 成人va在线观看| 亚洲人成小说网站色在线 | 国产一区二区三区在线观看精品 | 国产xxxx视频| 亚洲18女电影在线观看| 91麻豆精品国产综合久久久久久 | 精品一区二区三区在线视频| 久久综合久色欧美综合狠狠| 中文字幕 自拍| 国产酒店精品激情| 中文字幕+乱码+中文字幕一区| 5566中文字幕| av不卡免费在线观看| 亚洲精品ww久久久久久p站| 欧美日韩二区三区| 黄色性生活一级片| 久久精品国产网站| 国产日韩精品一区二区浪潮av | 欧美日韩国产成人在线91| 无码人妻一区二区三区在线| 日韩影院在线观看| 久久亚洲综合av| 特一级黄色录像| 原创真实夫妻啪啪av| 午夜国产精品一区| 2017欧美狠狠色| 暗呦丨小u女国产精品| 91色九色蝌蚪| 日本亚洲三级在线| 国产日韩精品一区二区浪潮av| 国产又爽又黄网站| 无码人妻精品一区二区三| 久久99精品久久久久久动态图| 欧美激情在线一区二区三区| 在线视频国内自拍亚洲视频| 国产一级免费片| 久久精品国产久精国产爱| 欧美国产日韩在线观看| 欧美三级在线视频| 谁有免费的黄色网址| 成人免费不卡视频| 五月天视频一区| 国产喷白浆一区二区三区| 日本福利一区二区| 女尊高h男高潮呻吟| 丁香婷婷综合色啪| 日韩国产高清在线| 国产精品色哟哟| 欧美乱妇23p| 久久精品国产亚洲AV成人婷婷| 91看片淫黄大片一级在线观看| 日本不卡的三区四区五区| 欧美国产欧美亚州国产日韩mv天天看完整| 日本丶国产丶欧美色综合| 国产特级黄色录像| 欧美体内she精高潮| 九九视频精品免费| 一区二区三区精品在线观看| 欧美精品一区二区三区四区| 日本高清无吗v一区| 日本少妇高潮喷水xxxxxxx| 99久久精品国产网站| 韩日精品视频一区| 亚洲第一av色| 国产精品无遮挡| 欧美电视剧免费全集观看| 色噜噜狠狠一区二区三区果冻| 国产一二三四五区| 国产伦理在线观看|