• Что такого хорошего в иммутабельности?

    angrySCV
    @angrySCV
    machine learning, programming, startuping
    ну например можно эффективно переиспользовать и хранить структуры данных.

    вот например сложить 2 списка:
    в случае с иммутабельным чтоб создать третий общий список, тебе достаточно только ссылки указать где надо, на первый и второй список - оба списка у тебя будут переиспользоваться, а в память добавится только пару дополнительных ссылок (это вычислительно быстро и требует мало памяти).

    в случае с мутабельными списками - тебе нужно создать третий, копируя все элементы первого и второго, что затратно как по времени исполнения, так и по объему хранения.
    если ты в мутабельной структуре попробуешь тоже ссылочками сделать новую структуру, у тебя может получится такая ситуация, что уже ПОСЛЕ создания нового списка, при изменении в исходной структуре - эти изменения появятся в твоём новом списке, как неконтролируемое изменение, которое ты не выполнял.
    В итоге поскольку в иммутабельных структурах есть гарантии, что они будут не измены, то их можно переиспользовать при создании новых структур данных, мутабельные же нельзя.
    Ответ написан
    Комментировать
  • Что такого хорошего в иммутабельности?

    vabka
    @vabka
    Токсичный шарпист
    Иммутабельность - это про гарантию, что ты случайно не изменишь то значение, которое тебе передали извне.
    И что функция, в которую ты передал своё значение, не изменит его.

    Вот тупой пример:
    let today = now().date
    let tomorrow = today.addDays(1)
    assert(today != tomorrow)

    И вот если DateTime мутабельный, то мы можем словить ошибку в этой ситуации.
    Иммутабельность же позволяет на корню этого избежать.

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

    А отстутсвие сайд-эффектов позволяет делать вычисления ленивыми, и тоже даёт возможность безопасно распараллеливать, тк нет привязки к порядку операций.
    Ответ написан
    Комментировать
  • Есть разница, на низком уровне, между классом со статичными полями и глобальным экземпляром класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Нет разницы.

    Можно же проверить самостоятельно. Технологии нынче - все легко. Вот: https://godbolt.org/z/PKWPdY4nn

    Как видите, и то и другое компилируется в практически одинаковые инструкции:

    eax, DWORD PTR MyGlobalPool[rip+4]
    ...
    eax, DWORD PTR MyPool1::numOfAllocatedObjects[rip]


    И там и там просто загрузка какого-то статичного адреса глобальной переменной. Вообще говоря, в случае с глобальной переменной компилятор мог бы сдлеать и 2 действия: взять адрес переменной и прибавить смещение поля. Но он, как видите, достаточно умный, чтобы сделать все в одну инструкцию.
    Ответ написан
    Комментировать
  • Как добавить в `std::map` объект с константными полями?

    maaGames
    @maaGames
    Погроммирую программы
    А вот сделали бы переменную в private и константный метод для возврата значения и вообще никаких проблем бы не было.
    Ответ написан
    2 комментария
  • Откуда взялись дополнительные 4 байта?

    vabka
    @vabka
    Токсичный шарпист
    12 байт не кратно 8, по тому компилятор добавил ещё 4 байта, чтобы выровнять до 16.
    Ответ написан
    Комментировать
  • Как создать шаблон от наследников определенного класса?

    @Flysink
    Можно сделать шаблон, и не большую проверку в конструкторе "NodeContainer"
    Это будет выглядеть:

    template<class NODE>
    class NodeContainer {
    public:
    	NodeContainer(NODE *n) :
    		node(n)
    	{
    		static_assert(std::is_base_of<NodeBase, NODE>::value, "Derived class not derived from NodeBase");
    	}
    
    	NODE* node;
    	void SomeActionOnNode() {}
    };
    Ответ написан
    Комментировать
  • Что такое программная транзакционная память простыми словами?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В случае NET это специальный примитив обеспечивающий атомарность операций.
    То есть все что произошло в блоке откатывается при ошибке.
    Собственно это перенос механизма БД в приложение.

    Описание тут
    https://www.c-sharpcorner.com/article/transaction-...
    Ответ написан
    1 комментарий
  • Что означает '/' в 'NAME': BASE_DIR / 'db.sqlite3' в Django?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если посмотреть внимательнее, то BASE_DIR - это не строка, а экземпляр класса pathlib.Path, для которого определён оператор / между Path и str. Дока https://docs.python.org/3/library/pathlib.html
    Ответ написан
    Комментировать
  • Зачем мне использовать this, если есть замыкания?

    Xuxicheta
    @Xuxicheta
    инженер
    В первом случае вы создали "приватные поля". Можно делать как угодно, но хранить данные в свойствах объекта просто удобнее и наглядее. И нет возможности случайно зацепить внешнюю переменную в замыкание, потом попробуй найди такое.
    Ответ написан
    Комментировать
  • Зачем мне использовать this, если есть замыкания?

    @majstar_Zubr
    C++, C#, gamedev
    Меньше кода - меньше ошибок;
    Меньше кода быстрее писать;
    Меньше кода проще понять;
    Использование конструкций языка по их непосредственному назначению лучше выражают намерения;
    Ответ написан
    Комментировать
  • Зачем мне использовать this, если есть замыкания?

    mbelskiy
    @mbelskiy
    Software Developer
    Первое что приходит в голову:
    - при создании экземпляров объекта через замыкания теряются преимущества прототипного наследования (методы объявляются на экземпляре)
    - теряется возможность идентификации экземпляра операцией `typeof`
    Ответ написан
    Комментировать
  • Реализация свойства как объекта: паттерн или антипаттерн?

    lxsmkv
    @lxsmkv
    Test automation engineer
    попробуйте написать для ваших объектов юнит-тесты - если это будет легко и удобно - архитектура годная.
    Ответ написан
    Комментировать