Re[13]: понимание ООП Алана Кея
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.03.23 16:04
Оценка:
Здравствуйте, vdimas, Вы писали:
[сcode]
template<typename T>
class ImmutableValue {
const T value_;

public:
ImmutableValue(T && value) : value_(value) {}
[/cсode]
Хм. А там точно будет ссылка на оригинал, а не дубликат? Похоже, вы свой код не проверяли.
А если "исправить" ваш код так:
template<typename T>
class ImmutableValue {
    const T& value_;

то мы легко убедимся, что чудес не бывает.
Покажите мне пример кода, в котором вы изготавливаете из мутабельного объекта иммутабельный, и продемонстрируйте, что вы после этого не можете этот иммутабельный изменить.

V>Далее в своём коде используешь шаблонный ImmutableMap.

Вот прямо так сразу использовать шаблонный ImmutableMap не получится. Вы, как водится, привели тот самый фрагмент кода, который был очевиден и без обсуждения.
Как вы реализуете метод add(const TKey & key, const TValue & value)?
Внезапно окажется, что нельзя просто взять произвольный mutable тип, завернуть его в ImmutableValue и наслаждацца. Даже если вы сможете реализовать своё обещание с "zero-overhead" конструктором перемещения (в чём я почему-то сомневаюсь), реализация изменяющих методов "в лоб" потребует от вас реализовать copy-on-write, что убъёт производительность.
Чтобы ваш "мутабельно-иммутабельный" словарь можно было применять в реальной жизни, придётся особенным образом проектировать его мутабельную версию. Посмотрите для примера в код классов ImmutableXXX.Builder всё в том же неймспейсе.


V>В С++ ключевое слово const применимо так же к полям структур/классов.

V>Такие поля могут быть инициализированы только в конструкторе.
V>Это аналог readonly в C#.
Это всё понятно. Да, слово const есть, можно применять его к мемберам. Счастье-то в чём?

V>Это не столько про саму иммутабельность, сколько про специальные алгоритмы на иммутабельных графах и списках.

Чегось? Какие ещё алгоритмы? Какие графы? Там ровно то, что написано в названии неймспейса — реализация иммутабельного списка, словаря, множества, массива, стека, очереди, и ещё пары классов.

V>Соответственно, ценностью этого раздела библиотеки является уже готовая функциональность, а не какие-то там гарантии.

V>(никаких гарантий та система типов не даёт)
Конечно даёт.
Вот мой метод:
public void RegisterState(ImmutableDictionary<string, int> state)
{
  _visited[state] = true;
}

Попробуйте "сломать" его, передав в него мутабельный state.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.