Объяснено сохранение игр по умолчанию на основе подписки

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

Используйте этот шаблон, чтобы разблокировать следующие преимущества:

  • Подкласс не нужен
  • Скрыть сложности создания объектов
  • Получайте новые объекты, не зная, какого они типа
  • Удаление или добавление новых объектов во время выполнения

В общем, каждый паттерн относится к 1 из 3 категорий: творческий, структурный и поведенческий. Этот паттерн относится к категории творческих. Вы поймете, почему.

Эта статья является частью серии. Остальные шаблоны вы найдете в конце.

Шаблон прототипа в двух словах

Шаблон прототипа создает новые объекты с помощью clone(). Вместо того, чтобы возвращать неинициализированные, вы получаете обратно уже инициализированный объект. Инициализированный основан на прототипе или примере объекта.

Практическое правило. Следуйте этому шаблону, если создание объектов требует больших затрат или ресурсов.

Возможно, вы знаете этот шаблон под названием «Шаблон свойств».

Когда и зачем использовать шаблон прототипа

Шаблон прототипа может быть полезен при инициализации бизнес-объектов со значениями по умолчанию. Их клонирование принимает от них значения по умолчанию.

В качестве языка прототипирования JavaScript использует шаблон Prototype для создания новых объектов, включая их прототипы.



Обзор шаблона

Чтобы правильно получить этот шаблон, вам понадобится следующее:

  • Клиент.Создает новый объект путем клонирования прототипа. В примере: функцияrun().
  • Прототип.Создает интерфейс для собственного клонирования. В примере:SaveGamePrototype.
  • Клоны.Это клонированные объекты для работы. В примере:SaveGame.

Пример 1: Стартовая сохраненная игра по умолчанию

В этом примере будет создана база SaveGame для дальнейшей работы. Это зависит от вашей бизнес-логики. Сейчас я создам SaveGame с 3 валютами:

  • Базовая валюта
  • Премиум-валюта
  • Валюта престижа

Для любого пользователя по умолчанию я всегда хочу предоставить 0 для всех трех валют.

Обзор

Пример кода создает клоны объектов с заданным объектом SaveGamePrototype. SaveGame прототипов принимается в его конструкторе.

Метод clone генерирует новые объекты SaveGame со значениями свойств, инициализированными конструктором прототипа.

В следующих разделах показана реализация классического шаблона Prototype.

SaveGame (Нулевой пациент)

У этого клона (Нулевой пациент) есть план для ваших нужд.

function SaveGame(base, premium, prestige) {

    this.currency = base;
    this.premiumCurrency = premium;
    this.prestigeCurrency = prestige;

    this.info = function () {
        console.log("Default SaveGame created: Base Currency" + this.currency + ", Premium Currency " + this.premiumCurrency +
            ", Prestige Currency: " + this.prestigeCurrency + ".");
    };
}

Он содержит значения для всех трех валют, а также выводит их на консоль при вызове info().

Это будет клонировано прототипом в следующем разделе.

Прототип

SaveGamePrototype принимает тип proto и сохраняет его в своем частном поле с именем this.proto.

function SaveGamePrototype(proto) {
    this.proto = proto;

    this.clone = function () {
        const saveGame = new SaveGame();

        saveGame.currency = proto.currency;
        saveGame.premiumCurrency = proto.premiumCurrency;
        saveGame.prestigeCurrency = proto.prestigeCurrency;

        return saveGame;
    };
}

Функция clone() создаст новый SaveGame с сохраненными значениями по умолчанию для всех валют (0,0,0) при вызове.

Клиент (также известный как исполняемый код)

С const proto вы создаете прототип в соответствии с вашими потребностями. В этом случае я хотел дать любому пользователю по умолчанию 0 валюты.

function run() {

    const proto = new SaveGame(0, 0, 0);
    const prototype = new SaveGamePrototype(proto);

    const saveGame = prototype.clone();
    saveGame.info();
}

const prototype содержит объект-прототип, который вы будете клонировать в дальнейшем SaveGames. Наконец, с помощью clone() вы создаете выделенный файл SaveGame.

