在物件導向程式設計中,solid是五個設計原則的首字母縮寫,旨在使軟體設計更易於理解、靈活和可維護。這些原則是由美國軟體工程師和講師羅伯特·c·馬丁(robert cecil martin)提出的許多原則的子集,在他2023年的**《設計原則與設計模式》中首次提出。
solid 原則包含:
本文我們來介紹開閉原則。
在物件導向程式設計領域中,開閉原則(open-closed principle, ocp)規定「軟體中的物件(類,模組,函式等等)應該對於擴充套件是開放的,而對於修改是封閉的」,這意味著乙個實體是允許在不改變它的源**的前提下變更它的行為。該特性在產品化的環境中是特別有價值的,在這種環境中,改變源**需要**審查,單元測試以及諸如此類的用以確保產品使用品質的過程。遵循開閉原則的**在擴充套件時並不發生改變,因此無需這些過程。
具體到類,也就是說,在不修改類本身**的情況下,應該是可以擴充套件它的行為的。
中提到的 areacalculator 類,
class areacalculator
/// /// 計算所有形狀的面積總和
///
///
public double sum()
else if (item is circle c)
}return areas.sum();
}}
對於上面的計算方法,考慮這樣一種場景,使用者想要計算一些其它形狀的面積總和,比如三角形、矩形、五邊形等等…… 您將不得不反覆編輯此類以新增更多的if/else
塊,這就違反了開閉原則。
乙個更好的做法是,將計算每個形狀的面積的邏輯從 areacalculator 類中移除,並將其新增到對應每個形狀的類中。我們可以定義乙個帶有calcarea
方法的介面 ishape,然後讓每個形狀都實現這個介面。
介面 ishape:
inte***ce ishape
修改後的 square 和 circle 類:
/// /// 正方形
///
class square : ishape
public double sidelength
public double calcarea()
}/// /// 圓形
///
class circle : ishape
public double radius
public double calcarea()
}
areacalculator 類也要對應做一些修改:
class areacalculator
/// /// 計算面積總和
///
///
public double sum()
return areas.sum();
}}
此時,如果我們有乙個新的形狀需要進行計算,我們可以直接新增乙個實現了介面 ishape 的新類,而無需修改 areacalculator 類的**,比如新增乙個長方形類:
/// /// 長方形
///
class rectangle : ishape
public double width
public double height
public double calcarea()
}
處理輸出格式的 sumcalculatoroutputter 類同樣無需修改:
class sumcalculatoroutputter
public string string()";}
public string json()
;return system.text.json.jsonserializer.serialize(data);
}}
然後,我們修改main
方法中的**來測試一下:
static void main(string args)
; var areacalculator = new areacalculator(shapes);
var outputer = new sumcalculatoroutputter(areacalculator);
console.writeline(outputer.json());
console.writeline(outputer.string());
}
執行一下,輸出結果為:
sum of the areas of provided shapes: 43.56637061435917
現在,這些類的設計,既遵循了單一功能原則,又遵循了開閉原則。
本文我介紹了 solid 原則中的開閉原則(open-closed principle),並通過 c# **示例簡明地詮釋了它的含意和實現,希望對您有所幫助。
作者 : 技術譯民出品 : 技術譯站
C 例項解釋物件導向程式設計中的黎克特制替換原則
在物件導向程式設計中,solid是五個設計原則的首字母縮寫,旨在使軟體設計更易於理解 靈活和可維護。這些原則是由美國軟體工程師和講師羅伯特 c 馬丁 robert cecil martin 提出的許多原則的子集,在他2000年的 設計原則與設計模式 中首次提出。solid 原則包含 本文我們來介紹黎...
C 中的物件導向程式設計
繼承密封類 子類的初始化順序 多型所有類的父類systemobject c 中的物件導向程式設計是指3個基本特徵 封裝 繼承 多型。當類的內部資料沒有被封裝時,若把字段定義為公共字段,則外部物件可以對內部資料進行任意的操作,很可能導致不當的操作結果。例如 public class person cl...
C 中的物件導向程式設計
所有的物件導向語言都具有3個基本特徵,c 也是不例外的。1 封裝 封裝指的是把類內部的資料隱藏起來,不讓物件例項直接對其操作。在c 中,封裝可以通過public private protected和internal等關鍵字來體現。c 對保護內部資料狀態提供了一種方式,叫做屬性機制。public cl...