Я должен использовать статические элементы данных? (C++)

При отправке формы вам нужно установить REDIRECT на URL, а не просто указать местоположение. Это останавливает браузер от повторной отправки, если выбран вариант «назад».

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

5
задан GraphicsMuncher 17 August 2015 в 02:22
поделиться

8 ответов

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

  • Вы не можете управлять порядком инициализации Ваших статических участников, таким образом, необходимо удостовериться, что никакой globals или другие помехи не относятся к этим объектам. Дополнительную информацию см. в этом Вопросе о FAQ C++ и также для некоторых подсказок для предотвращения этой проблемы.
  • Если Ваш доступ к ним в многопоточной среде, необходимо удостовериться, что участники полностью инициализируются перед порождением любых потоков.
5
ответ дан 18 December 2019 в 08:32
поделиться

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

3
ответ дан 18 December 2019 в 08:32
поделиться

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

3
ответ дан 18 December 2019 в 08:32
поделиться

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

Это не могло бы вызвать Вас проблема, если это - малый и средний проект, и у Вас нет высоких целей по автоматическому тестированию, но так как Вы спрашиваете: существуют лучшие пути.

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

Тем путем Ваш класс становится тестируемым, и Вы правильно разделили свои проблемы.

PS. Не делать использовать одиночные элементы также.

3
ответ дан 18 December 2019 в 08:32
поделиться

В начале выполнения я хочу считать множество значений из XML-файла и присвоить их 7 из элементов данных этого класса. Те значения не изменяются во время целого выполнения, и они должны быть совместно использованы всеми объектами / экземпляры рассматриваемого класса.

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

Трудно. Так, если для Вашего использования прямо сейчас оператор всегда верен, разрешение. Если Вы хотите быть тем же от некоторого будущего разработчика (или Вы) использование Ваших классов неправильно (как чтение другого XML-файла на полпути в программе), то сделайте что-то как то, что говорит Rasmus Farber.

2
ответ дан 18 December 2019 в 08:32
поделиться

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

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

2
ответ дан 18 December 2019 в 08:32
поделиться

Да, статические datamembers - то, что Вы ищете. Но необходимо заботиться для порядка инициализации/разрушения статических переменных. Нет никакого механизма в C++, чтобы гарантировать, что Ваши статические переменные инициализируются перед использованием их через единицы перевода. Для сейфа используйте то, что похоже на шаблон "одиночка" и известно устранить ту проблему. Это работает потому что:

  1. Все статические объекты полностью создаются после полной конструкции любого xml_stuff экземпляра.
  2. Порядок разрушения статических объектов в C++ является полной противоположностью завершения их конструкции (когда их конструктор заканчивает выполнение).

Код:

class xml_stuff {
public:
    xml_stuff() {
        // 1. touch all members once
        // => 2. they are created before used
        // => 3. they are created before the first xml_stuff instance
        // => 4. they will be destructed after the last xml_stuff instance is 
        //       destructed at program exit.
        get_member1();
        get_member2();
        get_member3();
        // ...
    }  

    // the first time their respective function is called, these
    // objects will be created and references to them are returned.
    static type1 & get_member1() { static type1 t; return t; }
    static type2 & get_member2() { static type2 t; return t; }
    static type1 & get_member3() { static type1 t; return t; }
    // ... all other 7 members
};

Теперь, объекты, возвращенные xml_stuff:: get_memberN () допустимы целая жизнь любого xml_stuff экземпляра, потому что любой из тех участников был создан перед любым xml_stuff экземпляром. Используя простые статические элементы данных, Вы не можете удостовериться это, потому что порядок создания через единицы перевода оставляют неопределенным в C++.

1
ответ дан 18 December 2019 в 08:32
поделиться

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

Я нашел, что размышление о записи тестов при разработке кода, помогает Вам сохранить код хорошо учтенным и допускающим повторное использование.

0
ответ дан 18 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

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