Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, meadow_meal, Вы писали:
_>>Optional<Optional<ClanID>> clan;
_>>В этом случае наличие значения clan означает, что информация передана клиенту, наличие значения clan.value означает, что пришел новый клан игрока, а его отсутствие — что игрок больше не состоит в клане.
V>
V>За такое увольнять нафик.
Так предложи альтернативу.
Задача: имеется сущность Xxx, содержащая следующие свойства:
T1 field1;
T2 field2;
...
В IDL нужно объявить протокольный дельта-рекорд XxxUpdate для пересылки изменившихся (и только изменившихся полей). T1, T2 и т.п. могут быть различными типами, в том числе опциональными. Используются дельта-рекорды достаточно часто, поэтому требуется максимально простой паттерн с минимальным количеством частных случаев.
Решение в лоб:
record XxxUpdate
{
Optional<T1> value1;
Optional<T2> value2;
...
}
и если T это какой-нибудь Optional<int>, то так тому и быть. Вот здесь и образуется Optional<Optional<int>>.
V>Представляю все масштабы "удовольствия" от сопровождения такого кода. ))
Удовольствие на практике в C# выглядит примерно так:
public int Field1 { get; private set; }
public int? Field2 { get; private set; }
void Update(XxxUpdate update)
{
if (update.Field1.HasValue)
this.Field1 = update.Field1.Value;
if (update.Field2.HasValue)
this.Field2 = update.Field2.Value;
}
На этом ручной код сопровождения заканчивается (все остальное — сгенерировано), а вместе с ним и масштабы удовольствия. Да и этот код можно генерировать.
(Я все это уже писал вот здесь:
http://rsdn.org/forum/philosophy/6702818.1Автор: meadow_meal
Дата: 19.02.17
— но возможно недостаточно внятно)
Я ни проблем особых не вижу, ни альтернатив, так что надеюсь, что ты разъяснишь свою позицию.