架构整洁之道-02 编程范式-面向对象编程

296 阅读3分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

编程范式:范式是编程的方式,和语言无关。主要有三种方式:结构化编程、面向对象编程、函数式编程。

一个好的架构的基础是对面向对象设计的原理的理解和应用

面向对象是什么

把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。就是把现实中的事物都抽象成程序设计的“对象”。所以在很多面向对象编程语言的书籍中,都会说的一种答案:模拟现实世界的一种方式,即将世界所有的东西都对象化。

面向对象的本质:封装,继承和多态。这是面向对象语言必须支持的三件事。先从这些概念学习下。

封装

  • 把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单元(即对象)中;
  • 另一层含义指“信息隐藏”,只有一部分函数知道这部分信息,如一个类的私有数据成员和公共成员函数
class UserInfo {
  public name: string;
  private age: string;
​
  getAge(name: string) {
    return this.age;
  }
}

UserInfo对象将 name 和 age 属性,以及getAge的行为封装成一个对象。通过使用相关修饰符对属性或方法,控制这部分信息可否被外界访问到。其中,age是个私有属性仅能在对象内部请求到,如果外部使用UserInfo对象是无法访问到的。

继承

继承就是在一个封闭范围内重新声明一组变量和函数。子类继承父类的特征和行为,使得子类对象具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

   class BaseEntity {
      public name: string;
      public age: string;
​
   }
​
   class User extends BaseEntity {
      constructor(){
         super()
      }
   }

继承提高了类代码的复用性,提高代码的维护性,使用类和类之间产生了关系,这也是多态的前提,当然这也导致了类的耦合性提高

多态

多态是同一个行为具有多个不同表现形式或形态的能力。在TypeScript中经常实现方式是父类定义一个方法不去实现,让继承他的子类去实现,每一个子类有不同的表现

   class Operate {
      getName(): any {
         console.log('op-name')
      }
      getList(): any  {
         console.log('op-list')
      }
   }
​
   class UserOperate extends Operate {
      getName(): any {
         console.log('op-child-name')
      }
      getList(): any  {
         console.log('op-child-list')
      }
   }

多态存在三种条件:继承、充血、父类引用指向子类。

面向对象是通过使用多态性来获得对系统中每个源代码依赖的绝对控制的能力。它允许架构师创建一个插件架构,其中包含高层策略的模块独立于包含低层细节的模块。底层的细节被放到插件模块中,这些插件模块可以独立于包含高层策略的模块进行部署和开发。