Действительно ли здесь уместны константы или есть другой подход? - C ++ - PullRequest
1 голос
/ 19 января 2010

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

В следующей программе, которую я должен написать для этого класса, нам дано более 120 номеров в таблицах налогов, и нам нужно использовать их для расчета налога и другой соответствующей информации. С таким большим количеством чисел, я определяю константу для каждого числа? Или я могу что-то еще сделать?

Ответы [ 5 ]

8 голосов
/ 19 января 2010

Константы будут более подходящими, чем магические числа -

Однако с таким количеством «констант» и тем, что со временем меняется (таблицы налогов), я лично загружал их через файл конфигурации и использовал какой-то тип поиска в словаре для отдельных значений. Это значительно облегчит адаптацию к новым таблицам налогов без перекомпиляции.

3 голосов
/ 19 января 2010

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

Налоговые ставки в разных штатах

 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;
1 голос
/ 19 января 2010

Обычно с такими заданиями вас научат читать / писать из файла. Затем вы можете загрузить эти числа в массивы или векторы или что вам может понадобиться. Если вас не учили читать и писать из файла, это довольно просто подобрать.

Вот учебник, на который вы могли бы взглянуть, но с быстрым поиском в Google есть еще много всего. http://fredosaurus.com/notes-cpp/io/readtextfile.html

1 голос
/ 19 января 2010

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

Если, с другой стороны, вы просматриваете их, может быть полезна какая-то ассоциативная структура данных (например, «карта STL»).

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

0 голосов
/ 19 января 2010

Рид Копси имеет правильный ответ, но я не знаю, был ли ответ достаточно ясным.

Когда у вас так много разных «констант», лучше поместить их во что-то внешнее, например в файл или базу данных. Эти так называемые «константы» имеют тенденцию меняться: налоговые ставки для разных штатов меняются, поскольку законодательные органы решают, что им нужно больше денег.

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

То, во что вы должны хранить числа, зависит от того, для чего вы их используете. Например, если у вас есть только государственные налоги, используйте map, чтобы перейти от названия штата (или сокращения) к его налоговой ставке.

Удачи!

...