日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

里氏替換原則,替換的依據是什么?

來源: 責編: 時間:2024-07-12 17:23:14 744觀看
導讀前面幾篇文章,我們介紹了 SOLID原則的單一職責原則和開閉原則,單一職責描述的模塊需要對一類行為負責,開閉原則描述的是對擴展開放,對修改關閉。今天我們就來聊聊SOLID的第三個原則:Liskov替換原則。什么是里式替換原則?里

前面幾篇文章,我們介紹了 SOLID原則的單一職責原則和開閉原則,單一職責描述的模塊需要對一類行為負責,開閉原則描述的是對擴展開放,對修改關閉。今天我們就來聊聊SOLID的第三個原則:Liskov替換原則。AMX28資訊網——每日最新資訊28at.com

AMX28資訊網——每日最新資訊28at.com

什么是里式替換原則?

里式替換原則,Liskov substitution principle(簡稱LSP),它是以作者 Barbara Liskov(一位美國女性計算機科學家,對編程語言和分布式計算做出了開創性的貢獻,于2008年獲得圖靈獎)的名字命名的,Barbara Liskov 曾在1987年的會議主題演講“數據抽象”中描述了子類型:AMX28資訊網——每日最新資訊28at.com

Let Φ(x) be a property provable about objects x of type T. Then Φ(y) should be true for objects y of type S where S is a subtype of T.

Liskov替換原則的核心:設Φ(x)是關于 T類型對象 x的可證明性質。那么對于 S類型的對象 y,Φ(y)應該為真,其中 S是 T的子類型。AMX28資訊網——每日最新資訊28at.com

這種科學的定義是不是過于抽象,太燒腦了?因此,在實際軟件開發中的 Liskov替換原則可以這樣:AMX28資訊網——每日最新資訊28at.com

The principle defines that objects of a superclass shall be replaceable with objects of its subclasses without breaking the application.That requires the objects of your subclasses to behave in the same way as the objects of your superclass.

該原則定義了在不破壞應用程序的前提下,超類的對象應該可以被其子類的對象替換,這就要求子類對象的行為方式與您的超類對象相同。AMX28資訊網——每日最新資訊28at.com

Robert C. Martin 對SLP的描述更加直接:AMX28資訊網——每日最新資訊28at.com

Subtypes must be substitutable for their base types.

子類型必須可以替代它們的基本類型。AMX28資訊網——每日最新資訊28at.com

通過上面幾個描述,我們可以把 LSP通俗的表達成:子類型必須能夠替換其父類。AMX28資訊網——每日最新資訊28at.com

如何實現Liskov替換原則?

說起 Liskov替換原則的實現,就不得不先看一個著名的違反 LSP設計案例:正方形/長方形問題。盡管這個 case已經有點老掉牙,但是為了幫助理解,我們還是炒一次剩飯。AMX28資訊網——每日最新資訊28at.com

數學知識告訴我們:正方形是一種特殊的長方形,因此用 java代碼分別定義 Rectangle(長方形) 和 Square(正方形)兩個類,并且 Square繼承 Rectangle,代碼如下:AMX28資訊網——每日最新資訊28at.com

// Rectangle(長方形)public class Rectangle {    private int length;    private int width;    public void setLength(double length) {        this.length = length;    }    public void setWidth(double width) {        this.width = width;    }}// Square(正方形)public class Square extends Rectangle {    // 設置邊長    @Override    public void setLength(double length) {        super.setLength(length);        super.setWidth(length);    }    @Override    public void setWidth(double width) {        super.setLength(width);        super.setWidth(width);    }}

假設現在的需求是計算幾何圖形的面積,因此面積計算代碼會如下實現:AMX28資訊網——每日最新資訊28at.com

// 計算面積public int area(){    Rectangle r = new Square();     // 設置長度    r.setLength(3);    // 設置寬度    r.setWidth(4);        r.getLength * r.getWidth = 3 * 4 = 12;        // 正方形    Rectangle r = new Rectangle();    // 設置長度    r.setLength(3); // Length=3, Width=3    // 設置寬度    r.setWidth(4); // Length=4, Width=4        r.getLength * r.getWidth = 4 * 4 = 16;}

在這個例子中,Square類重寫了 setLength和 setWidth方法,以確保正方形的長度和寬度總是相等的。因此:假設 length=3,width=4AMX28資訊網——每日最新資訊28at.com

  • 對于長方形,面積 = length * width= 3 * 4 = 12,符合預期;
  • 然而,用 Square對象替換 Rectangle對象時,程序的行為發生了變化,本期望矩形的面積為12(3 * 4),但實際輸出為 4*4=16,違反了里氏替換原則。

如何解決這個 bad case呢?AMX28資訊網——每日最新資訊28at.com

可以定義一個幾何圖形的接口,設定一個計算面積的方法,然后長方形、正方形都實現這個接口,實現各自的面積計算邏輯,整體思路如下:AMX28資訊網——每日最新資訊28at.com

// 基類public interface Geometry{     int area();}public class Rectangle implements Geometry{    private int length;    private int width;    public int area(){       return length * width;    }}public class Square implements Geometry{    private int side;    public int area(){       return side * side;    }}

