Принцип открыто-закрыто — второй принцип SOLID для написания чистого кода. Если вы не читали о Принципе единой ответственности, вам следует прочитать его здесь.

Принцип Open Close прост. Ваш код должен быть открыт для расширения, но закрыт для модификации. Возьми….? Конец блога.

Шучу, надеюсь, жизнь была бы такой простой. Чтобы объяснить, давайте рассмотрим пример.

Представьте, что вы создаете приложение для компании, которая производит электронные гаджеты, такие как телефоны, смарт-часы, ноутбуки и т. д. Вам нужно написать функцию, чтобы получить цену на эти гаджеты (цена фиксирована для определенного типа гаджета). Ниже приведен один из способов написания этой функции.

const getGadgetPrice = (gagdet) => {
  if (gadget.type === 'phone') {
    return 300;
  } else if (gadget.type === 'smartWatches') {
    return 100;
  } else if (gadget.type === 'laptop') {
    return 500;
  } else {
    return new Error("Invalid gadget type");
  }
}

getPrice({
   type: 'phone',
   name: 'GPhone11' 
 });
getPrice({
   type: 'laptop',
   name: 'GBook Pro' 
 });

Хорошо, а как реализовать вышеуказанную функцию? Довольно просто, верно?

Что ж, давайте рассмотрим случай, когда компания хочет добавить новый тип гаджета — наушники. Цена наушников 50. Как бы вы внесли необходимые изменения? Вы можете сделать что-то вроде ниже: -

const getGadgetPrice = (gagdet) => {
  if (gadget.type === 'phone') {
    return 300;
  } else if (gadget.type === 'smartWatches') {
    return 100;
  } else if (gadget.type === 'laptop') {
    return 500;
  } else if (gadget.type === 'earphones') {
    return 50;
  } else {
    return new Error("Invalid gadget type");
  }
}

Итак, мы только что изменили существующую функцию getPrice. Это то, чего мы хотим избежать в соответствии с принципом «Открыто-Закрыто». Мы хотим, чтобы наши функции/классы/модули были закрыты для модификации.

Итак, как мы можем внести необходимые изменения, не меняя функции? На самом деле, мы можем сделать что-то вроде следующего: -

class Phone {
  constructor(name) {
    this.name = name;
    this.price = 300;
  }

  getPrice() {
    return this.price;
  }
}

class SmartWatch {
  constructor(name) {
    this.name = name;
    this.price = 100;
  }

  getPrice() {
    return this.price;
  }
}

class Laptop {
  constructor(name) {
    this.name = name;
    this.price = 500;
  }

  getPrice() {
    return this.price;
  }
}

const getGadgetPrice = (gadget) => {
  return gadget.getPrice();
}

getGadgetPrice(new Phone('GPhone11'));

Итак, в приведенном выше примере мы выделили каждый гаджет в отдельный класс и реализовали метод getPrice для получения цены гаджета.

Теперь, если мы хотим добавить наушники в наш список гаджетов, нам просто нужно добавить класс с методом getPrice, и все остальное будет работать. Ниже приведена реализация для класса: -

class Earphone {
  constructor(name) {
    this.name = name;
    this.price = 50;
  }

  getPrice() {
    return this.price;
  }
}

И бум все будет работать. Итак, здесь мы можем расширить поведение нашего кода, не изменяя существующий код, что поощряется принципом открытости и закрытости.

Так что надеюсь, вы получили некоторое представление о принципе Открыто-Закрыто. Если у вас есть какие-либо предложения, не стесняйтесь добавлять их в комментариях ниже. Пожалуйста, хлопайте, если вам понравился материал. Вы можете прочитать больше моих блогов на моем сайте https://blog.csschool.io/