В попытке изучить 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 -> только строки / числа), тогда как во втором он может быть очень глубоким.
Казалось бы, хранение имен и более неглубокий дизайн более полезны и полезны.Если это правда, будет ли это также для очень большого набора данных?