zoukankan      html  css  js  c++  java
  • 面向对象设计原则—单一、开闭、里氏替换原则

     昨天公司培训了面向对象设计原则—单一、开闭、里氏替换原则,听过之后感触很多,因为刚进公司,之前的代码毫无原则可言,乱乱糟糟的,之后按照规范重构,

    很痛苦,感觉自己的代码就像是一坨翔,赶脚大姨夫捉急的都快提前了,代码规范这四个字真的是给我印象很深刻。

    一。单一原则

    定义:单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行(功能平行,意味着没有依赖)。(摘自百科全书)

    这个我觉得他的字面意思应该是蛮好理解的,而且在前端中的话用的是比较多的,可以说无处不在吧,我的理解的话就是封装

     /**
       * @author 周靖松
       * @description:GET点击修改
       * @param id
       * @return: 
       */
      getUpdate(id) {
        return Vue.http
          .get(path + "/api/list/tabel/get/item/" + id)
      },

    职责单一,请求就行

    之前的代码我不是这样写的。。。之前什么传参  then() 赋值  云云一些 全堆一起,想想真觉得脑壳痛

    二。开闭原则

    定义:开闭原则是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。

    对于扩展是开放的,对于修改是关闭的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。(百科全书)

    //book 类
        class book{
            constructor(e){
                this.name=e.name
                this.money=e.money
            }
            look(){
                console.log(this.name,"这本书",this.money,"元")
            }
        }
    
    
        //正常一本书的价格
        js = new book({
            name:"js",
            money:10086
        })
        js.look()
    
    
        //比如现在想打折一本jq
        class Discount{//打折
            constructor(name,money){
                this.name=name,
                this.money=money*0.5
                return this.name + this.money 
            }
           
        }
        DiscountJq= new Discount("jq",10010)
        jq =new book (DiscountJq)
    
        jq.look()

    对于扩展是开放的 比如打折的话可以写一个打折的功能 然后根据需求去使用,如果更改了父类的方法的话就会出现其他子类一起跟着变动

    “开放”是为了更好的扩展,适应更多的相应需求。“关闭”是为了降低耦合,降低了维护难度和制作成本。

    开闭原则是设计原则的基石,在所有的设计原则里边都能看到开闭原则的影子,比如说 下边要说的里氏替换。

    三。里氏替换

    定义:派生类(子类)对象可以在程式中代替其基类(超类)对象。(百科全书)

    说白了里氏替换原则,想表达的就是父类可以使用的方法,子类就一定要可以使用并达到相同的效果,但是反过来不一定

    比如说子类可以拥有自己的方法

    子类可以实现父类的抽象方法,但是不能覆盖。下边看一下违反了里氏替换会怎么样

      //book 类
        class book{
            constructor(e){
                this.name=e.name
                this.money=e.money
            }
            look(){
                console.log(this.name,"这本书",this.money,"元")
            }
        }
    
    
        //子类
        class subBook extends  book{
            look(){
                console.log(this.name,"这本书白送")
            }
        }
        
        
    
        subBookA =new book({
            name:"js",
            money:10000
        })
        subBookB =new subBook({
            name:"js",
            money:10000
        })
    
    
        subBookA.look()
        subBookB.look()

    结果就是。。。。白瞎1W块   因为在创建实例的时候 ,原型链是会先从实例上找的  找不到的话 才会往下找,

    subBookB   new的子类  就等于实现了类似于重写的这么一个过程,他会先找子类的look  找到了 就不会取用父类的look了,解决方案晚上回来补充

  • 相关阅读:
    《算法导论》读书笔记--第三章函数的增长 课后题
    《利用python进行数据分析》读书笔记--第五章 pandas入门
    《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算
    《利用python进行数据分析》读书笔记--第三章 ipython使用
    《算法导论》读书笔记--第三章 函数的增长
    《利用python进行数据分析》读书笔记 --第一、二章 准备与例子
    《R语言实战》读书笔记--学习张丹日志
    《R语言实战》读书笔记 第七章--基本统计分析
    解决Mybatis-plus高版本不向后兼容的问题
    【Javascript】: for循环中定义的变量在for循环体外也有效
  • 原文地址:https://www.cnblogs.com/netUserAdd/p/10422419.html
Copyright © 2011-2022 走看看