C#面向对象设计原则之单一职责原则

 更新时间:2022年03月07日 10:58:40   作者:.NET开发菜鸟  
这篇文章介绍了C#面向对象设计原则之单一职责原则,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

单一职责原则(SRP)

定义:系统中的每一个类都应该只有一个职责。

好处:高内聚、低耦合。

解释说明:

单一职责也就是说我们应该让一个类或一个对象只做一件事情,每个类所要关注的就是自己要完成的职责是什么,能够引起这个类变化的原因也应该只有一个,这也是后面提到的所有的设计模式都会遵守的一个原则。

高内聚:先按照面向对象的封装特性来理解,封装也就是我们说的,应该把一个类或对象它所有相关的属性、方法、行为放到一起,放到一个类中,这样就实现了一个封装的特性。那么内聚,就是一个类里面应该包含它所有的属性和行为。封装就是内聚的一种表现方式。高内聚是指我们一个类的属性和行为应该和这个类非常紧密,我们才把它放到这个类里面,反之我们就不应该把这个属性或行为放到这个类里面。

低耦合:内聚是指类的内部,耦合是指类与类之间或者模块之间相互的联系,这种联系、关系叫耦合,衡量这种耦合的程度,可以用耦合度来表示,耦合度越高说明类与类之间的联系是越紧密的,也就是相互之间的独立性比较差,也就是一个类必须依靠另外一个类才有意义,才能存在。耦合度越低,越容易重用,类也比较灵活。

错误案例1:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 单一职责_SRP_
{
    /// <summary>
    /// 会计类
    /// </summary>
    public class Accountant
    {
        /// <summary>
        /// 计算工资
        /// </summary>
        public void CalculateSalary()
        {
           // 计算工资
        }

        /// <summary>
        /// 存储数据
        /// </summary>
        public void Store()
        {
           // 存储数据
        }
    }
}

在上面的代码中定义了一个会计类,类里面有两个方法:计算工资和存储数据。一个类里面有两个职责,并且引起这个类变化的原因有很多种:一个是计算工资的方法的参数的变化会影响类的变化,存储数据的方法的变化也会影响类的变化,没有很好的实现单一职责原则,应该把计算工资和存储数据分开。

错误案例2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace 单一职责_SRP_
{
    public interface IDao
    {
        // 获取数据库连接
        SqlConnection GetConnection();
        // 关闭连接
        void Close();
        // 执行添加、更新、删除操作
        void ExecuteUpdate(string strSQL);
        // 执行查询操作
        DataSet ExecuteQuery(String strSQL);
    }
}

上面的代码中定义了一个数据访问类,里面有两个方法:数据链接、执行增删改查的操作。数据链接一般和配置文件关联比较大。如果配置文件没有配置好、或者数据库服务没有开启,那么数据库链接可能就打不开。执行增删改查主要和SQL语句有关系。最理想的设计应该是把与数据链接有关的操作封装成一个类,把执行增删改查的操作封装到另外一个类中。

在上面的两个错误案例中,一个类都实现了两个职责,而不是一个职责,不符合单一职责的原则。这样设计类不是最完美的,建议按照单一职责的原则细分成两个类,这样就能实现高内聚低耦合。

代码下载链接:点此下载

到此这篇关于C#面向对象设计单一职责原则的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#检查字符串是否是合法URL地址的方法

    C#检查字符串是否是合法URL地址的方法

    这篇文章主要介绍了C#检查字符串是否是合法URL地址的方法,涉及C#字符串判断的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 改进c# 代码的五个技巧(二)

    改进c# 代码的五个技巧(二)

    这篇文章主要介绍了改进c# 代码的五个技巧(二),帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-01-01
  • ZooKeeper 实现分布式锁的方法示例

    ZooKeeper 实现分布式锁的方法示例

    这篇文章主要介绍了ZooKeeper 实现分布式锁的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • C#程序启动项的设置方法

    C#程序启动项的设置方法

    这篇文章主要为大家详细介绍了C#程序启动项的设置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • c# 控件截图的简单实例

    c# 控件截图的简单实例

    这篇文章介绍了c# 控件截图的简单实例,有需要的朋友可以参考一下
    2013-10-10
  • C#利用PrintDocument定制打印单据的小例子

    C#利用PrintDocument定制打印单据的小例子

    这篇文章主要给大家介绍了关于C#利用PrintDocument定制打印单据的小例子,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 提高C# StringBuilder操作性能优化的方法

    提高C# StringBuilder操作性能优化的方法

    本篇文章主要介绍使用C# StringBuilder 的项目实践,用于减少内存分配,提高字符串操作的性能。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法

    解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法

    本篇文章是对C#中WebBrowser的DocumentCompleted事件不执行解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#删除整个目录及子目录的方法

    C#删除整个目录及子目录的方法

    这篇文章主要介绍了C#删除整个目录及子目录的方法,涉及C#操作目录删除的相关技巧,需要的朋友可以参考下
    2015-04-04
  • 基于WPF实现裁剪图像功能

    基于WPF实现裁剪图像功能

    这篇文章主要为大家详细介绍了如何基于WPF实现裁剪图像功能,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2023-06-06

最新评论