Вы могли бы иметь базовое определение для игры. Тогда версия в вашей колоде может быть изменена для 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 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