Действительно ли здесь уместны константы или есть другой подход? - C++
Я студент по программированию на моем втором курсе ООП, который преподается на C++. Я знаю, что вообще плохая практика - использовать магические числа в коде, поэтому вот мой вопрос:
В следующей программе, которую я должен написать для этого класса, нам дано более 120 номеров в таблицах налогов, и мы должны использовать их для расчета налогов и другой соответствующей информации. С таким большим количеством чисел, я определяю константу для каждого числа? Или я могу что-то еще сделать?
5 ответов
Константы были бы более подходящими, чем магические числа -
Однако с таким количеством "констант" и тем, что меняется со временем (таблицы налогов), я лично загружал их через файл конфигурации и использовал какой-то тип поиска в словаре для отдельных значений. Это значительно облегчит адаптацию к новым таблицам налогов без перекомпиляции.
Подумайте, как будут выглядеть структуры данных, которые вам понадобятся, а затем решите, какие константы или перечисления вам нужны. (Не налоговый эксперт, поэтому я собираюсь немного догадаться здесь)
Налоговые ставки в разных штатах
std::map<std::string, double> stateRates;
stateRates["CA"] = 20.7;
stateRates["MN"] = 1.2;
....
Я не вижу здесь необходимости в константах, хотя некоторые люди перечисляют названия штатов
enum States
{
CA, MN
};
std::map<States, double> stateRates;
stateRates[CA] = 20.7;
stateRates[MN] = 1.2;
Но тогда вам также необходимо преобразовать строку CA в enum CA
Но для не табличных вещей, то вам действительно нужны константы
const int EXTRA_TAX_FOR_BIG_HOUSE = 2;
const int BIG_HOUSE_LIMIT = 6000; // sqft
if(houseSize > BIG_HOUSE_LIMIT)
rate += EXTRA_TAX_FOR_BIG_HOUSE;
Вопрос в том, как ваш код будет их использовать? Если вам действительно нужно написать код, который использует каждый из них особым и своеобразным образом, то вы можете также превратить их все в константы.
Если, с другой стороны, вы просматриваете их, какая-то ассоциативная структура данных (например, "карта STL") может быть более полезной.
Еще одно соображение: если кто-то ожидает, что ваша программа будет переваривать новый набор так часто, то вам нужны константы для имен и структура данных, которую вы загружаете со значениями.
Обычно с такими заданиями вас научат читать / писать из файла. Затем вы можете загрузить эти числа в массивы или векторы или что вам может понадобиться. Если вас не учили читать и писать из файла, это довольно просто подобрать.
Вот учебник, на который вы могли бы взглянуть, но с помощью быстрого поиска в Google вы можете найти множество других http://fredosaurus.com/notes-cpp/io/readtextfile.html
У Рида Копси правильный ответ, но я не знаю, был ли ответ достаточно ясным.
Когда у вас так много разных "констант", лучше поместить их во что-то внешнее, например, в файл или базу данных. Эти так называемые "константы" имеют тенденцию меняться: налоговые ставки для разных штатов меняются, поскольку законодательные органы решают, что им нужно больше денег.
Если вы храните эти магические числа в файле, используйте ifstream
читать эти константы. Если вы используете базу данных для хранения этих магических чисел, вам необходимо прочитать документацию для этой базы данных.
То, во что вы должны хранить числа, зависит от того, для чего вы их используете. Например, если у вас есть только государственные налоги, используйте map
перейти от названия штата (или сокращения) к его налоговой ставке.
Удачи!