我們再來看一個 LSP使用的例子:AMX28資訊網——每日最新資訊28at.com

假設有一個股票交易的場景,而且需要支持債券、股票和期權等不同證券類型的多種交易類型,我們就可以考慮使用 LSP來解決這個問題。AMX28資訊網——每日最新資訊28at.com

首先,我們定義一個交易的基類,并且在基類中定義買入和賣出兩個方法實現,代碼如下:AMX28資訊網——每日最新資訊28at.com

// 定義一個交易類public class Transaction{    // 買進操作    public void buy(String stock, int quantity, float price){            }    // 賣出操作    public void sell(String stock, int quantity, float price){            }}

接著,定義一個子類:股票交易,它和基類具有相同的買入和賣出行為,因此,在股票交易子類中需要重寫基類的方法,代碼如下:AMX28資訊網——每日最新資訊28at.com

// 定義股票交易子類,定義股票特定的買賣動作邏輯public class StockTransaction extends Transaction{    @Override    public void buy(String stock, int quantity, float price){           }    @Override    public void sell(String stock, int quantity, float price){           }}

同樣,定義一個子類:基金交易,它和基類具有相同的買入和賣出行為,因此,在基金交易子類中需要重寫基類的方法,代碼如下:AMX28資訊網——每日最新資訊28at.com

// 定義基金交易子類,定義基金特定的買賣動作邏輯public class FundTransaction extends Transaction{    @Override    public void buy(String stock, int quantity, float price){           }    @Override    public void sell(String stock, int quantity, float price){           }}

同樣,我們還可以定義了債券交易子類,債券交易和交易基類具有相同的行為:買入和賣出。所以只需要重寫基類的方法,實現子類特定的實現就ok了。AMX28資訊網——每日最新資訊28at.com

// 定義債券交易子類,定義債券特定的買賣動作邏輯public class BondTransaction extends Transaction{    @Override    public void buy(String stock, int quantity, float price){           }    @Override    public void sell(String stock, int quantity, float price){            }}

上述交易的案例,股票交易和基金交易子類替換基類之后,并沒有破壞基類的買入賣出行為,更具體地說,替換的子類實例仍提供 buy()和 sell(),可以以相同方式調用的功能。這個符合LSP。AMX28資訊網——每日最新資訊28at.com

經過我們的抽象、分離和改造之后,Stock.updateStock()類就穩定下來了,再也不需要增加一個事件然后增加一個else if分支處理。這種抽象帶來的好處也是很明顯的:每次有新的庫存變更事件,只需要增加一個實現類,其他的邏輯都不需要更改,當庫存事件無效時只需要把實現類刪除即可。AMX28資訊網——每日最新資訊28at.com

總結

Liskov替換原則擴展了OCP開閉原則,它描述的子類型必須能夠替換其父類型,而不會破壞應用程序。因此,子類需要遵循以下規則:AMX28資訊網——每日最新資訊28at.com

  • 不要對輸入參數實施比父類實施更嚴格的驗證規則。
  • 至少對父類應用的所有輸出參數應用相同的規則。

Liskov替換原則相對前面的單一職責和開閉原則稍微晦澀一些,因此在開發中容易誤用,因此我們特別要注意類之間是否存在繼承關系。AMX28資訊網——每日最新資訊28at.com

LSP不僅可以用在類關系上,也可以應用在接口設計中。AMX28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-100718-0.html里氏替換原則,替換的依據是什么?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一文搞懂 @Async 注解原理