Весь пример и распечатка

function SaveGamePrototype(proto) {
    this.proto = proto;

    this.clone = function () {
        const saveGame = new SaveGame();

        saveGame.currency = proto.currency;
        saveGame.premiumCurrency = proto.premiumCurrency;
        saveGame.prestigeCurrency = proto.prestigeCurrency;

        return saveGame;
    };
}

function SaveGame(base, premium, prestige) {

    this.currency = base;
    this.premiumCurrency = premium;
    this.prestigeCurrency = prestige;

    this.info = function () {
        console.log("Default SaveGame created: Base Currency" + this.currency + ", Premium Currency " + this.premiumCurrency +
            ", Prestige Currency: " + this.prestigeCurrency + ".");
    };
}

function run() {

    const proto = new SaveGame(0, 0, 0);
    const prototype = new SaveGamePrototype(proto);

    const saveGame = prototype.clone();
    saveGame.info();
}

run();

Пример 2: SaveGames для разных подписок

В этом примере будет создано 3 базовых SaveGame для работы. Значения валюты будут зависеть от выбранной подписки.

Вы создадите SaveGame для каждой выбранной модели подписки:

  • Бесплатный пользователь: 0, 0, 0
  • Премиум-пользователь: 500, 100, 0
  • Престижный пользователь: 1000, 500, 100

SaveGame (Нулевой пациент)

Здесь ничего не нужно менять.

Прототип

Здесь ничего не нужно менять.

Но вы должны добавить некоторые функции по умолчанию для создания всех трех сохраненных игр на основе подписки. Чтобы их красиво различать, создайте для каждого из них «строитель».

function getFreeUserSaveGame() {
    return new SaveGame(0, 0, 0);
}
function getPremiumUserSaveGame() {
    return new SaveGame(500, 100, 0);
}
function getPrestigeUserSaveGame() {
    return new SaveGame(1000, 500, 100);
}

Я перенес вызовы в функцию инициализации с именем initSubscriptionsDefaults:

function initSubscriptionDefaults() {
    const freeUser = getFreeUserSaveGame();
    const premiumUser = getPremiumUserSaveGame();
    const prestigeUser = getPrestigeUserSaveGame();

    const prototypeFreeUser = new SaveGamePrototype(freeUser);
    const prototypePremiumUser = new SaveGamePrototype(premiumUser);
    const prototypePrestigeUser = new SaveGamePrototype(prestigeUser);

    return [prototypeFreeUser, prototypePremiumUser, prototypePrestigeUser]
}

Который вернет массив, содержащий все 3 типа прототипов по умолчанию, которые предоставляет мой вариант использования (помните, три подписки = три сохранения).

Код клиента

Чтобы распечатать их, вы сократите функцию run() до одной строки:

function run() {

    // Your logic to just take one of them (make a wrapper)

    initSubscriptionDefaults().forEach(s => s.clone().info())
}

Который возвращает все три прототипа, перебирает их (.forEach()) и вызывает метод info() для каждого из них.

Ваша возможная логика

Представьте, что вам нужно реализовать сервис, который принимает 0, 5 или 10 долларов и предоставляет пользователю разные стартовые валюты для вашей игры. Вы можете реализовать это очень грубо следующим образом:

function run() {

    const userPayment = 5 // $0, $5 or $10

    let prototype = null;

    switch (userPayment) {
        case 5:
            prototype = new SaveGamePrototype(getPremiumUserSaveGame());
            break;
        case 10:
            prototype = new SaveGamePrototype(getPrestigeUserSaveGame());
            break;
        default:
            prototype = new SaveGamePrototype(getFreeUserSaveGame());
            break;
    }

    const userSaveGame = prototype.clone()

    userSaveGame.info()
}

Использование этого шаблона предоставляет вам доступ к всегда одинаковой процедуре обработки. Только создание прототипа будет отличаться в зависимости от вашей бизнес-логики.

С легкостью определяйте недостатки кода и заменяйте их шаблонами передового опыта. Получите шпаргалки «Весь код пахнет одной строкой.

Дополнительные объяснения шаблонов JavaScript

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.