软件设计原则

六大设计原则(C#)

狂风中的少年 提交于 2019-11-27 18:34:31
为什么要有设计原则,我觉得一张图片就可以解释这一切 一、单一职责原则(SRP) 对于一个类而言,应该只有一个发生变化的原因。(单一职责不仅仅是指类) 如果一个模块需要修改,它肯定是有原因的,除此原因之外,如果遇到了其他情况,还需要对此模块做出修改的话,那么就说这个模块就兼具多个职责。举个栗子: 此时我们有个动物类Animal,有个Move()会移动的方法 public class Animal { //动物移动的方法 public void Move(String name) { Console.WriteLine($"动物{name}跑"); } } class Program { static void Main(string[] args) { Animal a = new Animal(); a.Move("狗"); Console.ReadKey(); } } 此时如果传入一个鱼进去就不太合适了,因为鱼是不会跑只会游的 a.Move("鱼"); 此时我们需要兼顾两个职责,第一个就是普通动物移动的方法,第二个就是鱼类的移动方法。我们修改一下,让这一切变得合理一些 第一种 public class Animal { //动物移动的方法 public void Move(String name) { if (name == "狗") { Console.WriteLine($

六大设计原则之开闭原则

江枫思渺然 提交于 2019-11-27 04:57:33
定义:一个软件实体。如类/模块/函都应该对扩展开放,对修改关闭。 问题由来:在软件的生命周期内,因为变化,升级和维护等原因需要对软件原有代码进行修改,可能会给旧代码引入错误,也有可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现。   开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统,开闭原则只定义了对修改关闭,对扩展开放。其实只要遵循前面5中设计模式,设计出来的软件就是符合开闭原则的。    用抽象构建架构,用实现扩展细节 。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保证架构的稳定。而软件中易变的细节,我们用从抽象派生的实现类来进行扩展,当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了,当然前提是抽象要合理,要对需求的变更有前瞻性和预见性。 单一职责原则告诉我们实现类要职责单一; 里氏替换原则告诉我们不要破坏继承关系; 依赖倒置原则告诉我们要面向接口编程; 接口隔离原则告诉我们在设计接口的时候要精简单一; 迪米特法则告诉我们要降低耦合 开闭原则告诉我们要对扩展开发,对修改关闭; 那么如何去遵守这六个原则,对这六个原则的遵守并不是是和否的问题,而是多和少的问题,也就是说,我们一般不会说有没有遵守

六大设计原则快速记忆SOLID

你。 提交于 2019-11-27 04:28:48
常见的面向对象设计的原则,可以简化为SOLID原则,坚固slidi的软件需要遵循的原则。 1、单一职责原则SRP(Single Responsibility Principle) 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 2、开放-关闭原则OCP(Open-Close Principle) 定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 3、里氏替换原则LSP(Liskov Substitution Priciple) 通俗的定义:所有引用基类的地方必须能透明地使用其子类的对象。 更通俗的定义:子类可以扩展父类的功能,但不能改变父类原有的功能。 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。 子类中可以增加自己特有的方法。 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。 4、依赖倒置原则DIP(Dependence Inversion Principle) 所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。 模块间的依赖是通过抽象发生

设计模式-软件设计原则7-合成复用原则

蓝咒 提交于 2019-11-27 00:37:36
合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的。可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类。组合/聚合也称之为黑箱复用,对类以外的对象是无法获取到实现细节的。要根据具体的业务场景来做代码设计,其实也都需要遵循OOP模型。以数据库操作为例,先来创建DBConnection类: 1 package com.lch.test.carp; 2 3 public class DBConnection { 4 public String getConnection() { 5 return "mysql数据库连接"; 6 } 7 } 创建ProductDao类: 1 package com.lch.test.carp; 2 3 public class ProductDao { 4 private DBConnection dbConnection; 5 public void setDbConnection(DBConnection dbConnection){ 6 this.dbConnection = dbConnection; 7 } 8 9

设计模式-软件设计原则3-依赖倒置原则

六眼飞鱼酱① 提交于 2019-11-26 23:11:35
依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节;细节应该依赖抽象 。 通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并能够降低修改程序所造成的风险 。 接下来看一个案例,还是以课程为例,先来创建一个类Tom: 1 package com.lch.test.inversedependency; 2 3 public class Tom { 4 public void studyJavaCourse() { 5 System.out.println("tom正在 学习Java课程"); 6 } 7 8 public void studyPythonCounse() { 9 System.out.println("tom正在学习 python课程"); 10 } 11 } 来调用 一下: 1 package com.lch.test.inversedependency; 2 3 public class StudyCourseTest { 4 public static void main(String[] args) { 5 Tom tom = new Tom(); 6 tom.studyJavaCourse(); 7

设计模式-软件设计原则2-单一职责原则

橙三吉。 提交于 2019-11-26 23:10:00
单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更 的原因。 假设我们有一个 Class 负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能会导致另一个职责的功能发生故障。这样一来,这个 Class 存在两个导 致类变更的原因。如何解决这个问题呢?我们就要给两个职责分别用两个 Class 来实现, 进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的 可 读 性 , 提 高 系 统 的 可 维 护 性 , 降 低 变 更 引 起 的 风 险 。 总 体 来 说 就 是 一 个 Class/Interface/Method 只负责一项职责。 接下来,我们来看代码实例,还是用课程举例,我们的课程有直播课和录播课。直播课 不能快进和快退,录播可以可以任意的反复观看,功能职责不一样。还是先创建一个 Course 类: 1 package com.lch.test.simpleresponsibility; 2 3 /** 4 * 单一职责 5 */ 6 public class Course { 7 public void study(String courseName) { 8 if ("直播课".equals(courseName)) { 9 System.out.println

面向对象设计原则

不羁岁月 提交于 2019-11-26 15:02:53
很久之前的读书整理内容,躺在草稿里很久了。。。 一、 " 开放-封闭 " 原则 (OCP) Open-Closed Principle原则讲的是:一个软件实体应当对扩展开放,对修改关闭。 优点: 通过扩展已有软件系统,可以提供新的行为,以满足对软件的新的需求,使变化中的软件有一定的适应性和灵活性。 已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。 例子:玉帝招安美猴王 当年大闹天宫便是美猴王对玉帝的新挑战。美猴王说:"'皇帝轮流做,明年到我家。'只教他搬出去,将天宫让于我!"对于这项挑战,太白金星给玉皇大帝提出的建议是:"降一道招安圣旨,宣上界来…,一则不劳师动众,二则收仙有道也。" 换而言之,不劳师动众、不破坏天规便是"闭",收仙有道便是"开"。招安之道便是玉帝天庭的"开放-封闭"原则。 招安之法的关键便是不允许更改现有的天庭秩序,但允许将妖猴纳入现有秩序中,从而扩展了这一秩序。用面向对象的语言来讲,不允许更改的是系统的抽象层,而允许更改的是系统的实现层。 二、 里氏代换原则( LSP ) Liskov Substitution Principle(里氏代换原则):子类型(subtype)必须能够替换它们的基类型。 白马、黑马 都可以替换马的类型。 反过来的代换不成立 《墨子·小取》说:"娣,美人也,爱娣,非爱美人也……"娣便是妹妹