SOLID原则是面向对象编程和面向对象设计的头五大原则。学习及应用这五大原则可以构建一个易于维护和扩展的应用程序,我们一起看看到底是那五大原则。

  • S--单一责任原则(SRP) --Single Responsibility Principle
  • O--开放封闭原则(OCP)-- Open-Closed  Principle
  • L--里式替换原则(LSP)-- Liskov Substitution Principle
  • I –- 接口分离原则(ISP)--Interface Segregation Principle
  • D–-依赖倒置原则(DIP)-- Dependency Inversion Principle

 

一、单一责任原则(SRP)

单一责任原则指出当需要修改某个类的时候原因有且只有一个。也就是说一个类应该只负责一件事情。当这个类需要去做其他的事情的时候,就需要分解这个类。如果把多个功能放在一个类中要它负责,

那么各个功能之间会形成关联,改变其中一个功能可能会牵连其他的功能的改变,这样有需要花费时间和人力对其他功能的改变进行测试,保证其他功能的完整。

Ex:

一个有关长方形的类,长、宽、面积。后来需要增加正方形,就继续使用长方形的类,使用的时候长=宽。这一种情况违背了SRP原则,一个类只负责一件事情,这个时候应该新建一个正方形的类。

二、开放封闭原则(OCP)

开放封闭原则指的是程序模块应该遵循关闭修改,开放扩展。这里与单一责任原则很好的联系在了一起。一个类只负责一件事情。在程序模块中当业务更改或新增的时候不应该更改现有的代码行为,

应该转向开放扩展。其中一个方法是通过抽象方法,然后继承已达到扩展的想法。

Ex:

还是上面那个例子,最开始是计算长方形的面积,然后增加了正方形面积的计算。遵循关闭修改开放扩展的原则,不修改现有的代码行为。将计算方法抽象继承已扩展。新加正方形计算方法。

public interface Calculate
{
decimal CalculateArea(decimal longs, decimal wide=);
} public class Rectangle : Calculate
{
public decimal CalculateArea(decimal longs,decimal wide)
{
decimal s = longs * wide;
return s;
}
} public class Square : Calculate
{
public decimal CalculateArea(decimal longs, decimal wide)
{
decimal s = longs * longs;
return s;
}
}

三、里氏替换原则(LSP)

子类型必须可替代其基类型 –一个对象出现的地方都可以由其子类代替并且不会出错,即是符合里氏替换原则的。

Ex:

       狗和鸟同时都具备很多相同特征,可以走、跑、叫,以鸟作为基类,狗作为子类,会出现子类不能替换基类的情况,基类鸟可以飞,但是子类狗不能。这样不就符合里氏替换原则。可以考虑以狗走位基类,鸟作为子类,然后鸟扩展一个飞的属性。或者两者都作为子类,抽象出一个基类,动物类。满足子类可以任意替换基类的情况都是符合里氏替换原则的。

   

class Program
{
static void Main(string[] args)
{
Animal animal = new Dog();
Console.WriteLine(animal.Walk());
Console.WriteLine(animal.Run());
Console.WriteLine(animal.Fly());
Console.WriteLine(animal.MakeNoise());
Console.ReadLine();
}
} public class Animal
{
public string Walk()
{
return "Move feet";
} public string Run()
{
return "Move feet quickly";
} public virtual string Fly()
{
return null;
} public virtual string MakeNoise()
{
return null;
}
} public class Dog : Animal
{
public override string MakeNoise()
{
return "Bark";
}
} public class Bird : Animal
{
public override string MakeNoise()
{
return "Chirp";
} public override string Fly()
{
return "Flag wings";
}
}

四、接口分离原则(ISP)

接口分离原则—client不应该被强迫依赖它不使用的方法,表明方法是分开或者隔离的。这个原则还强制实现高凝聚力,让您更好地理解,更强大的类和低耦合,更容易维护,更容易抵抗变化(即不太可能引入错误)。

Ex:

public interface Animal
{
string Run();
string Fly();
} public class Dog : Animal
{
public string Fly()
{
return string.Empty;
} public string Run()
{
return "小狗,快跑";
}
} public class Bird : Animal
{
public string Fly()
{
return "小鸟,快飞";
} public string Run()
{
return "小鸟,快跑";
}
}

在这段代码中,鸟和狗同时继承了动物,但是在狗实现接口的时候,Fly方法没有做任何操作。这里显然违背了接口分离原则,强迫了Dog类依赖了其Fly方法。

改进方法,可以将动物接口修改成两个接口,AnimalFly接口和AnimalRun接口。这样就遵循了其规则

 

五、依赖倒置原则(DIP)

依赖倒置原则-也是最后一个原则了。其原则指出—一个高级模块不应依赖于低级模块,两个都应该取决于抽象。抽象不应该依赖具体细节,细节应该依赖于抽象。

