编程思想:面向对象(OOP)、面向过程(OPP)

2022-11-12· 10min

#面向对象(OOP)

#定义

  • 面向对象编程(Object Oriented Programming),以类或对象为组织代码的基本单元,并将 封装、抽象、继承、多态 四个特性,作为代码设计和实现的基石。
    • 封装: 将数据和操作封装在对象内部,暴露有限的访问接口。
    • 抽象: 方法的实现。
    • 继承: 对象(子类)可以继承另一个对象(父类)的属性和方法。
    • 多态: 利用接口类、Duck Typing 的特性实现多态,子类可以代替父类。

#优势

  • 可维护性:将代码组织成对象的形式,易于理解和维护。
  • 可复用性:通过继承和多态,有效地复用代码。
  • 可扩展性:通过继承和多态来扩展代码,适应不同的需求变化。

#例子1

class People {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  getName() {
    return `Halo, my name is ${this.name}.`;
  }
}

const peopleTom = new People("Tom", 24);
console.log(peopleTom.getName()); // Halo, my name is Tom.

class SuperMan extends People {
  constructor(name, age, fly) {
    super(name, age);
    this.fly = fly;
  }

  getName() {
    return `Ok, I'm ${this.name}.`;
  }

  canFly() {
    return this.fly ? "Yes." : "No.";
  }
}

const superManJunny = new SuperMan("Junny", 20, true);
console.log(superManJunny.getName()); // Ok, I'm Junny.
console.log(superManJunny.canFly()); // Yes.

#例子2

class Circle {
  constructor(radius) {
    this.radius = radius;
  }

  getArea() {
    return Math.PI * this.radius ** 2;
  }

  getCircumference() {
    return 2 * Math.PI * this.radius;
  }
}

const circle = new Circle(2);
console.log(circle.getArea()); // ≈ 12.57

#设计思想与原则(SOLID)

  • SOLID 是一个面向对象设计和编程中的五个基本原则的缩写

#单一职责原则(SRP, Single Responsibility Principle)

  • 一个类或者模块只负责完成一个职责(或者功能)
class Man {
  doWork() {}
}
class ManFree {
  takeHoliday() {}
}

#开放/封闭原则(OCP, Open/Closed Principle)

  • 类、模块、函数等应该对扩展开放,对修改关闭。即:一个模块在扩展新功能时不应该修改原有的代码,而是通过添加新的代码来实现扩展。
class People {
  constructor(name) {
    this.name = name;
  }
  sleep() {
    console.log(`${this.name} can sleep.`);
  }
}

class Coder extends People {
  constructor(name) {
    super(name);
  }
  writeCode() {
    console.log(`${this.name} can write code.`);
  }
}

var cer = new Coder("Tom");
cer.sleep();
cer.writeCode();

#里氏替换原则(LSP, Liskov Substitution Principle)

  • 在任何需要基类的地方,都可以使用子类而不产生错误(子类不破坏基类原有的约定)

#接口隔离原则(ISP, Interface Segregation Principle)

  • 不应该让一个类依赖它不需要的接口
  • 一个类对另一个类的依赖应该建立在最小的接口上
class Coder {
  writeCode() {}
}

class Cat {
  sleep() {}
}

#依赖反转原则(DIP, Dependency Inversion Principle)

  • 倡导通过抽象来解耦高层和低层模块之间的依赖关系

#面向过程(OPP)

#定义

  • 面向过程编程(Procedure Oriented Programming),以过程(方法、函数、操作)作为组织代码的基本单元,通过拼接一组顺序执行的方法来操作数据完成一项功能。
    • 操作过程化
    • 数据和函数分离
    • 可复用性较低

#优势

  • 简单易懂
  • 资源消耗少
  • 执行效率高
  • 易于调试和维护

#例子

const getArea = (radius) => {
  return Math.PI * radius ** 2;
};

const getCircumference = (radius) => {
  return 2 * Math.PI * radius;
};

console.log(getArea(2)); // ≈ 12.57