精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

寫了這么多年代碼,你真的了解SOLID嗎?

開發 開發工具
單獨應用SOLID的某一個原則并不能讓收益最大化。應該把它作為一個整體來理解和應用,從而更好地指導你的軟件設計。

盡管大家都認為SOLID是非常重要的設計原則,并且對每一條原則都耳熟能詳,但我發現大部分開發者并沒有真正理解。要獲得***收益,就必須理解它們之間的關系,并綜合應用所有這些原則。只有把SOLID作為一個整體,才可能構建出堅實(Solid)的軟件。遺憾的是,我們看到的書籍和文章都在羅列每個原則,沒有把它們作為一個整體來看,甚至提出SOLID原則的Bob大叔也沒能講透徹。因此我嘗試介紹一下我的理解。

先拋出我的觀點: 單一職責是所有設計原則的基礎,開閉原則是設計的***目標。里氏替換原則強調的是子類替換父類后程序運行時的正確性,它用來幫助實現開閉原則。而接口隔離原則用來幫助實現里氏替換原則,同時它也體現了單一職責。依賴倒置原則是過程式編程與OO編程的分水嶺,同時它也被用來指導接口隔離原則。關系如下圖:

單一職責原則(Single Responsibility Principle, SRP)

單一職責是最容易理解的設計原則,但也是被違反得最多的設計原則之一。

要真正理解并正確運用單一職責原則,并沒有那么容易。單一職責就跟“鹽少許”一樣,不好把握。Robert C. Martin(又名“Bob大叔”)把職責定義為變化原因,將單一職責描述為 ”A class should have only one reason to change." 也就是說,如果有多種變化原因導致一個類要修改,那么這個類就違反了單一職責原則。那么問題來了,什么是“變化原因”呢?

利益相關者角色是一個重要的變化原因,不同的角色會有不同的需求,從而產生不同的變化原因。作為居民,家用的電線是普通的220V電線,而對電網建設者,使用的是高壓電線。用一個Wire類同時服務于兩類角色,通常意味著壞味道。

變更頻率是另一個值得考慮的變化原因。即使對同一類角色,需求變更的頻率也會存在差異。最典型的例子是業務處理的需求比較穩定,而業務展示的需求更容易發生變更,畢竟人總是喜新厭舊的。因此這兩類需求通常要在不同的類中實現。

單一職責原則某種程度上說是在分離關注點。分離不同角色的關注點,分離不同時間的關注點。

在實踐中,怎么運用單一職責原則呢?什么時候要拆分,什么時候要合并?我們看看新廚師在學炒菜時,是如何掌握“鹽少許”的。他會不斷地品嘗,直到味道剛好為止。寫代碼也一樣,你需要識別需求變化的信號,不斷“品嘗”你的代碼,當“味道”不夠好時,持續重構,直到“味道”剛剛好。

開閉原則(Open-closed Principle)

開閉原則指軟件實體(類、模塊等)應當對擴展開放,對修改閉合。這聽起來似乎很不合理,不能修改,只能擴展?那我怎么寫代碼?

我們先看看為什么要有開閉原則。假設你是一名成功的開源類庫作者,很多開發者使用你的類庫。如果某天你要擴展功能,只能通過修改某些代碼完成,結果導致類庫的使用者都需要修改代碼。更可怕的是,他們被迫修改了代碼后,又可能造成別的依賴者也被迫修改代碼。這種場景絕對是一場災難。

如果你的設計是滿足開閉原則的,那就完全是另一種場景。你可以通過擴展,而不是修改來改變軟件的行為,將對依賴方的影響降到***。

這不正是設計的***目標嗎?解耦、高內聚、低耦合等等設計原則最終不都是為了這個目標嗎?暢想一下,類、模塊、服務都不需要修改,而是通過擴展就能夠改變其行為。就像計算機一樣,組件可以輕松擴展。硬盤太小?直接換個大的,顯示器不夠大的?來個8K的怎么樣?

[[245290]]

什么時候應該應用開閉原則,怎么做到呢?沒有人能夠在一開始就識別出所有擴展點,也不可能在所有地方都預留出擴展點,這么做的成本是不可接受的。因此一定是由需求變化驅動。如果你有領域專家的支持,他可以幫你識別出變化點。否則,你應該在變化發生時來做決策,因為在沒有任何依據時做過多預先設計違反了Yagni。

