Здравствуйте, Visor2004, Вы писали:
V>Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
В библиотеке немерла есть тип Hashmap[K,V] : Dictionary[K,V]
Я в свое время тоже запарился писать такой код и добавил туда пару методов:
V>Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
Здравствуйте, BogdanMart, Вы писали:
BM>Здравствуйте, Visor2004, Вы писали:
V>>Довольно часто приходится работать со словарями,
V>>Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
BM>В Nemerle.dll есть тип Hashmap[K,V] : Dictionary[K,V]
Если надо именно IDictionary, напшите метод-расшырение
public static TryGetValue[K,V](this dic : IDictionary[K,V], key : K) : (V, bool)
{
mutable v;
(dic.TryGetValue(key, out v), v)
}
или
public static TryGetValue[K,V](this dic : IDictionary[K,V], key : K) : (V, bool)
{
mutable v;
_ = dic.TryGetValue(key, out v);
v //если ключа нету -- default(V)
}
Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
Здравствуйте, Visor2004, Вы писали:
V>Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
Здравствуйте, Visor2004, Вы писали:
V>Довольно часто приходится работать со словарями,
V>Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
В Nemerle.dll есть тип Hashmap[K,V] : Dictionary[K,V]
унег оесть метод
TryGetVlue(key:K) : (V, bool)
те в однустрочку, возвращает тюпл
можно юзатьтак
match (d.TryGetValue(k))
{
| (_, false) => ()
| (v, _ ) =>
твой код
}
С таким подходом у меня получается 2 независимые ветки кода, а мне надо просто сделать доп. действие, если элемента нет, то его надо добавить перед модификацией, т.е. модификацию надо делать все время, а вот добавлять только если нету элемента в словаре.
V>Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
Может быть к сведению стоит обратить внимание на интересные подходы работы с коллекциями и событиями типа Reactive Extensions (RX).
Уже не плохо, в совокупности с каким-нить методом расширения избавляющим от out параметра, можно использовать, спасибо Где можно почитать про вот эту стрелочку, которая жирным выделена? да и про unless я тоже в вики ничего не увидел.
V>Уже не плохо, в совокупности с каким-нить методом расширения избавляющим от out параметра, можно использовать, спасибо Где можно почитать про вот эту стрелочку, которая жирным выделена? да и про unless я тоже в вики ничего не увидел.
Здравствуйте, Visor2004, Вы писали:
V>Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
Здравствуйте, Undying, Вы писали:
U>Здравствуйте, Visor2004, Вы писали:
V>>Вопрос в следующем, можно ли как-то упростить код функции Register таким образом, чтоб избавиться от изменяемой переменной и ветвления when, есть ли какой-то общепринятый красивый паттерн для таких случаев?
U>
Здравствуйте, Visor2004, Вы писали:
V>Да, это очевидный способ, просто не хочется плодить типы под каждый такой случай у меня их много разных
Какой каждый? Этот тип MultiDictionary по сути достаточно универсальный, чтобы для него был отдельный тип.
В котором гарантируется что не будет null значений(коллекций).
Код с неявными MultiDictionary всгда выглядит неприятно и коряво. Потому что для ключа вместо 2-х основных состояний — есть элементы или нет. Их 4. 1)Есть коллекция с элементами 2)Есть коллекция но пустая 3) вместо коллекции null 4) вобще ничего,даже ключа нет. Либо запаришся проверки делать, либо код будет ненадежный и сложный из-за неявных соглашений.
И куча вопросов можно ли делать SelectMany или на null коллекции посыпется. Что делать когда последний элемент удаляешь — присваивать null или оставлять пустую коллекцию или все вместе с ключом убивать. Это должно быть в классе инкапсулировано.
Есть аналог в .NET — ILookup, он не подходит т.к. readonly, но там если по ключу ничего не лежит, то возвращается пустой IEnumerable.