单一职责原则

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

设计模式的六大原则:面向对象语言开发过程中,推荐的一些指导性原则;没有明确的招数,而且也会经常被忽视/违背;也是前辈总结,也是为了站在前辈的肩膀上。

单一职责原则(SRP):一个类只做一件事儿,一个方法也应该只做一件事儿.

如下代码就违背了单一职责原则

复制代码
public class Animal
{

    public string _Name = string.Empty;
    public Animal(string Name)
    {
        this._Name = Name;
    }

    public void Eat()
    {
        if (this._Name.Equals("熊猫"))
            Console.WriteLine("这个动物吃竹子");
        else if(this._Name.Equals("猫头鹰"))
            Console.WriteLine("这个动物吃虫子");
    }

    public void Action()
    {
        if (this._Name.Equals("熊猫"))
            Console.WriteLine("这个动物可以跑");
        else if (this._Name.Equals("猫头鹰"))
            Console.WriteLine("这个动物可以飞");
    }
}
复制代码
复制代码
static void Main(string[] args)
{
    {
        Animal animal = new Animal("熊猫");
        animal.Eat();
        animal.Action();
    }
    {
        Animal animal = new Animal("猫头鹰");
        animal.Eat();
        animal.Action();
    }
    Console.ReadKey();
}
复制代码

几乎每加一个动物就要加一个分支... ...

将职责进行拆分,重构代码

复制代码
public abstract class Animal
{

    protected string _Name = string.Empty;
    public Animal(string Name)
    {
        this._Name = Name;
    }

    public abstract void Eat();

    public abstract void Action();

}
复制代码
复制代码
/// <summary>
/// 每个类做自己的事儿
/// </summary>
public class AnimalOwl : Animal
{
    public AnimalOwl(string Name) : base(Name)
    {

    }

    public override void Eat()
    {
        Console.WriteLine($"{this._Name}吃虫子");
    }

    public override void Action()
    {
        Console.WriteLine($"{this._Name}可以飞");
    }
}
复制代码
复制代码
/// <summary>
/// 每个类做自己的事儿
/// </summary>
public class AnimalPanda : Animal
{
    public AnimalPanda(string Name) : base(Name)
    {

    }

    public override void Eat()
    {
        Console.WriteLine($"{this._Name}吃竹子");
    }

    public override void Action()
    {
        Console.WriteLine($"{this._Name}可以跑");
    }
}
复制代码
复制代码
static void Main(string[] args)
{
    {
        Animal animal = new AnimalPanda("熊猫");
        animal.Eat();
        animal.Action();
    }
    {
        Animal animal = new AnimalOwl("猫头鹰");
        animal.Eat();
        animal.Action();
    }
    Console.ReadKey();
}
复制代码

拆分之后,职责变的单一。阅读简单,易于维护。扩展升级,减少修改,直接增加类。简单--稳定--强大。

单一职责的成本:类变多了,上端需要了解更多的类。要衡量着使用:如果类相对稳定,扩展变化少而且逻辑简单,违背单一职责也没关系。

如果一个类承担的职责过多,这些职责在程序中就会过度耦合,不利于扩展。

总结:

复制代码
方法层面:方法里有多个分支(if{} else{}),还可能扩展变化,最好拆成多个方法。

接口层面:将不同业务的接口进行独立。

类层面:一个类只做一件事儿。

类库层面:把项目拆分为多个类库。

项目:一个项目应该职责要清晰(客户端/管理后台/后台服务/定时任务/... ...)

系统:将各服务承担的不同功能拆分为独立系统(IP定位/日志/在线统计)
复制代码

作者:江北

出处:https://www.cnblogs.com/zhangnever/p/13235868.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

微信:CodeDoraemon

posted @   江北、  阅读(222)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
晓看天色暮看云