Обработка обратных вызовов в коде, который похож на дерево наследования - PullRequest
0 голосов
/ 11 июня 2018

Я работаю над системой листов персонажей на основе javascript для ролевых игр.В конкретном типе RPG, который я пытаюсь реализовать, существует что-то вроде дерева наследования, так что существуют базовые правила системы RPG, есть более конкретные правила для данного параметра в этой системе RPG, и тогда может бытьразличия между конкретными версиями этого параметра.

Для данного взаимодействия с пользователем код должен выполнить некоторые действия для всей RPG-системы и некоторый другой код для конкретного используемого параметра и версии.

В настоящее время я занимаюсь этим, выполняя что-то в форме:

CharacterSheet.prototype.handleSomeUserInteraction()  {
    this.handleSomeUserInteractionForSystem();
    this.handleSomeUserInteractionForSetting();
    this.handleSomeUserInteractionForVersion();
}

// Empty implementations here to avoid errors, this will be overwritten with a
// function that does the actual handling in a separate file
CharacterSheet.prototype.handleSomeUserInteractionForSystem()  {}
CharacterSheet.prototype.handleSomeUserInteractionForSetting()  {}
CharacterSheet.prototype.handleSomeUserInteractionForVersion()  {}

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

В идеале я хотел бы добиться следующего:

  • Он должен быть легким - в редких случаях эти обратные вызовы должны вызываться, может быть, сто раз в секунду.
  • Должны быть вызваны только обязательные / непустые обратные вызовы.
  • Интерфейс для регистрации обратного вызова должен быть интуитивно понятным и понятным, чтобы другие разработчики, не знакомые с остальным кодом, могли легко его использовать для разработки своего собственного кода системы RPG / настройки / версии.
    • Т.е. должно быть очевидно, какие части кода могут быть расширены (например, где может быть зарегистрирован обратный вызов) и как.
    • В связи с вышеизложенным, должно быть как можно меньше манипулирования, например,«Это» аргументы, насколько это возможно.

Как мне лучше всего достичь вышеуказанных целей?

ПРИМЕЧАНИЕ: Поскольку наследование немногоДля меня это непонятно в JavaScript Я не пошел по этому пути, я также читал, что наследование JS может снизить производительность (хотя я подозреваю, что при моих требуемых четырех уровнях наследования это не будет проблемой).

ПРИМЕЧАНИЕ: Я ищу чистое ванильное решение JS, я не большой поклонник всех этих фреймворков, которые напрасно раздувают кодовую базу.

1 Ответ

0 голосов
/ 12 июня 2018

Это то, что я придумала до сих пор - вдохновлено решением, управляемым событиями, предложенным @ Nope.

CharacterSheet.prototype.onUserInteraction = [];
CharacterSheet.prototype.handleSomeUserInteraction()  
{
    var _this = this;
    this.prototype.onUserInteraction.forEach(callback => {callback.call(_this);});
}

// Implementers then first create an implementation of the callback:
CharacterSheet.prototype.handleOnUserInteracation = function()
{
    // Do something here
}
// And then register the callback this way:
CharacterSheet.prototype.onUserInteraction.push(CharacterSheet.prototype.handleOnUserInteracation);

Это не так чисто и интуитивно понятно, как хотелось бы в идеале, но оно обеспечиваетчто код, написанный в обратном вызове, может обрабатываться так, как если бы он был написан непосредственно для прототипа CharacterSheet, и мне не нужно связываться с истинным наследованием JS.

Буду признателен за обратную связь для этого подхода, и альтернативные решениябудет проголосовано, если вы объясните преимущества / недостатки.Если он достаточно хорош, я с радостью отмечу его как принятый.

Обратите внимание, что приведенный выше код был написан из памяти, поэтому он может содержать некоторые незначительные ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...