下一篇: 五分鐘學完 Python 代碼編碼規范

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品一页| 欧美日韩高清一区| 午夜精品视频在线| 欧美在线免费视屏| 狂野欧美一区| 欧美日韩国产区一| 国产九九精品| 亚洲国产欧洲综合997久久| 夜夜嗨av一区二区三区| 欧美一区在线直播| 久久这里有精品视频| 欧美日韩理论| 国产在线精品一区二区中文| 久久激情综合网| 免费亚洲电影在线| 国产精品丝袜白浆摸在线| 激情亚洲一区二区三区四区| 日韩视频在线观看免费| 先锋资源久久| 欧美成人综合一区| 国产精品日日摸夜夜添夜夜av | 国产日韩欧美在线观看| 亚洲国产高清在线观看视频| 亚洲午夜免费视频| 裸体素人女欧美日韩| 国产精品vvv| 在线观看不卡| 中文一区二区| 美女性感视频久久久| 国产精品视频男人的天堂| 亚洲国产日韩在线| 欧美一区日韩一区| 欧美日韩国产成人| 一区二区在线看| 亚洲免费在线看| 欧美韩日视频| 黄色日韩网站| 亚洲欧美在线免费| 欧美另类变人与禽xxxxx| 国产自产v一区二区三区c| 亚洲一二三区在线| 欧美激情视频网站| 伊人成综合网伊人222| 小处雏高清一区二区三区| 欧美日韩另类视频| 亚洲成色777777在线观看影院| 欧美亚洲午夜视频在线观看| 欧美日韩在线亚洲一区蜜芽| 亚洲国产1区| 久久久99爱| 国产乱人伦精品一区二区| 一本大道久久a久久精二百| 欧美gay视频| 在线电影一区| 久久久久久一区二区三区| 国产精品色在线| 一区二区三区日韩在线观看| 欧美福利一区二区三区| 在线观看日韩www视频免费| 欧美一区在线视频| 国产精品日产欧美久久久久| 一区二区三区久久| 欧美精品一区二区三区蜜桃 | 欧美视频在线观看视频极品| 亚洲精品美女在线| 蜜桃久久av一区| 精品成人一区| 久久青青草原一区二区| 国产婷婷色综合av蜜臀av| 亚洲欧美日韩在线| 国产精品美女久久| 亚洲男女自偷自拍| 国产精品欧美风情| 亚洲综合日韩中文字幕v在线| 欧美午夜精品理论片a级按摩| 日韩一级网站| 欧美日韩网址| 亚洲深夜激情| 国产精品久久影院| 香蕉成人啪国产精品视频综合网| 国产精品久久久久久亚洲调教| 一本久道久久综合狠狠爱| 欧美日韩理论| 在线综合亚洲欧美在线视频| 欧美日韩一区二区三区在线| 一本不卡影院| 欧美亚韩一区| 亚洲欧美在线磁力| 国产婷婷精品| 久久综合五月| 亚洲欧洲精品天堂一级| 欧美国产亚洲另类动漫| 亚洲精品国产精品国产自| 欧美精品一卡| 在线一区欧美| 国产欧美日韩三区| 久久久xxx| 亚洲高清自拍| 欧美日韩免费高清| 亚洲影视九九影院在线观看| 国产精品亚洲综合久久| 久久成人av少妇免费| 伊人婷婷欧美激情| 欧美激情国产高清| 一本色道久久加勒比精品| 国产精品美女久久久久久2018 | 久久精品一区二区三区不卡| 激情视频一区二区| 欧美国产三区| 一区二区三区你懂的| 国产精品一区二区在线观看不卡| 久久成人人人人精品欧| 永久555www成人免费| 欧美久久久久久| 亚洲综合色在线| 激情综合色丁香一区二区| 欧美大片专区| 亚洲一区国产精品| 黄色小说综合网站| 欧美激情bt| 先锋资源久久| 亚洲国产精品成人一区二区| 欧美日韩国产综合一区二区| 午夜精品久久久久久久白皮肤| 一区二区在线视频播放| 欧美日韩国内| 欧美在线视频免费观看| 亚洲国产精品成人| 国产精品啊啊啊| 久久久久久久999精品视频| 亚洲精品中文字| 国产欧美精品一区aⅴ影院| 免费成人黄色| 亚洲欧美亚洲| 亚洲激情视频在线观看| 国产精品嫩草99av在线| 美女网站久久| 性久久久久久久久| 亚洲精品四区| 国产一区二区三区四区在线观看 | 国产精品一区二区你懂的| 嫩模写真一区二区三区三州| 亚洲资源av| 亚洲国产欧美一区二区三区久久| 国产精品久久久久久久久久免费看| 久久久久国产一区二区三区四区| av成人动漫| 在线国产欧美| 国产欧美大片| 欧美日韩天天操| 久久综合久久久| 亚洲一区二区精品| 亚洲国产清纯| 国产一区二区精品久久91| 欧美日韩一区二区三区在线观看免| 久久天天综合| 羞羞漫画18久久大片| 99精品免费网| 亚洲国产精品一区在线观看不卡| 国产精品一级二级三级| 欧美日本免费一区二区三区| 久久久久在线观看| 午夜欧美理论片| 亚洲午夜一级| 亚洲精品久久久久久久久久久| 国产在线视频欧美| 国产精品青草综合久久久久99 | 久久综合伊人77777| 亚洲欧美日韩人成在线播放| 日韩天堂av| 亚洲高清av在线| 国产午夜精品福利| 国产精品久久久久久影院8一贰佰| 欧美精彩视频一区二区三区| 久久综合九色九九| 久久精品视频在线看| 先锋a资源在线看亚洲| 中文日韩电影网站| 99riav国产精品| 亚洲精品国精品久久99热| 136国产福利精品导航网址| 国产一区二区三区日韩欧美| 国产精品视频99| 国产精品成人国产乱一区| 欧美日韩视频专区在线播放| 欧美国产亚洲精品久久久8v| 免费h精品视频在线播放| 久久中文在线| 久久一二三国产| 久久久噜噜噜久久| 久久久99爱| 久久久久国产精品麻豆ai换脸| 欧美在线三级| 欧美一区二区三区在线观看| 午夜精品久久久久久久男人的天堂 | 国产精品久久97| 国产精品二区在线| 国产精品久久久久7777婷婷| 欧美日韩亚洲一区| 欧美日韩一区二区三区在线看| 欧美日韩免费高清一区色橹橹| 欧美日韩高清在线观看| 欧美日韩国产黄| 欧美丝袜一区二区|