最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#面向?qū)ο缶幊讨虚_閉原則的示例詳解

 更新時(shí)間:2022年07月26日 11:38:56   作者:技術(shù)譯民  
在面向?qū)ο缶幊讨?,SOLID?是五個(gè)設(shè)計(jì)原則的首字母縮寫,旨在使軟件設(shè)計(jì)更易于理解、靈活和可維護(hù)。本文將通過實(shí)例詳細(xì)講講C#面向?qū)ο缶幊讨虚_閉原則,需要的可以參考一下

在面向?qū)ο缶幊讨校?strong>SOLID 是五個(gè)設(shè)計(jì)原則的首字母縮寫,旨在使軟件設(shè)計(jì)更易于理解、靈活和可維護(hù)。這些原則是由美國(guó)軟件工程師和講師羅伯特·C·馬丁(Robert Cecil Martin)提出的許多原則的子集,在他2000年的論文《設(shè)計(jì)原則與設(shè)計(jì)模式》中首次提出。

SOLID 原則包含:

本文我們來介紹開閉原則。

開閉原則

在面向?qū)ο缶幊填I(lǐng)域中,開閉原則 (open-closed principle, OCP) 規(guī)定軟件中的對(duì)象(類,模塊,函數(shù)等等)應(yīng)該對(duì)于擴(kuò)展是開放的,而對(duì)于修改是封閉的”,這意味著一個(gè)實(shí)體是允許在不改變它的源代碼的前提下變更它的行為。該特性在產(chǎn)品化的環(huán)境中是特別有價(jià)值的,在這種環(huán)境中,改變?cè)创a需要代碼審查,單元測(cè)試以及諸如此類的用以確保產(chǎn)品使用品質(zhì)的過程。遵循開閉原則的代碼在擴(kuò)展時(shí)并不發(fā)生改變,因此無(wú)需這些過程。

具體到類,也就是說,在不修改類本身代碼的情況下,應(yīng)該是可以擴(kuò)展它的行為的。

C# 示例

讓我們回顧一下上一篇文章單一功能原則中提到的 AreaCalculator 類,

class AreaCalculator
{
    private List<object> _shapes;

    public AreaCalculator(List<object> shapes)
    {
        _shapes = shapes;
    }

    /// <summary>
    /// 計(jì)算所有形狀的面積總和
    /// </summary>
    /// <returns></returns>
    public double Sum()
    {
        List<double> areas = new List<double>();

        foreach (var item in _shapes)
        {
            if (item is Square s)
            {
                areas.Add(Math.Pow(s.SideLength, 2));
            }
            else if (item is Circle c)
            {
                areas.Add(Math.PI * Math.Pow(c.Radius, 2));
            }
        }

        return areas.Sum();
    }
}

對(duì)于上面的計(jì)算方法,考慮這樣一種場(chǎng)景,用戶想要計(jì)算一些其它形狀的面積總和,比如三角形、矩形、五邊形等等…… 您將不得不反復(fù)編輯此類以添加更多的 if/else 塊,這就違反了開閉原則。

改進(jìn)

一個(gè)更好的做法是,將計(jì)算每個(gè)形狀的面積的邏輯從 AreaCalculator 類中移除,并將其添加到對(duì)應(yīng)每個(gè)形狀的類中。我們可以定義一個(gè)帶有 CalcArea 方法的接口 IShape,然后讓每個(gè)形狀都實(shí)現(xiàn)這個(gè)接口。

接口 IShape:

interface IShape
{
    /// <summary>
    /// 計(jì)算面積
    /// </summary>
    /// <returns></returns>
    double CalcArea();
}

修改后的 Square 和 Circle 類:

/// <summary>
/// 正方形
/// </summary>
class Square : IShape
{
    public Square(double length)
    {
        SideLength = length;
    }
    public double SideLength { get; init; }

    public double CalcArea()
    {
        return Math.Pow(SideLength, 2);
    }
}

/// <summary>
/// 圓形
/// </summary>
class Circle : IShape
{
    public Circle(double radius)
    {
        Radius = radius;
    }

    public double Radius { get; init; }

    public double CalcArea()
    {
        return Math.PI * Math.Pow(Radius, 2);
    }
}

AreaCalculator 類也要對(duì)應(yīng)做一些修改:

class AreaCalculator
{
    private List<IShape> _shapes;

    public AreaCalculator(List<IShape> shapes)
    {
        _shapes = shapes;
    }

    /// <summary>
    /// 計(jì)算面積總和
    /// </summary>
    /// <returns></returns>
    public double Sum()
    {
        List<double> areas = new List<double>();

        foreach (var item in _shapes)
        {
            areas.Add(item.CalcArea());
        }

        return areas.Sum();
    }
}

此時(shí),如果我們有一個(gè)新的形狀需要進(jìn)行計(jì)算,我們可以直接添加一個(gè)實(shí)現(xiàn)了接口 IShape 的新類,而無(wú)需修改 AreaCalculator 類的代碼,比如添加一個(gè)長(zhǎng)方形類:

/// <summary>
/// 長(zhǎng)方形
/// </summary>
class Rectangle : IShape
{
    public Rectangle(double width, double height)
    {
        Width = width;
        Height = height;
    }

