Изучение статики в объектно-ориентированном программировании с помощью TypeScript

Объектно-ориентированное программирование (ООП) — это мощная парадигма, которая позволяет разработчикам организовывать и структурировать свой код модульным и пригодным для повторного использования образом. Одной из важных концепций ООП является статика, которая является членами класса и является общим для всех экземпляров этого класса. В этой статье мы рассмотрим статику в контексте TypeScript, статически типизированной надстройки JavaScript, а также обсудим различные методы и варианты использования статики в TypeScript.

Что такое статика?
В TypeScript статика — это свойства или методы, принадлежащие самому классу, а не его экземплярам. Доступ к ним осуществляется по имени класса без необходимости создания экземпляра класса. Статические члены определяются с помощью ключевого слова staticв TypeScript.

Давайте рассмотрим несколько примеров использования статики в TypeScript.

  1. Статические свойства.
    Статические свойства используются для хранения данных, которые являются общими для всех экземпляров класса. Вот пример:
class Circle {
  static PI: number = 3.14;
  radius: number;
  constructor(radius: number) {
    this.radius = radius;
  }
  getArea(): number {
    return Circle.PI * this.radius * this.radius;
  }
}
const circle1 = new Circle(5);
const circle2 = new Circle(10);
console.log(circle1.getArea()); // Output: 78.5
console.log(circle2.getArea()); // Output: 314
console.log(Circle.PI); // Output: 3.14

В приведенном выше примере свойство PIобъявлено как статическое и доступно без создания экземпляра класса Circle.

  1. Статические методы.
    Статические методы — это функции, которые можно вызывать в самом классе без необходимости использования экземпляра класса. Они полезны для служебных функций или операций, которые не относятся к конкретному экземпляру. Вот пример:
class MathUtils {
  static sum(a: number, b: number): number {
    return a + b;
  }
  static average(numbers: number[]): number {
    const sum = numbers.reduce((acc, num) => acc + num, 0);
    return sum / numbers.length;
  }
}
console.log(MathUtils.sum(5, 10)); // Output: 15
const numbers = [1, 2, 3, 4, 5];
console.log(MathUtils.average(numbers)); // Output: 3

В приведенном выше примере методы sumи averageобъявлены как статические и могут вызываться непосредственно в классе MathUtils.

  1. Шаблон Singleton:
    Статику также можно использовать для реализации шаблона Singleton, в котором может существовать только один экземпляр класса. Вот пример:
class Database {
  private static instance: Database | null = null;
  private constructor() {
    // Private constructor to prevent instantiation
  }
  static getInstance(): Database {
    if (!Database.instance) {
      Database.instance = new Database();
    }
    return Database.instance;
  }
  connect(): void {
    // Database connection logic
  }
}
const db1 = Database.getInstance();
const db2 = Database.getInstance();
console.log(db1 === db2); // Output: true

В приведенном выше примере метод getInstanceобъявлен как статический и гарантирует создание только одного экземпляра класса Database.

Статика в TypeScript позволяет определять свойства и методы, которые являются общими для всех экземпляров класса. Доступ к ним осуществляется по имени класса, и они полезны для таких сценариев, как общие данные, служебные функции и реализация шаблонов проектирования, таких как шаблон Singleton. Используя статику, разработчики могут писать более чистый и эффективный код.