首页 > 作文

C# 实例解释面向对象编程中的单一功能原则(示例代码)

更新时间:2023-04-04 22:45:13 阅读: 评论:0

在面向对象编程领域中,单一功能原则(single responsibility principle)规定每个类都应该有且仅有一个单一的功能,并且该功能应该由这个类完全封装起来。

在面向对象编程中,solid 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特·c·马丁(robert cecil martin)提出的许多原则的子集,在他2000年的论文《设计原则与设计模式》中首次提出。

solid 原则包含:

s:单一功能原则(single-responsibility principle)o:开闭原则(open-clod p广西师范大学在哪rinciple)l:里氏替换原则(liskov substitution principle)i:接口隔离原则(interface gregation principle)d:依赖反转原则(dependency inversion principle)

本文我们来介绍单一功能原则。

单一功能原则

在面向对象编程领域中,单一功能原则(single responsibility principle)规定每个类都应该有且仅有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行(功能平行,意味着没有依赖)。

这个术语由罗伯特·c·马丁(robert cecil martin)在他的《敏捷软件开发,原则,模式和实践》一书中的一篇名为『面向对象设计原则』的文章中提出。马丁表述该原则是基于《结构化分析和系统规格》一书中的内聚原则(cohesion)之上的。

马丁把功能(职责)定义为:“改变的原因”,并总结出一个类或者模块应该有且只有一个改变的原因。一个具体的例子就是,想象有一个用于编辑和打印报表的模块。这样的一个模块存在两个改变的原因。第一,报表的内容可以改变(编辑)。第二,报表的格式可以改变(打印)。这两方面的改变会因为完全不同的起因而发生:一个是本质的修改,一个是表面的修改。单一功能原则认为这两方面的问题事实上是两个分离的功能,因此他们应该分离在不同的类或者模块里。把具有不同的改变原因的事物耦合在一起的设计是糟糕的。

保持一个类专注于单一功能点的一个重要的原因是,它可以使类更加的健壮。回顾上面的例子,如果有一个对于报表“编辑”流程的修改,那么将存在极大的危险性,因为假设这两个功能存在于同一个类中,修改报表的“编辑”流程会导致公共状态或者依赖关系的改变,从而可能使“打印”功能的代码无法正常运行。

c# 示例

例如,考虑这样一个应用程序,它接受一组形状(圆形和正方形),并计算该列表中所有形状的面积之和。

首先,创建形状类,并通过构造函数设置所需的参数。

对于正方形,需要知道它的边长:

/// <summary>/// 正方形/// </summary>class square{    public square(double length)    {        sidelength = length;    }    public double sidelength { get; init; }}

对于圆形,需要它的半径:

/// <summary>/// 圆形/// </summary>class circle{    public circle(double radius)    {        radius = radius;    }    public double radius { get; init; }}

接下来,创建 areacalculator 类,然后编写逻辑以计算所有提供的形状的面积守望先锋世界杯2017。正方形的面积是用边长的平方计算的,圆的面积由 π 乘以半径的平方来计算的。

糟糕的示范

class areacalculator{    private list<object> _shapes;    public areaca母lculator(list<object> shapes)    {        _shapes = shapes;    }    /// <summary>    /// 计算所有形状的面积总和    /// </summary>    /// <returns></returns>    public double sum()        list<double> areas = new lis胃胀的原因t<double>();        foreach (var item in _shapes)        {            if (item is square s)            {                areas.add(math.pow(s.sidelength, 2));            }            el if (item is circle c)                areas.add(math.pi * math.pow(c.radius, 2));        }        return areas.sum();    public string output()        return $"sum of the areas of provided shapes: {sum()}";}

要使用 areacalculator 类,您需要实例化这个类,并传入一个形状列表,并显示其输出。

在此,我们传入一个三个形状的列表:一个半径为 2 的圆,一个边长为 5 的正方形,一个边长为 6 的正方形。

static void main(string[] args){    var shapes = new list<object> {            new circle(2),            new square(5),            new square(6)    };    var areas = new areacalculator(shapes);    console.writeline(areas.output());}

运行程序,您会看到如下的输出:

sum of the areas of provided shapes: 73.56637061435917

输出正常,但这并不符合单一功能原则。因为 areacalculator 类既计算了所有形状的面积之和,又处理了输出数据的格式。

考虑这样一个场景,假如想要输出转换为另一种格式呢,如 json。我们就需要去修改 areacalculator 类,这样本来是为了修改输出数据的格式,却可能会影响到计算的逻辑,这明显违反了单一功能原则。

正确的示范

areacalculator 类应该只关心计算提供的形状的面积之和,不应该关心输出什么格式。

下面我们来做一些修改,删除 areacalculator 类中的 output 方法:

class areacalculator{    private list<object> _shapes;    public areacalculator(list<object> shapes)    {        _shapes = shapes;    }    /// <summary>    /// 计算所有形状的面积总和    /// </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));            }            el if (item is circle c)                areas.add(math.pi * math.pow(c.radius, 2));        }        return areas.sum();}

并新增一个 sumcalculatoroutputter 类来专门处理输出格式的逻辑:

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.jsonrializer.rialize(data);}

此时我们再来修改一下 main 中的调用:

static void main(string[] args){    var shapes = new list<object> {            new circle(2),            new square(5),         短句情话十字以内   new square(6)    };    var areacalculator = new areacalculator(shapes);    var outputer = new sumcalculatoroutputter(areacalculator);    console.writeline(outputer.json());    console.writeline(outputer.string());}

运行程序,输出结果如下:

{“sum”:73.56637061435917}
sum of the areas of provided shapes: 73.56637061435917

现在,areacalculator 类处理计算逻辑,sumcalculatoroutputter 类处理输出格式,它们各司其职,遵循了单一功能原则。

总结

本文我介绍了 solid 原则中的单一功能原则(single-responsibility principle),并通过 c# 代码示例简明地诠释了它的含意和实现,希望对您有所帮助。

参考文档:

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

到此这篇关于c#实例解释面向对象编程中的单一功能原则的文章就介绍到这了,更多相关c#面向对象编程原则内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 22:45:09,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/f26ea5407e3cfc2565f821f874f0e126.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C# 实例解释面向对象编程中的单一功能原则(示例代码).doc

本文 PDF 下载地址:C# 实例解释面向对象编程中的单一功能原则(示例代码).pdf

标签:原则   功能   形状   正方形
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图