    public double Width { get; init; }
    public double Height { get; init; }

    public double CalcArea()
    {
        return Width * Height;
    }
}

處理輸出格式的 SumCalculatorOutputter 類同樣無(wú)需修改:

class SumCalculatorOutputter
{
    protected AreaCalculator _calculator;

    public SumCalculatorOutputter(AreaCalculator calculator)
    {
        _calculator = calculator;
    }

    public string String()
    {
        return $"Sum of the areas of provided shapes: {_calculator.Sum()}";
    }

    public string JSON()
    {
        var data = new { Sum = _calculator.Sum() };
        return System.Text.Json.JsonSerializer.Serialize(data);
    }
}

然后,我們修改 Main 方法中的代碼來測(cè)試一下:

static void Main(string[] args)
{
    var shapes = new List<IShape> {
            new Circle(2),
            new Square(5),
            new Rectangle(2,3)
    };

    var areaCalculator = new AreaCalculator(shapes);
    var outputer = new SumCalculatorOutputter(areaCalculator);
    Console.WriteLine(outputer.JSON());
    Console.WriteLine(outputer.String());
}

運(yùn)行一下,輸出結(jié)果為:

{"Sum":43.56637061435917}
Sum of the areas of provided shapes: 43.56637061435917

現(xiàn)在,這些類的設(shè)計(jì),既遵循了單一功能原則,又遵循了開閉原則。

總結(jié)

本文我介紹了 SOLID 原則中的開閉原則 (open-closed principle),并通過 C# 代碼示例簡(jiǎn)明地詮釋了它的含意和實(shí)現(xiàn),希望對(duì)您有所幫助。

參考文檔:

https://www.digitalocean.com/community/conceptual_articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design

到此這篇關(guān)于C#面向?qū)ο缶幊讨虚_閉原則的示例詳解的文章就介紹到這了,更多相關(guān)C#開閉原則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# BitArray點(diǎn)陣列的使用

    C# BitArray點(diǎn)陣列的使用

    本文主要介紹了C# BitArray點(diǎn)陣列的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 將DataTable轉(zhuǎn)換成List&lt;T&gt;實(shí)現(xiàn)思路及示例代碼

    將DataTable轉(zhuǎn)換成List&lt;T&gt;實(shí)現(xiàn)思路及示例代碼

    首先,這是我寫的一個(gè)通用轉(zhuǎn)換類,完成此類操作。也是實(shí)現(xiàn)這個(gè)功能最核心的部分。需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-11-11
  • C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    這篇文章主要介紹了C#/VB.NET 在PDF中添加文件包(Portfolio)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-06-06
  • C#實(shí)現(xiàn)矩陣乘法實(shí)例分析

    C#實(shí)現(xiàn)矩陣乘法實(shí)例分析

    這篇文章主要介紹了C#實(shí)現(xiàn)矩陣乘法的方法,實(shí)例分析了通過C#數(shù)組構(gòu)造矩陣及實(shí)現(xiàn)矩陣乘法的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#事件中關(guān)于sender的用法解讀

    C#事件中關(guān)于sender的用法解讀

    這篇文章主要介紹了C#事件中關(guān)于sender的用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • C#繪制實(shí)時(shí)曲線的方法

    C#繪制實(shí)時(shí)曲線的方法

    這篇文章主要為大家詳細(xì)介紹了C#繪制實(shí)時(shí)曲線的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#對(duì)DataTable中的某列進(jìn)行分組

    C#對(duì)DataTable中的某列進(jìn)行分組

    這篇文章介紹了C#對(duì)DataTable某列進(jìn)行分組的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#如何使用Task類解決線程的等待問題

    C#如何使用Task類解決線程的等待問題

    這篇文章主要介紹了C#如何使用Task類解決線程的等待問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • C#中數(shù)組、ArrayList和List三者的區(qū)別詳解

    C#中數(shù)組、ArrayList和List三者的區(qū)別詳解

    這篇文章主要介紹了C#中數(shù)組、ArrayList和List三者的區(qū)別詳解,對(duì)于三者之間的區(qū)別想要了解的可以進(jìn)來了解一下。
    2016-12-12
  • c#的時(shí)間日期操作示例分享(c#獲取當(dāng)前日期)

    c#的時(shí)間日期操作示例分享(c#獲取當(dāng)前日期)

    這篇文章主要介紹了c#的時(shí)間日期操作示例,在給定時(shí)間戳返回指定的時(shí)間格式和獲取當(dāng)前時(shí)間方法,需要的朋友可以參考下
    2014-03-03

最新評(píng)論

霍山县| 洛扎县| 馆陶县| 榆中县| 苏尼特右旗| 桦川县| 松溪县| 梁河县| 崇左市| 平邑县| 独山县| 永丰县| 清水县| 舒城县| 漳州市| 千阳县| 二连浩特市| 池州市| 泰和县| 上饶县| 台山市| 石首市| 蒙自县| 宣化县| 黄龙县| 南丹县| 清新县| 连平县| 常宁市| 宿州市| 和平区| 确山县| 沛县| 桑日县| 江门市| 建瓯市| 元阳县| 龙游县| 都兰县| 明溪县| 阿克苏市|