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

理解面向設計原則

開發 項目管理
今天我們不光討論面向對象設計(OOD)核心原則,還將會談到面向抽象編程提出抽象等內容。

面向對象設計(OOD)核心原則讓我的程序模塊達到“高內聚低耦合”,這是來自于30年前興起的結構化設計(structured Design),但是同樣適用于我們的OOD。

1.高內聚:

高內聚是指某個特定模塊(程序,類型)都應完成一系列相關功能,描述了不同程序,類型中方法,方法中不同操作描述的邏輯之間的距離相近。高內聚意味可維護性,可重新性,因為模塊對外部的依賴少(功能的完備性)。如果兩個模塊之間的修改,互不影響這說明模塊之間是高內聚的。模塊的內聚和其擔當的職責成反比,即,模塊的職責越多,模塊的內聚性越低,這也是模塊的單一原則(SRP),SRP提倡每個類型都最好只承擔單一的職責,只有單一的改變因素。

2.低耦合:

耦合是描述模塊之間的依賴程度,如果一個模塊的修改,都有影響另一個模塊則,兩模塊之間是相互依賴耦合的。(依賴具有傳遞性,耦合的兩個模塊可能間接依賴),低耦合是我們的設計目的,但不是不存在耦合不存依賴,依賴是必須的,因為模塊之間必須通信交互,不過我的設計依賴應該依賴于不變或者不易變的接口,無需了解模塊的具實現(OO封裝性)。

在面向對象:我們可以簡述為功能完備(高內聚)的對象之間的交互是依賴于不變或不易變的接口契約(低耦合)。

實現高內聚低耦合:行之有效的方式是分了關注點(SOC),將系統拆分成功能不同沒有重疊功能集。每個功能只關注一個方面(Aspect)保證模塊之間功能沒有或者盡量少的重復。模塊化內部實現細節隱藏,只暴露必須的接口,使得模塊之間依賴于抽象,達到穩定。分離關注點的思想存在于我們軟件設計的各個領域。如在.net的世界里SOA(面向服務架構)服務就是關注點,只暴露出必要的契約。分層架構從邏輯上利用接口抽象信息隱藏,減少依賴。MVC,MVP也是遵循分了關注點原則,達到表現層和邏輯的分離。

面向對象設計原則:

