Re[3]: Опциональные типы
От: meadow_meal  
Дата: 22.02.17 22:06
Оценка:
Здравствуйте, 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
— но возможно недостаточно внятно)

Я ни проблем особых не вижу, ни альтернатив, так что надеюсь, что ты разъяснишь свою позицию.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.