成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳細介紹開閉原則(OCP)

開發 后端
開閉原則的意思是軟件實體應該對擴展開發,對修改關閉。本文詳細介紹的是就是面向對象的開閉原則,希望對你有幫助,一起來看。

開閉原則的意思是軟件實體應該對擴展開發,對修改關閉(Software entities should be open for extension,but closed for modification)。實現開閉原則的途徑是抽象,將需要擴展的部分抽象出來,并留出擴展接口。打個比方,比如電腦機箱上有usb的插口,這些插口就是可擴展的部分,我們可以在這些usb插口上插上鼠標,鍵盤,U盤,還可以插上網銀的U盾等等。電腦硬件上對于usb接口的這個設計就是一個符合開閉原則的設計。

為什么要遵循開閉原則呢?因為開閉原則可以使軟件系統更容易復用,更容易維護,當某個軟件實體,不適合了,我可以重新做另外一種實現,并將現有的實現替換掉。比如說統計個稅的算法發生了一些變化,我可以在不改變原有代碼的情況下,重新實現一個算法將原有的算法替換下來。比如說殺毒軟件,在出現一種新的病毒時,開發出一個查殺這種病毒的新模塊,可以只開發更新這個查殺模塊,而不需要改變原有系統的內容。

開閉原則這么好,如何實現符合開閉原則的軟件系統呢?答案是抽象,將可能發生變化的功能點進行抽象,并留出變化的接口。設計模式中很多模式都可以幫我們實現開閉原則,個人的理解設計模式是對抽象用法的一種總結。

其實我們在項目已經為開閉原則做了一些工作了,比如說我們進行三層開發,將數據層抽象出來,并定義個數據處理的接口,我們可以通過新開發一個數據層把剛開始將數據存放到SQL Server中的實現,修改為將數據存放到my sql中的實現;我們將業務邏輯中的代碼從UI代碼中分離出來,這就為我們復用業務邏輯的代碼提供了可能,我們可以開發一個專門為手機使用的UI層出來,當用戶用手機訪問我們的系統時,智能的切換到手機UI層的代碼上去執行。

實現開閉原則的例子,其實我都不好意思自己舉例子了,因為我正在使用Office 2007寫這篇博客,在Office2007的快捷工具欄中就有一項是加載項,就是說Office 2007能將插件加載進來使用,如下圖所示:

圖一

Snagit在word中添加了一個插件,這種插件技術就是一種遵循OCP的實現;再說我們整天使用的Visual Studio 它的可擴展程度更高,可以開發很多類型的工具對他進行擴展。

為了本文的完整性,我還是厚著臉皮,用重構的方式舉一個遵循開閉原則的微不足道的實現。

