单一指责原则(Single Responsibility Principle) SRP
生活随笔
收集整理的這篇文章主要介紹了
单一指责原则(Single Responsibility Principle) SRP
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
using System;
using System.Collections.Generic;
using System.Text;namespace SingleResponsibilityPrinciple
{//單一指責(zé)原則(Single Responsibility Principle) SRP//There should never be more than one reason for a class to change.//有且只有一個(gè)原因引起類(lèi)的變更。class Program{//使用場(chǎng)景static void Main(string[] args){//職責(zé)單一適用于接口,類(lèi),方法。//讓我們來(lái)先看接口是如何體現(xiàn)職責(zé)單一的。//我們都知道自從IPHONE使用USB_Type_C接口后,許多廠(chǎng)家也真先恐后的加入了使用該接口的行列。//新MacBook的USB_Type_C接口能夠傳輸數(shù)據(jù)、進(jìn)行充電也可以作為視頻輸出端口鏈接外部顯示設(shè)備。//很明顯,違反了職責(zé)單一的原則!接口包含的三個(gè)功能根本毫不相關(guān),如果用戶(hù)同時(shí)要充電,要傳輸數(shù)據(jù),要接顯示器,怎么辦?而蘋(píng)果為了減輕MacBook的厚度和重量,為此做了權(quán)衡。//這是產(chǎn)品設(shè)計(jì)上的取舍,你也不能說(shuō)不對(duì),各有利弊,對(duì)于軟件開(kāi)發(fā)來(lái)說(shuō),也是一樣的。//例如模擬用戶(hù)使用USB_Type_C接口給手機(jī)充電。Iphone6 iphone = new Iphone6();XiaoMiM5 xiaomi = new XiaoMiM5();Charger_C(iphone);Charger_C(xiaomi);//而如今閃充技術(shù)現(xiàn)在已經(jīng)不是什么新聞了,我們假設(shè)Iphone等不住了要升級(jí)充電功能到閃充,不然用戶(hù)不買(mǎi)賬啊。//想想會(huì)發(fā)生什么事情?USB_Type_C有3個(gè)原因(充電,數(shù)據(jù)傳輸,顯示)會(huì)引起類(lèi)的變更,由于iphone實(shí)現(xiàn)了USB_Type_C接口,想要升級(jí),就肯定先要USB_Type_C接口聲明閃充功能。//這個(gè)時(shí)候小米和其他使用了USB_Type_C的涉及到充電的廠(chǎng)商不干了啊,USB_Type_C升級(jí)閃充,我們也要跟著變了啊(子類(lèi)必須實(shí)現(xiàn)接口聲明方法,由于只是內(nèi)部充電方法改變,接口沒(méi)變,所以傳輸和顯示相關(guān)設(shè)備廠(chǎng)商不用改變,充電設(shè)備廠(chǎng)商需要適配新的方法),增加了成本和風(fēng)險(xiǎn),價(jià)格不發(fā)燒了呀,用戶(hù)不買(mǎi)賬啊。//什么?你說(shuō)新建一個(gè)Flash_USB_Type_C接口?讓蘋(píng)果自己玩去?傳輸和顯示功能沒(méi)變。就因?yàn)殚W充而新增一個(gè)新的接口Flash_USB_Type_C,那以前蘋(píng)果涉及到USB_Type_C接口的相關(guān)代碼不是全部要適配新的Flash_USB_Type_C接口?//而且你還要叫其他iphone輔助設(shè)備廠(chǎng)家來(lái)適配新接口(包括傳輸和顯示相關(guān)設(shè)備廠(chǎng)商,因?yàn)榻涌谝呀?jīng)變了,但其實(shí)內(nèi)部的傳輸與顯示方法并沒(méi)改變,造成不同接口,聲明了實(shí)際相同的功能,變復(fù)雜了),蘋(píng)果也不干了(雖然以前蘋(píng)果產(chǎn)品的接口都是特立獨(dú)行的……)。//撕逼大戰(zhàn)從此開(kāi)始,誰(shuí)叫你們當(dāng)初選擇跟風(fēng)使用USB_Type_C接口的,說(shuō)好的職責(zé)單一呢?魅族和華為表示毫無(wú)壓力,因?yàn)樗謩e實(shí)現(xiàn)了不同功能的接口。MeiZu mz = new MeiZu();Charger_N(mz);HuaWei hw = new HuaWei();Charger_N(hw);//魅族想升級(jí)就升級(jí),IFlashCharge閃充是單獨(dú)的充電功能模塊,并且業(yè)界已經(jīng)成熟,魅族替換掉該充電接口即可,華為當(dāng)然不受影響,依然用著以前的充電技術(shù)ICharger~FlashMeiZu fmz = new FlashMeiZu();FlashCharger(fmz);//傳輸,顯示技術(shù)的更新?lián)Q代,原理也一樣的,如果不符合職責(zé)單一,大家一起折騰去吧。所以接口的職責(zé)單一,主要體現(xiàn)在變化上。//對(duì)于方法的職責(zé)單一,也很好理解,例如一個(gè)用戶(hù)撥打電話(huà)的場(chǎng)景Iphone6 ip6 = new Iphone6();//請(qǐng)按F12進(jìn)入函數(shù)看詳情ip6.CallPeople("1307779****");//符合職責(zé)單一方法,你也許會(huì)想,SRPCallPeople方法本身好像職責(zé)就不單一啊,用了那么多方法?這個(gè)需要在不同層面考慮的。//SRPCallPeople已經(jīng)是業(yè)務(wù)邏輯處理函數(shù)方法,并只不是功能了,肯定會(huì)調(diào)用其他方法實(shí)現(xiàn)某種業(yè)務(wù)。而方法的職責(zé)單一,主要體現(xiàn)在功能上。ip6.SRPCallPeople("1307779****");//最后對(duì)于類(lèi)的職責(zé)單一,很大程度上與方法類(lèi)似。//例如各種類(lèi)庫(kù),每個(gè)類(lèi)庫(kù)都實(shí)現(xiàn)自己的相關(guān)功能(見(jiàn)項(xiàng)目-引用),如果不按照職責(zé)單一,不用命名空間區(qū)分,它們完全可以在一個(gè)類(lèi)文件中存在啊,簡(jiǎn)直就是代碼混沌世界!//所以一個(gè)類(lèi)(大到模塊,小到方法)承擔(dān)的職責(zé)越多,它被復(fù)用的可能性就越小,而且一個(gè)類(lèi)承擔(dān)的職責(zé)過(guò)多,就相當(dāng)于將這些職責(zé)耦合在一起,當(dāng)其中一個(gè)職責(zé)變化時(shí),可能會(huì)影響其他職責(zé)的運(yùn)作//因此要將這些職責(zé)進(jìn)行分離,將不同的職責(zé)封裝在不同的類(lèi)中,即將不同的變化原因封裝在不同的類(lèi)中,如果多個(gè)職責(zé)總是同時(shí)發(fā)生改變則可將它們封裝在同一類(lèi)中。//職責(zé)單一,也就是讓我們多多考慮高內(nèi)聚、低耦合
}//PS.面向接口編程,只關(guān)注行為規(guī)范,管他對(duì)象類(lèi)是誰(shuí)。低耦合//我是一個(gè)普通的充電器static void Charger_N(ICharge device){device.Charge();}//我是一個(gè)支持USB_Type_C的充電器~(Flash_USB_Type_C這種接口的充電器還不存在)static void Charger_C(IUSB_Type_C device){device.Charge();}//充電5分鐘,通話(huà)2小時(shí)(閃充充電器已經(jīng)成熟,很多廠(chǎng)家都開(kāi)始生產(chǎn))static void FlashCharger(IFlashCharge device){device.FlashCharge();}}public class Iphone6 : IUSB_Type_C{//打電話(huà)給某人public void CallPeople(string number){//發(fā)現(xiàn)問(wèn)題木有?撥打電話(huà)的方法全部在這個(gè)函數(shù)實(shí)現(xiàn)了,說(shuō)好的職責(zé)單一呢?//想想看,代碼長(zhǎng)度很長(zhǎng)的時(shí)候,看起來(lái)是不是很暈,你很可能不知道這些不同的代碼到底是干什么用的,很容易引入BUG。//并且,檢查電話(huà),撥打電話(huà),顯示運(yùn)營(yíng)商,這些功能并不是只在這里實(shí)現(xiàn)。//所以最好提取出來(lái),做到“方法“的單一,不僅好理解,其他地方也可以調(diào)用,減少冗余,復(fù)用代碼,提高效率~Console.WriteLine("檢查電話(huà)號(hào)碼是否合法");if (number.Length == 11){Console.WriteLine("撥打電話(huà)");}if (number.Substring(0, 3).Contains("130")){Console.WriteLine("顯示電話(huà)號(hào)碼運(yùn)營(yíng)商,中國(guó)聯(lián)通");}}//符合職責(zé)單一的撥打電話(huà)方法喲public void SRPCallPeople(string number){CheckNumber(number);Call(number);ShowOperator(number);}private bool CheckNumber(string number){Console.WriteLine("單一檢查電話(huà)號(hào)碼是否合法");if (number.Length > 11){return true;}else{return false;}}private void Call(string number){Console.WriteLine("單一撥打電話(huà)");}private void ShowOperator(string number){if (number.Substring(0, 3).Contains("130")){Console.WriteLine("單一顯示電話(huà)號(hào)碼運(yùn)營(yíng)商,中國(guó)聯(lián)通");}}public void Hangup(){Console.WriteLine("通話(huà)結(jié)束");}public void TranData(){throw new NotImplementedException();}public void Charge(){Console.WriteLine("Iphone6充電ing");}public void Display(){throw new NotImplementedException();}}public class XiaoMiM5 : IUSB_Type_C{public void TranData(){throw new NotImplementedException();}public void Charge(){Console.WriteLine("小米M5充電ing");}public void Display(){throw new NotImplementedException();}}public class MeiZu : ITranData, ICharge, IDisplay{public void TranData(){throw new NotImplementedException();}public void Charge(){Console.WriteLine("魅族充電ing");}public void Display(){throw new NotImplementedException();}}public class HuaWei : ITranData, ICharge, IDisplay{public void TranData(){throw new NotImplementedException();}public void Charge(){Console.WriteLine("華為充電ing");}public void Display(){throw new NotImplementedException();}}public class FlashMeiZu : IFlashCharge, ITranData, IDisplay{public void TranData(){throw new NotImplementedException();}public void Display(){throw new NotImplementedException();}public void FlashCharge(){Console.WriteLine("小米閃充,充電5分鐘,通話(huà)2小時(shí)!~");}}public interface IUSB_Type_C{void TranData();void Charge();void Display();}public interface ITranData{void TranData();}public interface ICharge{void Charge();}public interface IFlashCharge{void FlashCharge();}public interface IDisplay{void Display();}
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/leestar54/p/5476402.html
總結(jié)
以上是生活随笔為你收集整理的单一指责原则(Single Responsibility Principle) SRP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [界面开发新秀]免费的AYUI,开发36
- 下一篇: 危险的jsonp