Хорошая или Плохая Идиома C++ - Объекты, используемые просто для конструктора/деструктора?

Таким образом, для этого вам нужно будет использовать count (), чтобы получить количество раз, когда конечный узел достигнут (количество различных путей к этому узлу), затем выполнить фильтрацию на основе этого количества:

[110 ]
9
задан Roddy 12 January 2009 в 12:50
поделиться

9 ответов

Эта техника очень распространена и известна как шаблон разработки: Приобретение ресурса является инициализацией (RAII).

Я не смущался бы использовать этот шаблон разработки вообще.

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

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


"Некоторый инструмент статического анализа мог предложить, чтобы они были удалены?"

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

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

36
ответ дан 4 December 2019 в 05:52
поделиться

Как другие сказали, это - хороший стиль C++. Для помощи удобочитаемости я всегда снабжаю префиксом такие RAII-единственные классы Scoped (например, ScopedBusyCursor) прояснить от взгляда, какова цель класса.

10
ответ дан 4 December 2019 в 05:52
поделиться

Это известная и хорошая идиома C++, как другие ответила.

Чтобы прояснить, что классы предназначены, чтобы только использоваться в объеме а не быть перемещенными между различными объемами, могло бы быть хорошо сделать их noncopyable. Это может быть сделано вручную путем добавления нереализованного частного конструктора копии и оператора присваивания копии. Короче и больше читаемого пути должен получить класс из повышения:: noncopyable:

#include <boost/noncopyable.hpp>
class BusyCursor : public boost::noncopyable // for scoped use only
{
    // ...
};
7
ответ дан 4 December 2019 в 05:52
поделиться

Это - хорошая идиома и наиболее часто используемый.

Лучше, чем какая-либо альтернатива, например, даже если Ваш что-то трудоемкий код выдает исключение, ~BusyCursor деструктор все еще назовут.

4
ответ дан 4 December 2019 в 05:52
поделиться

Я обычно называю это "защитой". По-моему, это демонстрирует одни из самых больших преимуществ C++ (детерминированная обработка ресурса). Это - одна из вещей, которые я пропускаю больше всего при работе на собравших "мусор" языках.

2
ответ дан 4 December 2019 в 05:52
поделиться

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

3
ответ дан 4 December 2019 в 05:52
поделиться

Другие уже упомянули, что это - классический RAII. То, что я добавлю, должно сказать, что это - одна из лучших вещей о C++. Очень немного других языков поддерживают его или по крайней мере поддерживают его правильно (даже конструкция использования C# не так хороша, как нагрузка находится все еще на клиентском коде - см. мою запись в блоге на этом).

Этим становятся столь тесно связанным с C++, что необходимо быть уверены, что любой читающий его был бы знаком с ним - и если не они должны быть.

3
ответ дан 4 December 2019 в 05:52
поделиться

Возможно не использование этого шаблона является плохой идиомой. Когда Вы не используете RAII, Ваш код заканчивает тем, что был похож на это:

void func() {
    Cursor oldCursor = CurrentCursor();
    SetCursor(BUSY_CURSOR);
    try {
        do_slow_stuff();
        SetCursor(oldCursor);
    } catch (...) {
        SetCursor(oldCursor);
        throw;
    }
}

Вы действительно думаете, имея это, сорил всюду по Вашему коду, лучше для обслуживания?

4
ответ дан 4 December 2019 в 05:52
поделиться

Можно также пойти с чем-то как ScopeGuard Andrei Alexandrescu и Petru Marginean. Ваш образец выглядел бы примерно так затем:

void DoSlowThing
{     
    Cursor oldCursor = CurrentCursor();
    SetCursor(BUSY_CURSOR);
    ON_BLOCK_EXIT(SetCursor, oldCursor);
    ... do something time-consuming  ...
}

Это помогает сделать одноразовые операции RAII-типа, не имея необходимость создавать новый класс для каждого. Однако для Вашего примера Курсора, так как это - класс, который Вы будете, вероятно, много раз снова использовать, Вы, вероятно, более обеспечены со специализированным классом.

0
ответ дан 4 December 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: