TypeScript
July 3

Паттерн "Особый случай" в Typescript

Паттерн "Особый случай" (Special Case) используется для обработки крайних случаев или ситуаций, которые не соответствуют обычной логике обработки, с использованием специальных объектов или значений. Этот паттерн помогает уменьшить количество проверок на null или других исключительных случаев в коде, делая его более читаемым и поддерживаемым.

Пример использования паттерна "Особый случай" в TypeScript:

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

typescriptCopy codeclass User {
    constructor(public id: number, public name: string) {}

    getDisplayName(): string {
        return this.name;
    }
}

class NullUser extends User {
    constructor() {
        super(0, 'Guest');
    }

    getDisplayName(): string {
        return 'Guest User';
    }
}

class UserRepository {
    private users: User[];

    constructor() {
        this.users = [
            new User(1, 'Alice'),
            new User(2, 'Bob')
        ];
    }

    getUserById(id: number): User {
        const user = this.users.find(user => user.id === id);
        if (!user) {
            return new NullUser();
        }
        return user;
    }
}

// Пример использования
const userRepository = new UserRepository();

const user1 = userRepository.getUserById(1);
console.log(user1.getDisplayName()); // Вывод: Alice

const user2 = userRepository.getUserById(3);
console.log(user2.getDisplayName()); // Вывод: Guest User

Объяснение:

  1. Класс User представляет обычного пользователя с методами и свойствами.
  2. Класс NullUser расширяет класс User и представляет специальный случай, когда пользователь не найден. Он предоставляет реализацию метода getDisplayName, который возвращает "Guest User".
  3. Класс UserRepository содержит метод getUserById, который ищет пользователя по ID. Если пользователь не найден, он возвращает экземпляр NullUser.
  4. При использовании UserRepository, если пользователь с заданным ID найден, возвращается обычный User, если не найден — возвращается NullUser, что позволяет избежать проверки на null при каждом использовании пользователя.

Этот паттерн упрощает работу с объектами, делая код более чистым и понятным.