下面的舉例實現的場景是個稅的計算:我的***個版本是這樣子的

  1. class Program   
  2. {   
  3. static void Main(string[] args)   
  4. {   
  5. float salary = 10000;   
  6. Console.WriteLine("收入是{0}的人應繳個稅是{1},",salary, GetTax(salary));   
  7. }   
  8. static float GetTax(float salary)   
  9. {   
  10. return (float)(salary * 0.03);   
  11. }   

 

這個版本中我未做任何抽象,直接調用靜態方法算了,可是一不小心開兩會了,個稅要調整了,于是個稅的算法要進行調整了,怎么辦呢,因為要少繳稅,我很高興的就要來重構上面的代碼了,既然個稅的計算方法是一個變化的東西,我就把它抽象出來吧。

 

  1. class Program   
  2. {   
  3. static void Main(string[] args)   
  4. {   
  5. float salary = 10000;   
  6. Console.WriteLine("收入是{0}的人應繳個稅是{1},",salary, GetTax(salary));   
  7. }   
  8. static float GetTax(float salary)   
  9. {   
  10. ITaxCalculateStrategy strategy = GetTaxCalculateStrategy();   
  11. return strategy.GetTax(salary);   
  12. }   
  13. /// <summary>   
  14. /// 獲得應該使用的個稅計算方法   
  15. /// </summary>   
  16. /// <returns>個稅計算方法實現實例</returns>   
  17. static ITaxCalculateStrategy GetTaxCalculateStrategy() {   
  18. string typeName = ConfigurationManager.AppSettings["TaxCalculateStrategyType"];   
  19. if (string.IsNullOrEmpty(typeName))   
  20. throw new ConfigurationErrorsException("請配置TaxCalculateStrategyType");   
  21. Type type = Type.GetType(typeName);   
  22. if (type == null) throw new ConfigurationErrorsException("TaxCalculateStrategyType錯誤");   
  23. return (ITaxCalculateStrategy)Activator.CreateInstance(type);   
  24. }   
  25. }   
  26. /// <summary>   
  27. /// 定義個稅計算的接口   
  28. /// </summary>   
  29. public interface ITaxCalculateStrategy   
  30. {   
  31. float GetTax(float salary);   
  32. }   
  33. /// <summary>   
  34. /// 兩會前個稅計算辦法的實現   
  35. /// </summary>   
  36. public class TaxCalculateBefore2Conference : ITaxCalculateStrategy   
  37. {   
  38. float ITaxCalculateStrategy.GetTax(float salary)   
  39. {   
  40. return (float)(salary * 0.03);   
  41. }   
  42. }   
  43. /// <summary>   
  44. /// 兩會后個稅的計算方法   
  45. /// </summary>   
  46. public class TaxCalculateAfter2Conference:ITaxCalculateStrategy   
  47. {   
  48. float ITaxCalculateStrategy.GetTax(float salary)   
  49. {   
  50. return (float)(salary * 0.020);   
  51. }   

 

因為要少繳稅,所以我很愉快的重構了之前的代碼,可以轉眼兩會開完了,結果并非如我預期的個稅變化,咋辦呢?沒關系我們重新開發一個個稅計算方法,修改下配置就可以仍舊使用之前的個稅計算辦法了。

開閉原則實現的關鍵點在于抽象,也許我們剛開始不知道該把那部分抽象出來,但是這并不是問題,我們可以遵循簡單設計的原則,當變化來了的時候,再重構代碼,做到一種滿足開閉原則的設計。

切忌到處都抽象,如果到處都抽象就會導致系統過度設計,過度復雜。這反而是不利于系統的維護。完全的開閉原則是不可能實現的,所以請保持簡單設計,在需要的時候做符合開閉原則的設計。

通過本文對開閉原則的介紹,希望對你有幫助。

【編輯推薦】

  1. C#3.0中對象初始化器和集合初始化器
  2. C#.Net ArrayList的使用
  3. C#中 As 和強制轉換的總結
  4. 漫談C#開發中的ASP.NET頁生命周期
  5. 分享c#常用函數和方法集
責任編輯:于鐵 來源: cnblogs
相關推薦

2022-09-27 09:21:34

SOLID開閉原則Go

2012-03-15 11:15:13

Java設計模式

2011-09-01 11:27:27

數據庫調整開閉原則

2024-07-11 16:32:13

代碼Java

2024-12-09 08:18:33

2011-03-15 09:14:29

2011-07-14 13:50:09

ThreadLocal

2009-09-08 13:07:15

介紹Linq to S

2011-06-21 14:42:37

ECMAScriptJavaScript

2009-06-29 14:30:27

JSF技術

2009-07-07 17:01:09

MyServlet

2009-09-18 09:25:06

LINQ Framew

2009-06-19 14:49:43

Spring框架

2024-02-23 09:31:30

開閉原則架構業務

2011-09-07 09:21:01

設計模式

2010-01-28 10:01:28

C++的設計原則

2009-11-09 17:30:20

WCF元數據

2009-12-15 17:05:59

.NET 2003

2010-01-05 16:56:28

2009-08-31 08:42:44

思科認證思科認證CCNA認證
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久成人国产精品 | 欧美日高清视频 | 精品一区国产 | 亚洲第一网站 | 久久久久久久久一区 | 欧美日韩高清在线一区 | 亚洲国产精品一区二区三区 | 国产一区二区在线看 | 欧美大片黄| 亚洲精品乱码久久久久久按摩观 | 一区二区三区精品视频 | 亚洲精品免费在线观看 | 日本三级全黄三级三级三级口周 | 亚洲社区在线 | 国产精品成人av | 久久爱黑人激情av摘花 | 久久精品国产a三级三级三级 | 欧美在线一区二区三区 | 污污免费网站 | 国产精品999 | 久久综合一区 | 中文字幕在线观看国产 | 亚州精品天堂中文字幕 | 国产精品一区二区福利视频 | 欧美在线观看一区 | 国产1区2区在线观看 | 一级毛片免费 | 在线中文av| 日韩精品一区二区三区中文在线 | 国产精品毛片 | 国产一级特黄真人毛片 | 在线观看视频一区二区三区 | 欧美一区二不卡视频 | 亚洲午夜在线 | 精品一区二区三区免费视频 | 性生生活大片免费看视频 | 99日韩 | 欧美一区二区三区精品免费 | 亚洲视频一区在线观看 | 男女羞羞视频在线观看 | 久久伊人免费视频 |