Структура данных с чтением-записи для модификацийC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Структура данных с чтением-записи для модификаций

Сообщение Anonymous »

с учетом, что я думал о цифровых карточных играх и структурах данных, которые вы можете использовать с ними, если хотите, чтобы карты были изменены. Подумайте «Убей шпиль» или «Поезд монстров» или «Балатро». Существует какая -то базовая версия карты, но эта базовая версия может быть изменена путем изменения некоторых из ее свойств, например, сколько стоит воспроизведения или стоимость ее эффектов. < /P>
Вы могли бы иметь базовое определение для игры. Тогда версия в вашей колоде может быть изменена для Durration The Run. Тогда версия, нанесенная на вашу руку, может быть изменена для дрюррации одной встречи. Все три из этих версий карты должны быть сохранены, если вы остановитесь в середине встречи. И в зависимости от того, как работает игра, вам может понадобиться любое количество версий для любого количества областей. Изменение его по мере продвижения, или начиная с базы и передачи его модификаторам для каждой области, чтобы рассчитать возможные полученные данные при необходимости. Оба эти метода работают, но как насчет структуры, более основанной на наследстве? Где базовые данные украшены его модификациями? Я думаю, что сделать это таким образом может сделать сохранение карт проще и предотвратить сохранение дубликатов данных, особенно если вы имеете дело со многими уровнями модификации. < /P>
Я уверен, что это не новая идея Но мне не хватает словарного запаса, чтобы Google какую -либо документацию по этому поводу. Это известный шаблон данных? У него есть имя или вы знаете о какой -либо документации? Кроме «украшения», конечно. Я хотел бы прочитать и посмотреть, подходит ли он для проекта, над которым я работаю.

Код: Выделить всё

interface IData
{
bool TryGetProperty(int id, out object value);
void SetProperty(int id, object value);
}

class Data : IData
{
Dictionary _values = new();

public bool TryGetProperty(int id, out object value) => _values.TryGetValue(id, out value);
publci void SetProperty(int id, object value) => _values[id] = value;
}

class DecoratedData : IData
{
IData _decorated;
Dictionary _values = new();

public DecoratedData(IData decorated)
{
_decorated = decorated;
}

//Gets this data's values before defaulting to the decorated
public bool TryGetProperty(int id, out object value) => _values.TryGetValue(id, out value)
? true
: _decorated.TryGetProperty(id, out value);

//If the set value is the same as in the decorated, remove it from this
public void SetProperty(int id, object value)
{
if (_decorated.TryGetValue(id, out var decoratedValue) && decoratedValue == value)
{
_values.Remove(id);
}
else
{
_values[id] = value;
}
}
}
Это прекрасно работает с простыми свойствами, такими как INT или поплавки, и экземпляр DemoratedData может быть сохранен вместе с идентификатором экземпляра Idata, который он украшает, чтобы его можно было найти при чтении. < Br /> Мое главное пособие - это то, что обработка вложенных данных кажется неуклюжим. Я думаю, что мне придется сделать что -то подобное < /p>
int nestedId = 0;
int nested_nameId = 1;

void Foo()
{
//the base has a nested data instance with a name property.
//I want to modify this nested name in some data decorating base.
IData base = new Data();
IData base_nested = new Data();
base.SetProperty(nestedId, base_nested);
base_nested.SetProperty(nested_nameId, "Jack");

//now we make a mod layer. In a more realistic situation
//we would need to grab the value for nestedId from base to get
//nested here but we already have it from above
IData modified = new DecoratedData(base);
IData nested_mod = new DecoratedData(nested);
nested_mod.SetProperty(nested_nameId, "Jill");
modified.SetProperty(nestedId, nested_mod);

//now if I try to get the value of nestedId from modified, I get
//nested_mod and then get "Jill" from nested_nameId instead of 'Jack'
//but if I were looking for a different property I'd get
//it from base_nested
//this can be wrapped any number of times by repeating:
IData modifiedAgain = new DecoratedData(modified);
IData nested_mod_mod = new DecoratedData(nested_mod);
nested_mod_mod.SetProperty(nested_nameId, "WentUpAHill");
modifiedAgain.SetProperty(nestedId, nested_mod_mod);
}

< /code>
Только 1 слой гнездования это не так уж плохо. Но я уверен, что вы можете себе представить, что по мере продолжения гнезда это становится все более и более грязным, требуя, чтобы все больше и больше декораторов < /p>
В заключение: < /p>
Что это называется? Вы знаете какие -нибудь хорошие документы, которые я могу прочитать? Есть ли лучший способ справиться с гнездованием? Есть другие проблемы с дизайном?

Подробнее здесь: https://stackoverflow.com/questions/794 ... ifications
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»