zoukankan      html  css  js  c++  java
  • 单一职责原则

    软件设计模式(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定位/日志/在线统计)
  • 相关阅读:
    【QT 学习笔记】 一、 VS2015+ QT环境安装
    Ubuntu16.04 + caffe + cuda 环境搭建
    【Caffe学习笔记】一 、环境安装 Caffe + cuda + windows10 + VS2015 安装笔记, win7也适用
    【CNN】 吴恩达课程中几种网络的比较
    【图像处理】二 高斯滤波及其加速方法
    【图像处理 】 一、OSTU分割法
    1028: C语言程序设计教程(第三版)课后习题8.2
    函数和带参的宏,从三个数中找出最大的数
    Last Defence (run time error)
    Penalty
  • 原文地址:https://www.cnblogs.com/zhangnever/p/13235868.html
Copyright © 2011-2022 走看看