Является ли создание глубоко вложенных объектов, которые модифицируются, хорошей практикой? - PullRequest
0 голосов
/ 30 мая 2019

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

  • Локации
    • Локации ...
      • Элементы
        • Взаимодействия
      • ...
    • Элементы
      • Взаимодействия
        • Элементы
      • Другая информация (например, статистика)

В основном, каждое местоположение имеет родительское местоположение и, возможно, дочерние местоположения.Каждое местоположение имеет элементы, которые имеют взаимодействия, которые содержат элементы, а также другие объекты-идентификаторы.

Каждое местоположение, элемент и взаимодействие являются уникальными и могут иметь только одного родителя (например, элемент 10 будет только вребенок только из одного места).Элементы и объекты-идентификаторы могут иметь несколько родителей.Затем я создаю игру, а JSON сгущает данные и перестраивает их только при появлении соответствующего запроса в веб-приложении.

Во время сборки я вполне согласен, что это займет больше времени, но хотелось быоптимизировать скорость и память во время игры.

Как лучше хранить иерархические отношения?

В настоящее время я делаю следующее: в каждой локации естьуникальный идентификатор местоположения его родителя, дочерних элементов и элементов.Каждый элемент имеет идентификатор родительского местоположения, идентификатор взаимодействий и другие идентификаторы.Каждое взаимодействие имеет свой идентификатор родительского элемента и идентификатор элементов, если это применимо.Каждый предмет и идентификатор объекта не имеют родителей или детей.Тогда игровой билд представляет собой карту следующего вида:

Местоположение: Карта каждого идентификатора местоположения с данными

Элемент: Карта каждого идентификатора элемента с данными

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

Элемент: сопоставление каждого идентификатора элемента с данными.

Идентификационные объекты: сопоставление каждого идентификатора идентификатора с данными

В некоторыхпсевдокод это:

let _LocNames = {};
function _Location(locationId, parentId, context) {
    this.locationId = locationId;
    this.parentId = parentId;
    this.children = []; // array of strings
    this.elements = []; // array of strings
    // ... other stuff
    _LocNames[locationId] = this;
}

_Location.prototype.addChild = function(childId) {
    new _Location(childId, this.locationId, context);
    this.children.push(childId);
};

_Location.prototype.addElement = function(elementId) {
    this.elements.push(elementId);
};

let _ElementNames = {};
function _Element(elementId, parentId, context) {
    this.elementId = elementId;
    this.parentId = parentId;
    this.interactions = []; // array of strings
    // ... other stuff
    _LocNames[parentId].addElement(elementId);
    _ElementNames[elementId] = this;
}

_ElementNames.prototype.addInteraction = function(interactionId) {
    this.interactions.push(interactionId)
}

let _InteractionNames = {};
function _Interaction(interactionId, elementId, context) {
    this.interactionId = interactionId;
    this.elementId = elementId;
    this.items = context.items; // array of itemIds (strings)
    // ... other stuff
    _ElementNames[elementId].addInteraction(interactionId);
    _InteractionNames[interactionId] = this;
}

let _ItemNames = {};
function _Item(itemId, context) {
    this.itemId = itemId;
    // ... other stuff
    _ItemNames[itemId] = this;
}

let Data = {};
Data["Location"] = _LocNames;
Data["Element"] = _ElementNames;
// so on so forth

// The game build would then be
JSON.stringify(Data)

Затем, предположим, что я хочу сделать что-то со всеми элементами в местоположении:

Data.Loc[locId].elements.map(elementId => foo(Data.Element[elementId]))

Это работает хорошо, но вместо этого будет лучше шаблон проектированиясделать более глубоко вложенную иерархию?Например, что-то вроде:

function _Location(locationId, parent, context) {
    this.locationId = locationId;
    this.parentId = parent;
    this.children = {};
    this.elements = {};
}

let _baseLocation = new _Location("BASE", null, null);

function _findParent(id) {
    // Do something starting at the root node (_baseLocation)
    // and find the parent using some kind naming / design.
    return parent; // Note: the object, not the parentId
}

addChild(childId, context) {
    let parent = _findParent(childId);
    parent.children[childId] = new _Location(childId, parent, context);
}

function _Element(elementId, parent, context) {
    this.elementId = elementId;
    this.parent = parent;
    this.interactions = {};
}

addElement(elementId, context) {
    let parent = _findParent(elementId);
    parent.elements[elementId] = new _Element(elementId, parent, context);
}

// so on for the others lower on the hierarchy. 
// Then the game build would look like
JSON.stringify(_baseLocation)

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

В первом проекте самый глубокий объект - 4 дюйма (Данные -> Тип объекта -> Имя объекта -> ifArray / Map -> только строки / числа), тогда как во втором он может быть очень глубоким.

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

...