1.降低耦合度:對象直接需要交互,這就存在依賴,為了實現低耦合就必須減少依賴,依賴于穩定或不易變抽象。考慮如下訂單日志記錄場景:我們需要在訂單每部操作記錄更改日志。

  1. public class OrderManager  
  2. {  
  3.    public void Create(Order order)  
  4.   {  
  5.       //訂單處理.  
  6.      Logger log = new Logger();  
  7.      var history=GetHistory();  
  8.      log.log(history);  
  9.  }  

在這里我們的OrderManager和Logger存在高耦合,Logger類的修改可能導致OrderManager的修改,而且不能隨意切換我們的日志記錄方式,比如文件,控制臺,數據庫等日志方式。

面向抽象編程提出抽象(接口,abstract類)是不易變的穩定抽象;對于OrderManager來說我不需要了解日志記錄組件內部,只需要明白提供那些接口可用,怎么用。

  1. public interface ILogger  
  2. {  
  3.   void Log(History history);  
  4. }  
  5. public class Logger  
  6. {  
  7.   public void Log(History history)  
  8. {  
  9. //內部實現  
  10. };  

那么我們可以從設計模式工廠模式(工廠模式是負責一些列相似對象的創建)Create 日志組件ILogger。 

我們的OrderManager 就可以實現為:

  1. ILogger log =LoggerFactory.Create();  
  2. log.Log(history); 

這樣我們的OrderManager就依賴于ILogger,而隔離Logger具體實現,將依賴于抽象,把變化縮小到Factory內部(同樣也可以用抽象工廠),如果日志實現變化我們可以重新實現ILogger ,修改Factory邏輯,如果內部利用配置我的需求變更轉移到配置。這就是面向對象第一原則,依賴于抽象而隱藏實現。(利用IOC是一種更好的方式) 

2.代碼的重用性:盡量保證相同功能代碼只出現一次(Code once run anywhere)。代碼的重用在面對對象設計中有繼承和組合兩種方式,一般推薦組合優先。組合依賴于接口,組合更安全,易于維護,測試。繼承存在父類訪問權限,父類的修改導致子類的變化,太多的繼承也有導致派生類的膨脹,維護管理也是件頭痛的事。

3.開閉原則(OCP):表述擁抱需求變化,盡量做到對模塊的擴展開發,修改關閉。對于新增需求我們完美的做法是新增類型而不是修改邏輯,這就意味著我們必須使用組合或者是繼承體系(為了避免上一條重用性,我的繼承應該是干凈的繼承體系,派生類應該只是新增功能而不是修改來自父類上下文),

4.里氏替換(LSP):表述派生類應該可以在任何地方替代父類使用。并不是所有的子類都可以完全替換子類,比如設計父類私有上下文信息的訪問,導致子類無法訪問。

5.依賴倒置(DIP):描述組件之間高層組件不應該依賴于底層組件。依賴倒置是指實現和接口倒置,采用自頂向下的方式關注所需的底層組件接口,而不是其實現。DI框架實現IOC(控制反轉)就是DIP很好的插入底層組件構造框架(分構造注入,函數注入,屬性注入)。微軟Unity,Castle windsor,Ninject等框架支持。

最后分離關注點,衍生出聲明式編程,面向方面編程(AOP)實現縱切關注點,把具體業務邏輯和日志安全等框架集公用邏輯分離。 關于IOC/AOP參見博客我的IOC/AOP隨筆目錄 不在累贅。

原文鏈接:http://www.cnblogs.com/whitewolf/archive/2012/05/08/2489425.html

【編輯推薦】

  1. 淺談.NET獨有精巧泛型設計模式
  2. 利用 SPL 快速實現 Observer 設計模式
  3. 設計模式系列之代理模式
  4. 從理發店流程抽象設計模式中的組合模式
  5. 大話惱人的那些設計模式
責任編輯:彭凡 來源: 博客園
相關推薦

2012-06-07 10:11:01

面向對象設計原則Java

2013-04-17 10:46:54

面向對象

2009-09-27 14:12:12

面向對象設計單一職責

2024-05-10 09:28:57

Python面向對象代碼

2009-01-16 08:52:26

面向對象OOP編程

2009-06-30 15:29:00

Java面向對象

2022-03-24 09:44:54

TypeScriptSOLID

2011-03-04 13:29:13

海量服務設計原則

2011-07-12 17:53:21

PHP

2022-09-28 07:31:03

SOLID對象設計

2025-06-03 08:05:00

設計原則開發代碼

2015-03-16 11:14:26

Java程序員面向對象程序員

2012-03-13 09:24:30

Java

2016-03-29 09:59:11

JavaScriptAPI設計

2015-10-29 09:30:38

程序員面向對象設計

2022-06-27 08:01:45

Java內存模型

2012-12-18 09:24:47

2023-10-25 13:42:19

Java面向對象

2013-06-07 10:55:10

2012-03-15 11:15:13

Java設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产伦一区二区三区四区 | 亚洲一区二区中文字幕 | 日本在线中文 | 网站黄色av | 97伦理电影 | 在线午夜 | 国产精品区一区二区三 | 仙人掌旅馆在线观看 | 亚洲精品高清视频在线观看 | 国产精品一区久久久 | 高清国产一区二区 | 国产精品一区久久久久 | 日韩欧美三区 | 国产精品五区 | 在线日韩| 国产乱肥老妇国产一区二 | 日韩精品一区二区三区中文在线 | 免费av手机在线观看 | 一区二区三区国产 | 91av免费看 | 成人黄色电影在线观看 | 免费国产一区二区 | 久久久久国产一区二区三区四区 | a爱视频 | 成人天堂 | 成人亚洲精品久久久久软件 | 91高清免费观看 | 色综合av| 国产日韩欧美激情 | 另类一区 | 九九热在线视频免费观看 | 婷婷色在线 | 蜜桃在线一区二区三区 | 国产一区高清 | 欧美精品福利 | 99reav| 九九九久久国产免费 | 99九九久久 | 久久综合一区二区三区 | 北条麻妃av一区二区三区 | 黄色免费网站在线看 |