loading...

SOLID là gì ?

nasterblue profile image Naster Blue Updated on ・2 min read

SOLID là 5 nguyên lý trong thiết kế phần mềm giúp code trở nên dễ hiểu, linh động và dễ bảo trì hơn. 5 nguyên lý trong SOLID bao gồm:

  • S: Single responsibility principle
  • O: Open/closed principle
  • L: Liskov substitution principle
  • I: Interface segregation principle
  • D: Dependency inversion principle

S — Single Responsibility Principle (SRP)

A class should have only a single responsibility.
Một class nên chỉ xử lý đơn nhiệm.

class Accountant
{
    codeJS() : void ;
}

=> correct it
Nhiệm vụ code JS nên được giao cho developer JS.

class JSDeveloper{
     codeJS() : void ;
}

Accountant chỉ nên làm việc liên quan tới kế toán như : về bảng lương, hóa đơn, hồ sơ giấy tờ.

class Accountant
{
    prepareAccountsAndTaxReturns() : void ;
    administerPayrolls() : void ;
    controllingIncomeAndExpenditure() : void ;
}

O — Open-Closed Principle

Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
Nên mở rộng/kế thừa các class đã tồn tại thay vì sửa đổi chúng.

class ReactJSDeveloper extends JSDeveloper
{
    codeReactJS() : void ;
}

Một JSDeveloper ngoài biết code JS thuần ra về lâu dài còn có khả năng học và code React JS với tư duy reactive.

L — Liskov Substitution Principle

Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
Các đối tượng của class cha có thể được thay thế bởi các đối tượng của các class con mà không làm thay đổi tính đúng đắn của chương trình.

class ReactJSDeveloper extends JSDeveloper
{
    codeJS(): void {
      //  override code logic
    }
}

ReactJS Developer ngoài biết code ReactJs mà còn phải biết code JS thuần.

I — Interface Segregation Principle

Many client-specific interfaces are better than one general-purpose interface.
Nên tách thành nhiều interface nhỏ cho các mục đích riêng, không nên để 1 interface phình quá to cho nhiều mục đích.

interface IAccountant {
    prepareAccountsAndTaxReturns(): void;
    administerPayrolls(): void;
    controllingIncomeAndExpenditure(): void;
}
interface IJSDeveloper{
   codeJS(): void;
}
interface IReactJsDeveloper extends IJSDeveloper
{
    codeReactJS(): void;
}

D — Dependency Inversion Principle

Depend on abstractions, not on concretions.
Các module cấp cao không nên phụ thuộc vào các module cấp thấp. Cả hai nên phụ thuộc vào abstraction.
Abstraction không nên phụ thuộc vào detail. Detail nên phụ thuộc vào abstraction.

class VueJSDeveloper  extends IJSDeveloper
{
    codeJS(): void {
        // override improve JS performance
    }
    codeVueJS(): void ;
}
class WebProject{
    private jsDeveloper : IJSDeveloper;
    constructor(jsDeveloper VueJSDeveloper){}
    kickOff(): void {
        jsDeveloper.codeJS();
    }
}

Khi lựa chọn developer cho Frontend dự án thì có thể chọn VueJS Developer làm đầu vào.
Dự án tiếp theo có thể chọn ReactJS Developer làm frontend.

Discussion

pic
Editor guide