Pull to refresh

Использование boost::variant для описания состояний модели

Reading time 3 min
Views 9.1K
C++ *
В моделях данных очень часто требуется хранить некоторые переключаемые состояния. Классический способ в С++ для этого — использование перечислимых типов enum.

Например, если у вас в программе пользователь может переключаться между двумя экранами, вы заводите enum screen { screen_one, screen_two }; и переменную screen cur_screen_. Отрисовщик должен получить у модели «текущий выбранный экран», и затем отрисовать его, запрашивая у модели дополнительные данные, относящиеся именно к этому экрану. Что-то вроде:

switch (model.cur_screen())
{
case screen_one:
  model.get_screen_one_elements();
  ...
case screen_two:
  model.get_screen_two_elements();
  ...
}


При использовании такой модели, программист может запрашивать данные, которые для текущего состояния совершенно не актуальны. Например, вызвать метод get_screen_two_elements() для получения списка элементов второго экрана, когда текущий экран — первый. Хорошей практикой является использование ассертов вида ASSERT(cur_screen_ == screen_one) в методах, зависимых от конкретного экрана. Это обеспечивает некоторый контроль времени выполнения.

Но есть способ обеспечить контроль времени компиляции и более явное разделение состояний с помощью boost::variant.

Читать дальше →
Total votes 24: ↑22 and ↓2 +20
Comments 17

Расставляем точки над i в Delphi RAII

Reading time 5 min
Views 18K
Delphi *
Тема RAII в Delphi обычно замалчивается или же информация по этому вопросу ограничивается обсуждением полезности интерфейсов. Но интерфейсы поодиночке не дают многих желаемых возможностей. Когда в Delphi 2006 появилась перегрузка операций, приватные поля записей, собственные конструкторы и методы в записях и, казалось, было бы логично увидеть и автоматически вызываемый деструктор. И run-time позволяет, и в разделе запроса новых фич Delphi на протяжении нескольких лет в ТОП–10 висит запрос №21729 «Record Operator Overloading: Please implement «Initialize» and «Finalize» operators». Наверное, не судьба. Ничего, я покажу, как обойтись без несостоявшихся фич. Так как Delphi 7 живее всех живых, будут рассмотрены решения, совместимые с Delphi 7 в том числе

Времени найти обходные пути было достаточно
Total votes 38: ↑32 and ↓6 +26
Comments 57

Что не так с std::visit в современном C++

Reading time 6 min
Views 36K
Programming *Perfect code *C++ *
Translation

Сигма-тип и вы


Давайте поговорим о простой, но мощной концепции в программировании — сигма-типах.

Сигма-тип (тип-сумма, меченное объединение) может содержать значения одного и только одного из нескольких типов. Например, рассмотрим настройки в INI-подобном файле конфигурации. Пусть каждая настройка может быть строкой, целым или булевым значением. Если бы мы хотели сделать свою библиотеку на C++, мы бы написали что-то вроде этого:
Читать дальше →
Total votes 41: ↑37 and ↓4 +33
Comments 295

Свободная касса: как мы ушли от монолита и настроили межмодульное взаимодействие на RPC

Reading time 10 min
Views 4.2K
Магнит corporate blog C++ *Development for Linux *

Всем привет, я — Дмитрий Пестеха, ведущий разработчик С++ команды POS-систем в «Магните». В этой статье я расскажу, как мы пилили монолитное приложение Касса на модули и отлаживали их взаимодействие на RPC-JSON. Спойлер: в процессе появился новый самописный язык интерфейсов - IDL.

Читать далее
Total votes 12: ↑8 and ↓4 +4
Comments 6

Полиморфные структуры данных и производительность

Reading time 5 min
Views 5K
High performance *Abnormal programming *Open source *Programming *C++ *

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

Читать далее
Total votes 13: ↑12 and ↓1 +11
Comments 45