實現開閉原則的關鍵是抽象。在Bertrand Meyer提出開閉原則的年代(上世紀80年代),在類庫中增加屬性或方法,都不可避免地要修改依賴此類庫的代碼。這顯然導致軟件很難維護,因此他強調的是要允許通過繼承來擴展類。隨著技術發展,我們有了更多的方法來實現開閉原則,包括接口、抽象類、策略模式等。

我們也許永遠都無法完全做到開閉原則,但不妨礙它是設計的***目標。SOLID的其它原則都直接或間接為開閉原則服務,例如接下來要介紹的里氏替換原則。

里氏替換原則 (The Liskov Substitution Principle)

里氏替換原則說的是派生類(子類)對象能夠替換其基類(父類)對象被使用。學過OO的同學都知道,子類本來就可以替換父類,為什么還要里氏替換原則呢?這里強調的不是編譯錯誤,而是程序運行時的正確性。

程序運行的正確性通常可以分為兩類。一類是不能出現運行時異常,最典型的是UnsupportedOperationException,也就是子類不支持父類的方法。第二類是業務的正確性,這取決于業務上下文。

下例中,由于java.sql.Date不支持父類的toInstance方法,當父類被它替換時,程序無法正常運行,破壞了父類與調用方的契約,因此違反了里氏替換原則。

  1. package java.sql; 
  2.  
  3. public class Date extends java.util.Date { 
  4.   @Override 
  5.   public Instant toInstant() { 
  6.     throw new java.lang.UnsupportedOperationException(); 
  7.   } 
  8. }   

