[第二部分] SOLID Typescript 简介

I - 接口隔离原则(ISP)

**不应强迫客户端实现他们不使用的接口。**

这意味着接口应该很小并且满足实现类的需求。

例如:

❌糟糕

interface Work{
    eat(): void;
    work(): void;
}

class Developer implements Work{
    eat() {
        console.log("eat");
    }
    work() {
        console.log("work");
    }
}
class Robot implements Work{
    eat() {
        throw new Error("eat"); // Robot does not need to inherit eat() method
    }
    work() {
        console.log("work");
    }
}

✅好

interface Workable  {
    work(): void;
}
interface Eatable {
    eat(): void;
}
class Developer implements Workable, Eatable {
    eat() {}

    work(): void {
    }
}

基于接口的强度,一个类可以实现多个接口。你应该将接口分解成更小的部分,以更好地满足你的类的需求

D——依赖倒置原则(DIP)

*

此原则鼓励使用依赖注入

例如:

❌糟糕

class BackendDeveloper {
    develop(){
        console.log("Developing developer");
    }
}
class FrontendDeveloper {
    develop(){
        console.log("FrontendDeveloper");
    }
}
class Project {
    backendDeveloper: BackendDeveloper;
    frontendDeveloper: FrontendDeveloper;
    constructor() {
        this.backendDeveloper = new BackendDeveloper();
        this.frontendDeveloper = new FrontendDeveloper();
    }
    build(){
        this.backendDeveloper.develop();
        this.frontendDeveloper.develop();
    }
}

在代码片段中,存在多个问题。但是,您能看到的最重要的问题是:

  • 如果要添加 MobileDeveloper(),则需要修改 Project(),这会影响使用它的其他方法
  • Project() 与 backendDeveloper 和 frontendDeveloper 紧密耦合
  • ✅好

    interface Developer {
        developer(): void
    }
    class BackendDev implements Developer {
        developer() {
            console.log("Developer Developer");
        }
    }
    class FrontendDeveloper implements Developer {
        developer() {
            console.log("Developer Developer");
        }
    }
    class Project {
        constructor(private developers: Developer[]) {
        }
        build(){
            this.developers.forEach(developer => {developer.developer();});
        }
    }

    高级模块依赖于抽象(开发人员界面)。

    低级模块实现抽象。

    松散耦合使得扩展和维护变得容易。

    添加MobileDev:

    class MobileDeveloper implements Developer {
      develop() {
        console.log("Writing mobile code");
      }
    }
    
    // Usage
    const developers: Developer[] = [
      new BackendDeveloper(),
      new FrontendDeveloper(),
      new MobileDeveloper(), //easy to add and make it does not change in Project()
    ];
    const project = new Project(developers);
    project.build();

    谢谢 :)))