Введение

Шаблоны проектирования — это многоразовые решения общих проблем программирования, которые были идентифицированы и задокументированы с течением времени опытными программистами. Они обеспечивают способ стандартизации дизайна кода и улучшения разработки программного обеспечения. Node.js, будучи популярной платформой для создания масштабируемых и высокопроизводительных приложений, также следует шаблонам проектирования для решения распространенных проблем. В этой статье мы обсудим важность шаблонов проектирования в Node.js и предоставим несколько примеров кода.

Зачем нам нужны шаблоны проектирования в Node.js?

Шаблоны проектирования обеспечивают структурированный подход к решению повторяющихся проблем при разработке программного обеспечения. В Node.js эти шаблоны помогают разработчикам писать более качественный, поддерживаемый и масштабируемый код. Шаблоны проектирования в Node.js также помогают улучшить качество кода, сократить время разработки и количество ошибок. Они также предоставляют общий словарь для разработчиков, чтобы общаться друг с другом.

Примеры кода

Синглтон шаблон

Шаблон Singleton используется для обеспечения того, чтобы был создан только один экземпляр класса, и этот экземпляр был доступен во всем приложении. Этот шаблон используется в Node.js, чтобы гарантировать наличие только одного экземпляра модуля.

class Singleton {
  constructor() {
    if (Singleton.instance) {
      return Singleton.instance;
    }
    Singleton.instance = this;
  }

  // Your code here
}

module.exports = Singleton;

Заводской узор

Шаблон Factory используется для создания объектов без раскрытия логики создания клиенту. В Node.js этот шаблон используется для создания экземпляров разных классов на основе предоставленных входных данных.

class Car {
  constructor(name) {
    this.name = name;
  }
  drive() {
    console.log(`Driving ${this.name}`);
  }
}

class CarFactory {
  static create(name) {
    return new Car(name);
  }
}

const car1 = CarFactory.create("BMW");
const car2 = CarFactory.create("Audi");

car1.drive(); // Driving BMW
car2.drive(); // Driving Audi

Шаблон наблюдателя

Шаблон Observer используется для ведения списка зависимых объектов, которые должны быть уведомлены, когда происходит изменение наблюдаемого объекта. В Node.js этот шаблон используется для управления событиями и обратными вызовами.

class EventObserver {
  constructor() {
    this.observers = [];
  }

  subscribe(fn) {
    this.observers.push(fn);
  }

  unsubscribe(fn) {
    this.observers = this.observers.filter(subscriber => subscriber !== fn);
  }

  notify(data) {
    this.observers.forEach(observer => observer(data));
  }
}

const eventObserver = new EventObserver();

eventObserver.subscribe(data => console.log(`Subscribed to ${data}`));
eventObserver.notify("some data");

Шаблон внедрения зависимостей

В этом примере мы определяем класс UserService, который зависит от объекта database. Мы внедряем объект database в конструктор UserService, что позволяет нам использовать различные реализации базы данных без изменения класса UserService.

// File: userService.js

class UserService {
  constructor(database) {
    this.database = database;
  }

  getUser(id) {
    return this.database.query(`SELECT * FROM users WHERE id = ${id}`);
  }
}

module.exports = UserService;

Образец обещания

В этом примере мы используем модуль fs.promises для асинхронного чтения файла. Функция readFile возвращает обещание, которое разрешается с содержимым файла или отклоняется с ошибкой. Мы используем метод then для регистрации содержимого файла, если обещание разрешено, и метод catch для регистрации ошибки, если обещание отклонено.

// File: fileReader.js

const fs = require('fs').promises;

function readFile(filePath) {
  return fs.readFile(filePath, 'utf8');
}

readFile('example.txt')
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error(error);
  });

встроенные модули

Сам Node.js по умолчанию не использует какие-либо определенные шаблоны проектирования в своих функциях, но предоставляет встроенные модули, которые следуют общим шаблонам проектирования. Вот некоторые из наиболее часто используемых шаблонов проектирования в Node.js:

Шаблон модуля

Node.js по умолчанию использует шаблон модуля для организации кода в повторно используемые и поддерживаемые модули. В Node.js каждый файл рассматривается как модуль, и разработчики могут экспортировать или импортировать код между файлами, используя операторы «require» и «module.exports».

Управляемый событиями шаблон

Node.js использует управляемый событиями шаблон для обработки операций ввода-вывода, таких как чтение и запись данных в файлы или сетевые сокеты. Управляемый событиями шаблон основан на шаблоне Observer и позволяет разработчикам создавать генераторы событий, которые могут уведомлять слушателей при возникновении определенных событий.

Одноэлементный шаблон

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

Заводская выкройка

Node.js использует шаблон Factory в своих встроенных модулях, таких как модуль «http», который предоставляет фабричный метод для создания HTTP-серверов.

Шаблон обратного вызова

Node.js использует шаблон обратного вызова для обработки асинхронных операций, таких как чтение и запись файлов или выполнение сетевых запросов. Шаблон обратного вызова основан на шаблоне Observer и позволяет разработчикам передавать функции в качестве аргументов, которые будут выполняться после завершения операции.

Другие модули

Шаблон ПО промежуточного слоя

Промежуточное ПО — это шаблон проектирования, обычно используемый в средах Node.js, таких как Express.js. Функции промежуточного программного обеспечения — это функции, которые выполняются в конвейере, где каждая функция может изменять объекты запроса или ответа перед передачей их следующей функции. ПО промежуточного слоя можно использовать для таких задач, как аутентификация, ведение журнала, обработка ошибок и многое другое.

Шаблон внедрения зависимостей

Шаблон внедрения зависимостей (DI) — это шаблон проектирования, используемый для управления зависимостями между объектами. В Node.js DI можно использовать для внедрения зависимостей в модули, чтобы сделать их более модульными и пригодными для повторного использования. DI может быть реализован с использованием таких методов, как внедрение конструктора, внедрение свойства или внедрение метода.

Образец обещания

Шаблон Promise — это шаблон проектирования, используемый для обработки асинхронных операций более структурированным и синхронным способом. Промисы — это объекты, которые представляют возможное завершение или сбой асинхронной операции, и они позволяют разработчикам писать более читаемый и удобный для сопровождения код, объединяя асинхронные операции вместе.

Заключение

Шаблоны проектирования обеспечивают структурированный подход к решению общих проблем программирования в Node.js. Они помогают разработчикам писать более качественный, поддерживаемый и масштабируемый код. Шаблоны проектирования также предоставляют разработчикам общий словарь для общения друг с другом. Эти и другие шаблоны необходимы для написания высококачественного кода в Node.js.

Посетите меня на ben.dev.io