接下來我們看破壞業務正確性的例子,最典型的例子就是Bob大叔在《敏捷軟件開發:原則、模式與實踐》中講到的正方形繼承矩形的例子了。從一般意義來看,正方形是一種矩形,但這種繼承關系破壞了業務的正確性。

  1. public class Rectangle { 
  2.   double width; 
  3.   double height; 
  4.    
  5.   public double area() { 
  6.     return width * height; 
  7.   } 
  8.  
  9. public class Square extends Rectangle { 
  10.   public void setWidth(double width) { 
  11.     this.width = width; 
  12.     this.height = width
  13.   } 
  14.    
  15.   public void setHeight(double height) {  
  16.     this.height = width
  17.     this.width = width; 
  18.    } 
  19.  } 
  20.   
  21.  public void testArea(Rectangle r) {  
  22.    r.setWidth(5); 
  23.    r.setHeight(4);   
  24.    assert(r.area() == 20); //! 如果r是一個正方形,則面積為16 

代碼中testArea方法的參數如果是正方形,則面積是16,而不是期望的20,所以結果顯然不正確了。

如果你的設計滿足里氏替換原則,那么子類(或接口的實現類)就可以保證正確性的前提下替換父類(或接口),改變系統的行為,從而實現擴展。BranchByAbstraction和絞殺者模式都是基于里氏替換原則,實現系統擴展和演進。這也就是對修改封閉,對擴展開放,因此里氏替換原則是實現開閉原則的一種解決方案。

而為了達成里氏替換原則,你需要接口隔離原則。

接口隔離原則 (Interface Segregation Principle)

接口隔離原則說的是客戶端不應該被迫依賴于它不使用的方法。簡單來說就是更小和更具體的瘦接口比龐大臃腫的胖接口好。

胖接口的職責過多,很容易違反單一職責原則,也會導致實現類不得不拋出UnsupportedOperationException這樣的異常,違反里氏替換原則。因此,應該將接口設計得更瘦。

怎么給接口減肥呢?接口之所以存在,是為了解耦。開發者常常有一個錯誤的認知,以為是實現類需要接口。其實是消費者需要接口,實現類只是提供服務,因此應該由消費者(客戶端)來定義接口。理解了這一點,才能正確地站在消費者的角度定義Role interface,而不是從實現類中提取Header Interface。

什么是Role interface? 舉個例子,磚頭(Brick)可以被建筑工人用來蓋房子,也可以被用來正當防衛:

  1. public class Brick { 
  2.   private int length; 
  3.   private int width; 
  4.   private int height; 
  5.   private int weight; 
  6.    
  7.   public void build() { 
  8.     //...包工隊蓋房 
  9.   } 
  10.    
  11.   public void defense() { 
  12.     //...正當防衛 
  13.   } 

如果直接提取以下接口,這就是Header Interface:

  1. public interface BrickInterface { 
  2.   void buildHouse(); 
  3.   void defense(); 

普通大眾需要的是可以防衛的武器,并不需要用磚蓋房子。當普通大眾(Person)被迫依賴了自己不需要的接口方法時,就違反接口隔離原則。正確的做法是站在消費者的角度,抽象出Role interface:

  1. public interface BuildHouse { 
  2.   void build(); 
  3. public interface StrickCompetence { 
  4.   void defense(); 
  5.  
  6. public class Brick implement BuildHouse, StrickCompetence { 

有了Role interface,作為消費者的普通大眾和建筑工人就可以分別消費自己的接口:

  1. Worker.java 
  2. brick.build(); 
  3.  
  4. Person.java 
  5. brick.strike(); 

接口隔離原則本質上也是單一職責原則的體現,同時它也服務于里氏替換原則。而接下來介紹的依賴倒置原則可以用來指導接口隔離原則的實現。

依賴倒置原則 (Dependence Inversion Principle)

依賴倒置原則說的是高層模塊不應該依賴底層模塊,兩者都應該依賴其抽象。

這個原則其實是在指導如何實現接口隔離原則,也就是前文提到的,高層的消費者不應該依賴于具體實現,應該由消費者定義并依賴于Role interface,底層的具體實現也依賴于Role interface,因為它要實現此接口。

依賴倒置原則是區分過程式編程和面向對象編程的分水嶺。過程式編程的依賴沒有倒置,A Simple DIP Example | Agile Principles, Patterns, and Practices in C#這篇文章以開關和燈的例子很好地說明了這一點。

上圖的關系中,當Button直接調用燈的開和關時,Button就依賴于燈了。其代碼完全是過程式編程:

  1. public class Button {  
  2.   private Lamp lamp;  
  3.   public void Poll()   { 
  4.     if (/*some condition*/) 
  5.       lamp.TurnOn();  
  6.   } 

如果Button還想控制電視機,微波爐怎么辦?應對這種變化的辦法就是抽象,抽象出Role interface ButtonServer:

不管是電燈,還是電視機,只要實現了ButtonServer,Button都可以控制。這是面向對象的編程方式。

總結

總的來說,單獨應用SOLID的某一個原則并不能讓收益***化。應該把它作為一個整體來理解和應用,從而更好地指導你的軟件設計。單一職責是所有設計原則的基礎,開閉原則是設計的***目標。里氏替換原則強調的是子類替換父類后程序運行時的正確性,它用來幫助實現開閉原則。而接口隔離原則用來幫助實現里氏替換原則,同時它也體現了單一職責。依賴倒置原則是過程式編程與OO編程的分水嶺,同時它也被用來指導接口隔離原則。

【本文是51CTO專欄作者“ThoughtWorks”的原創稿件,微信公眾號:思特沃克,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2018-10-07 06:30:40

代碼設計模式面向對象原則

2024-02-20 08:09:51

Java 8DateUtilsDate工具類

2017-11-30 07:30:27

程序員代碼軟件世界觀

2020-07-03 08:11:33

代碼登錄方式

2021-02-03 08:24:32

JavaScript技巧經驗

2020-01-06 08:40:42

Windows 10Windows超強模式

2023-11-13 08:49:54

2023-09-28 11:45:09

泛型類對象編譯器

2021-09-11 22:56:58

微信功能技巧

2021-05-21 05:24:03

Excel數據技巧

2015-03-27 10:20:41

谷歌地圖谷歌偉大

2020-05-22 13:35:39

Java 開發者代碼

2020-05-29 14:18:12

Java泛型數據

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統數據庫

2023-07-05 08:05:17

Goerror應用場景

2022-12-26 07:43:44

SpringBootWeb 類框架的

2021-11-09 09:48:13

Logging python模塊

2021-01-15 07:44:21

SQL注入攻擊黑客

2021-06-09 10:10:20

代碼內存編程語言
點贊
收藏

51CTO技術棧公眾號

懂色av成人一区二区三区| 欧美波霸videosex极品| 理论不卡电影大全神| 26uuu国产电影一区二区| 国产精品成人免费视频| 黄色a级片在线观看| 另类图片第一页| 欧美色手机在线观看| avav在线播放| 国产youjizz在线| 国产精品12区| 国产精品91久久久| 免费网站观看www在线观| 国产乱码精品一区二区三区四区| 欧美一区在线视频| 成人在线观看a| 日本高清在线观看| 中文字幕精品一区二区精品绿巨人 | 国内精品不卡| 久久久三级国产网站| 99一区二区三区| 亚洲一级在线播放| а√天堂8资源中文在线| 久久久久国产免费免费| 成人av中文| 中文字幕一区二区免费| 日韩午夜免费视频| 欧美大片欧美激情性色a∨久久| 久久丫精品忘忧草西安产品| 红杏成人性视频免费看| 欧美一区二区三区影视| 爱情岛论坛vip永久入口| 嗯啊主人调教在线播放视频| 一区二区三区四区蜜桃| 亚洲精品无人区| 久久精品色图| 91视频在线看| 久久综合久久综合这里只有精品| www久久久久久| 黑人精品欧美一区二区蜜桃| 国产精品午夜视频| 免费在线不卡av| 久久精品卡一| 欧洲美女7788成人免费视频| 一区二区三区视频免费看| 久久久久久久久久久久久久| 色婷婷综合成人| 男人的天堂av网| 欧美熟乱15p| 在线精品播放av| 人妻少妇无码精品视频区| 日韩一级电影| 日韩国产欧美精品一区二区三区| 任你躁av一区二区三区| 高清精品视频| 日韩精品极品在线观看播放免费视频 | 日本一级一片免费视频| 黄色成人91| 性色av一区二区三区| 国产真实的和子乱拍在线观看| 欧美日韩午夜| 韩国精品久久久999| 国产一级av毛片| 日韩视频一区二区三区在线播放免费观看| 欧美激情亚洲自拍| 国产无精乱码一区二区三区| 亚洲乱亚洲高清| 欧美一二三视频| 一级片在线免费播放| 毛片av一区二区| 亚洲自拍偷拍色图| 免费看黄色一级视频| 91网站在线观看视频| 日本欧洲国产一区二区| 免费观看在线黄色网| 亚洲激情一二三区| 日韩在线一级片| av电影在线观看网址| 国产精品女主播av| 成人国产在线看| 麻豆免费版在线观看| 在线观看精品一区| 亚洲激情在线看| 精品国产导航| 一区二区成人精品| 欧美成人综合色| 午夜在线精品偷拍| 91精品视频一区| 天堂成人在线观看| 中文字幕二三区不卡| 大荫蒂性生交片| 成人黄色免费短视频| 欧美一区二区三区不卡| 亚洲 欧美 日韩在线| 色综合天天综合网中文字幕| 欧美激情xxxx性bbbb| 中文字幕日韩免费| 国产不卡视频一区二区三区| 奇米视频888战线精品播放| 国产在线观看a视频| 福利精品视频在线| 久久精品视频在线观看免费| 亚洲人亚洲人色久| 欧美成人性色生活仑片| 高潮毛片又色又爽免费 | 精品无码av一区二区三区| 欧美人与牛zoz0性行为| 欧美高清视频在线观看| 超碰在线免费97| 91亚洲精品久久久蜜桃网站 | 亚洲一区二区伦理| 亚洲自拍偷拍色片视频| 丁香在线视频| 黄色精品在线看| 色诱av手机版| 久久在线视频| 国产精品成人播放| 日本午夜在线| 午夜欧美大尺度福利影院在线看| 污污的网站免费| 久草成人资源| 欧美亚洲另类在线| 老熟妇高潮一区二区高清视频| 最新久久zyz资源站| 亚洲不卡视频在线| 蜜桃成人av| 97精品国产91久久久久久| 午夜小视频免费| 在线成人www免费观看视频| 国产欧美日韩中文字幕| 免费在线稳定资源站| 亚洲一区二区视频在线观看| 亚洲涩涩在线观看| 日韩精品2区| 国产精品 欧美在线| 色播色播色播色播色播在线| 亚洲成a人v欧美综合天堂下载| 免费黄色在线播放| 亚洲天堂免费| 91免费版网站入口| 国产成人高清精品| 在线综合+亚洲+欧美中文字幕| 91ts人妖另类精品系列| 美女在线视频一区| 亚洲精品美女久久7777777| 国产一区二区三区影视| 国产亚洲欧洲黄色| www.五月婷婷.com| 欧美激情综合在线| 男女视频一区二区三区| 亚洲综合av在线播放| av有码在线观看| 欧美精品一区二区三区视频| 国产在线一二区| 成人深夜视频在线观看| 国产精品裸体瑜伽视频| 日韩欧美ww| 国产精品91久久久久久| av中文字幕一区二区三区| 欧美午夜电影网| 五月综合色婷婷| 国产一区二三区| 9191国产视频| 奇米影视777在线欧美电影观看| 欧美一区第一页| 国产一二三区在线视频| 欧美人妖巨大在线| 国产女片a归国片aa| av一二三不卡影片| 不要播放器的av网站| 欧美肥老太太性生活| 亚洲xxxx做受欧美| 成年人在线网站| 在线视频欧美日韩| 99国产精品久久久久久久成人| 亚洲国产美女搞黄色| 亚洲国产欧美视频| 久久福利视频一区二区| 成年人网站国产| 在线日韩一区| 96精品久久久久中文字幕| 白浆在线视频| 在线亚洲男人天堂| 欧美熟妇另类久久久久久不卡| 色琪琪一区二区三区亚洲区| 男人的午夜天堂| 97成人超碰视| 青青草原播放器| 午夜一区不卡| 国产日产欧美一区二区| 午夜精品福利影院| 91免费综合在线| 澳门成人av网| 久久6精品影院| 高清性色生活片在线观看| 日韩欧美一卡二卡| 久久久久亚洲视频| 亚洲在线视频网站| 夫妇露脸对白88av| 91亚洲精品久久久蜜桃网站| 波多野结衣免费观看| 日韩黄色一级片| 国产白丝袜美女久久久久| 91视频综合| 欧美三日本三级少妇三99| 美女精品久久| 国产欧美日韩91| 久久免费在线观看视频| 国产一区二区视频在线看| 91tv亚洲精品香蕉国产一区7ujn| 8888四色奇米在线观看| 日韩av中文字幕在线免费观看| 97超碰资源站| 91国偷自产一区二区使用方法| 国产在线观看99| 亚洲精品视频在线看| www.99re6| 国产精品欧美综合在线| 亚洲a v网站| 成人精品视频.| 潘金莲一级淫片aaaaa| 久99久精品视频免费观看| 黄色一级二级三级| 性xx色xx综合久久久xx| 黄色www网站| 在线欧美不卡| 精品国偷自产一区二区三区| 欧美~级网站不卡| 一区二区三区欧美成人| 欧美偷拍综合| 日韩国产在线一区| 教室别恋欧美无删减版| 欧美国产综合视频| 亚洲图区在线| 欧日韩一区二区三区| 欧美猛男男男激情videos| 欧美凹凸一区二区三区视频| 欧美调教视频| 精品国产综合久久| 风间由美一区二区av101| 成人xxxxx色| 国产伦精品一区二区三区在线播放| 亚洲综合自拍一区| 日韩在线视频一区二区三区| 91国产在线播放| 99re6热只有精品免费观看| 亚洲一区第一页| 你懂的在线观看| 亚洲欧美中文另类| 亚洲aⅴ乱码精品成人区| 日韩精品在线视频观看| 伦理片一区二区三区| 国产一区二区三区四区福利| a中文在线播放| 久久九九亚洲综合| 免费观看国产视频在线| 青草伊人久久| 成人女人免费毛片| 欧美wwwsss9999| 欧美大香线蕉线伊人久久| 国产精品最新| 天天爱天天做天天操| 国模一区二区三区| 欧美在线观看www| 日韩国产欧美一区二区三区| 美女在线视频一区二区| 国产精品一二三| 久久久午夜精品福利内容| 久久久久久久久久久久久夜| 国产精品一区二区亚洲| 一区二区免费视频| 成人午夜视频在线播放| 欧美性大战久久久久久久| 国产成人精品毛片| 日韩成人激情在线| yiren22综合网成人| 欧美日韩国产成人| 成人勉费视频| 92看片淫黄大片欧美看国产片| 久久夜色电影| 一区二区三区四区视频在线观看| 国产精品s色| 黄色片在线免费| 高清国产一区二区三区| 国产精品亚洲无码| 亚洲精品久久久久久国产精华液| 国产精品久久久久久久久久久久久久久久久 | 91国产精品| 成人动漫视频在线观看完整版| 亚洲小说图片视频| 超碰97免费观看| 国产亚洲精品bv在线观看| 亚洲免费一级视频| 99在线精品免费| 登山的目的在线| 欧美日韩中文字幕| 91久久精品无码一区二区| 日韩成人在线视频| 黄网址在线观看| 欧美亚洲在线观看| 欧美专区视频| 亚洲精品国产精品国自产观看| 在线日韩欧美| 91精产国品一二三产区别沈先生| 91在线观看污| 久久久精品国产sm调教| 欧美日韩五月天| 青青草视频免费在线观看| 欧美成人在线免费视频| 日本肉肉一区| 精品一区日韩成人| 欧美日韩亚洲一区| 女人高潮一级片| 久久久久久久久久久久久久久99 | 亚洲成av人片在线观看香蕉| 在线看的av网站| 欧美一乱一性一交一视频| 国内精品免费| 久久九九全国免费精品观看| 日本熟妇乱子伦xxxx| 欧美精品粉嫩高潮一区二区| 国产综合视频一区二区三区免费| 久久久爽爽爽美女图片| 嫩呦国产一区二区三区av| 一区二区日本伦理| 美女视频黄 久久| 在线观看免费小视频| 91成人看片片| 免费a级毛片在线观看| 91精品国产免费久久久久久| jizz性欧美2| 日本香蕉视频在线观看| 国产不卡免费视频| 在线观看成人毛片| 欧美一区二区三区影视| 91最新在线视频| 91久久久一线二线三线品牌| 亚洲一区色图| 免费高清视频在线观看| 亚洲男人的天堂在线观看| 国产麻豆91视频| 欧美精品在线观看| 91精品国产自产精品男人的天堂| 久久久久久av无码免费网站下载| 国产一区二区三区黄视频 | 久国产精品韩国三级视频| 日日操免费视频| 欧美人与禽zozo性伦| 国产盗摄在线观看| 成人av影视在线| 亚洲一级在线| www亚洲色图| 91精品在线麻豆| 色操视频在线| 久久精品国产精品国产精品污 | 亚洲国产日韩精品| 天堂av2024| 日韩av免费在线| 日韩三级在线| 在线观看一区二区三区视频| 亚洲一区影音先锋| 三级视频网站在线| 国产精品xxxxx| 99久久综合狠狠综合久久aⅴ| 中文字幕一二三区| 五月婷婷欧美视频| 国产福利第一视频在线播放| 91在线观看免费观看| 激情六月综合| 性高潮久久久久久久| 欧美一区二区三区四区高清| 国产盗摄——sm在线视频| 奇米888一区二区三区| 国产一区二区不卡| 国内免费精品视频| 中文字幕欧美日韩va免费视频| 中文字幕乱妇无码av在线| 国产精品视频观看| 亚洲精品第五页| 国产精品678| 欧美日韩国产成人精品| 巨胸大乳www视频免费观看| 欧美日韩免费高清一区色橹橹| 欧美78videosex性欧美| 欧美一区二区综合| 国产美女在线观看一区| 黄色大片网站在线观看| 日日狠狠久久偷偷四色综合免费 | 亚洲国产精品www| 国产成人免费高清| 久久精品视频2| 欧美极品在线播放| 色喇叭免费久久综合| 国产精品成人99一区无码| 欧美日本精品一区二区三区| 蜜桃视频在线观看播放| 一区二区三区我不卡| 久久亚区不卡日本| www久久久久久| 91精品久久久久久久久久|