欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學堂PHP在線視頻講解PHP面向對象五大原則之單一職責原則(SRP)

2018-04-26 14:12:34 1438瀏覽

前面我們已經說過PHP的其他原則,今天和小伙伴分享一下扣丁學堂PHP在線視頻講解的另外一種原則:PHP面向對象五大原則之單一職責原則(SRP),想要了解的小伙伴繼續(xù)往下看吧。



扣丁學堂PHP在線視頻講解PHP面向對象五大原則之單一職責原則(SRP)



單一職責原則(SinglePesponsibilityPrinciple,SRP)


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

為什么要遵守SRP?


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

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



(2)提高類的復用性

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


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


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


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



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

以下是示例

定義一個適配器的接口


interfaceDb_Adpater
{
/**
*數(shù)據(jù)庫連接
*@param$config數(shù)據(jù)庫配置
*@returnmixedresource
*/
publicfunctionconnect($config);
/**
*執(zhí)行數(shù)據(jù)庫查詢
*@param$query數(shù)據(jù)庫查詢的SQL字符串
*@param$handle連接對象
*@returnmixed
*/
publicfunctionquery($query,$handle);
}


定義一個實現(xiàn)了DB_Adpater接口的MySQL數(shù)據(jù)庫操作類


classDb_Adapter_MysqlimplementsDb_Adpater

{

private$_dbLink;//數(shù)據(jù)庫連接字符串標識

/**

*數(shù)據(jù)庫連接函數(shù)

*@param$config數(shù)據(jù)庫配置

*@returnresource

*@throwsDb_Exception

*/

publicfunctionconnect($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("SETNAME'{$config->charset}'",$this->_dbLink);

}

return$this->_dbLink;

}

}

thrownewDb_Exception(@mysql_error($this->_dbLink));

}

/**

*執(zhí)行數(shù)據(jù)庫查詢

*@param$query數(shù)據(jù)庫查詢SQL字符串

*@param$handle連接對象

*@returnresource

*/

publicfunctionquery($query,$handle)

{

if($resource=@mysql_query($query,$handle))

return$resource;

}

}


定義一個實現(xiàn)了DB_Adpater接口的SQLite數(shù)據(jù)庫操作類


classDb_Adapter_sqliteimplementsDb_Adpater
{
private$_dbLink;//數(shù)據(jù)庫連接字符串標識
publicfunctionconnect($config)
{
if($this->_dbLink=sqlite_open($config->file,0666,$error))
{
return$this->_dbLink;
}
thrownewDb_Exception($error);
}
publicfunctionquery($query,$handle)
{
if($resource=@sqlite_query($query,$handle))
{
return$resource;
}
}
}


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


classsqlFactory
{
publicstaticfunctionfactory($type)
{
if(include_once'Drivers/'.$type.'.php')
{
$classname='Db_Adapter_'.$type;
returnnew$classname;
}
else
thrownewException('Drivernotfound');
}
}


調用時,就可以這么寫


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


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


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


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


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

以下是示例


/**
*廚師類,命令接受者與執(zhí)行者
*Classcook
*/
classcook
{
publicfunctionmeal()
{
echo'番茄炒雞蛋',PHP_EOL;
}
publicfunctiondrink()
{
echo'紫菜蛋花湯',PHP_EOL;
}
publicfunctionok()
{
echo'完畢',PHP_EOL;
}
}
//然后是命令接口
interfaceCommand
{
publicfunctionexecute();
}


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


classMealCommandimplementsCommand
{
private$cook;
//綁定命令接受者
publicfunction__construct(cook$cook)
{
$this->cook=$cook;
}
publicfunctionexecute()
{
$this->cook->meal();//把消息傳給廚師,讓廚師做飯,下同
}
}
classDrinkCommandimplementsCommand
{
private$cook;
//綁定命令接受者
publicfunction__construct(cook$cook)
{
$this->cook=$cook;
}
publicfunctionexecute()
{
$this->cook->drink();
}
}


現(xiàn)在顧客可以按照菜單叫服務員了


classcookControl
{
private$mealcommand;
private$drinkcommand;
//將命令發(fā)送者綁定以命令接收器上面來
publicfunctionaddCommand(Command$mealcommand,Command$drinkcommand)
{
$this->mealcommand=$mealcommand;
$this->drinkcommand=$drinkcommand;
}
publicfunctioncallmeal()
{
$this->mealcommand->execute();
}
publicfunctioncalldrink()
{
$this->drinkcommand->execute();
}
}


好了,現(xiàn)在完成整個過程


$control=newcookControl;
$cook=newcook;
$mealcommand=newMealCommand($cook);
$drinkcommand=newDrinkCommand($cook);
$control->addCommand($mealcommand,$drinkcommand);
$control->callmeal();
$control->calldrink();


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



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



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



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



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


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

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



以上就是扣丁學堂PHP在線學習講解的PHP面向對象五大原則之單一職責原則(SRP),希望對小伙伴們有所幫助,喜歡PHP開發(fā)想要學習的小伙伴一定要選擇專業(yè)的PHP培訓機構進行學習,想要快速學好PHP開發(fā)的小伙伴可以選擇扣丁學堂PHP在線學習班,扣丁學堂不僅有專業(yè)的老師和與時俱進的課程體系,還有大量的PHP在線視頻供學員觀看學習哦??鄱W堂PHP技術交流群:374332265。



 

關注微信公眾號獲取更多學習資料



查看更多關于“php培訓資訊”的相關文章>>


標簽: 扣丁學堂PHP在線視頻講解PHP面向對象五大原則之單一職責原則(SRP) PHP培訓 PHP在線學習 PHP視頻教程

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部