在这里可以发现依赖倒置原则和前几天讲过的依赖注入的原则十分相似。

六、总结

      

SRP

单一职责原则

一个类应只负责一件事情

OCP

开放封闭原则

封闭修改,开放扩展

LSP

里氏替换原则

一个对象可由其子类代替

ISP

接口分离原则

客户不应被强迫依赖它不使用的方法

DIP

依赖反转原则

抽象不依赖具体,具体依赖于抽象

 

S.O.L.I.D 原则是非常有价值的五大原则,在创建和设计一个应用的时候应用这些原则,你会创建一个非常优秀的项目。


  欢迎大家扫描下方二维码,和我一起学习更多的知识

SOLID原则(OOD&OOP)的更多相关文章

  1. OOD 面向对象面试干货分享| 面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. 简写 全拼 中文翻译 SRP The Single Res ...

  2. SOLID原则

    SOLID是面向对象设计和编程(OOD&OOP)中几个重要编码原则 即:SRP单一责任原则: OCP开放封闭原则: LSP里氏替换原则: ISP接口分离原则: DIP依赖倒置原则. 1. 单一 ...

  3. 【转】面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  4. 面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  5. TypeScript 中的 SOLID 原则

    下面的文章解释了正确使用 TypeScrip的 SOLID原则. 原文地址:https://samueleresca.net/2016/08/solid-principles-using-typesc ...

  6. SOLID原则 【转】

    S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写. 面向对象设计的原则 SRP  The Single ...

  7. SOLID 原则

     世纪的前几年里,“ Uncle Bob”Robert Martin 引入了用OOP 开发软件的五条原 则,其目的是设计出更易于维护的高质量系统.无论是设计新应用程序,还是重构现有基 本代码,这些 S ...

  8. 面向对象的SOLID原则白话篇

    面向对象的SOLID原则 简介 缩写 全称 中文 S The Single Responsibility Principle 单一责任原则 O The Open Closed Principle 开放 ...

  9. OOA/OOD/OOP 转载

    OOA/OOD/OOP OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较 ...

随机推荐

  1. 了解与建设有中国特色的Android M&N(Android6.0和7.0新特性分析)

    http://geek.csdn.NET/news/detail/110434 Android N已经发布有段时间,甚至马上都要发布android 7.1,相信不少玩机爱好者已经刷入最新的Androi ...

  2. Android集成ffmpeg

    1.ffmpeg官网文档地址:https://trac.ffmpeg.org/wiki/CompilationGuide/Android 2.上面页面资源列表里面第一项 https://github. ...

  3. 寻找DevExpress破解经历之旅

    众所周知DevExpress是收费的,但是破解版的也不少,近期公司需要做发票套打的功能让我找个打印工具,我寻思着DevExpress这个软件好像挺不错的,功能强大,看了下价格方面,好吧!2W多呢,市面 ...

  4. win10更新失败——适用于Windows 10 Version 1709 的03累积更新,适合基于x64系统(KB4088776)更新失败

    相信最近很多人被windows的更新折磨坏了,下面来介绍一下解决办法,有用的话请点赞! 首先将C盘中的这个文件夹删除:"C:\Windows\System32\Tasks\Microsoft ...

  5. Total Command使用笔记

    一.快键键(基于水晶2右)以下数字小键盘无效 Tab 左右窗口切换 Ctrl+d 进入工作目录ctrl+d+数字 指定目录alt+←/→ 后退/前进目录ctrl+\ 跳转到根目录Ctrl+b,不分层级 ...

  6. Flask信号和wtforms

    一.信号 1.1.所有内置信号 request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _s ...

  7. https://doc.opensuse.org/projects/kiwi/doc/

    KIWI 是用于创建操作系统映像的系统.映像是带有一个文件的目录,该文件包含操作系统.其应用程序与配置.操作系统的文件系统结构.可能的附加元数据,以及(取决于映像类型)磁盘几何属性和分区表数据.通过 ...

  8. 斐波那契数列第n项的值及前n项之和

    <script>// 算法题 // 题1:斐波那契数列:1.1.2.3.5.8.13.21...// // 一.斐波那契数列第n项的值 // // 方法一//递归的写法function a ...

  9. .Net Core微服务系列--开篇

    记得原来有个项目是用wcf做的分布式,不仅横向根据业务拆分了,纵向把业务处理.数据访问等也拆分了成不同的服务,这个是当时公司的产品我也只是一个小小的开发人员所以就不做太多的评论,只是不得不吐槽下调试真 ...

  10. ps命令手册

    LINFO ps命令   在PS(即,处理状态)命令被用来提供关于当前正在运行的信息的过程,包括它们的过程标识号(PID)来. 过程也称为任务,是程序的执行(即运行)实例.系统为每个过程分配一个唯一的 ...