Что такое "символические константы"и" магические константы"?

в туре по C++ Бьярне Страуструпа некоторые советы перечислены в конце каждой главы. В конце первой главы одна из них гласит:--1-->

избегайте "магических констант"; используйте символьные константы;

Что такое магические и символические константы?

3 ответов


somethingElse = something * 1440;           // a magic constant
somethingElse = something * TWIPS_PER_INCH; // a symbolic one

первый является примером магической константы, она не передает никакой другой информации, кроме ее значения.

последнее гораздо полезнее, поскольку намерение ясно.

использование символьной константы также очень помогает, если у вас есть несколько вещей с одинаковым значением:

static const int TWIPS_PER_INCH = 1440;
static const int SECTORS_PER_FLOPPY = 1440; // showing my age here :-)

таким образом, если один из них изменения, вы можете легко определить, какие один 1440 в коде надо изменить. С помощью магии!--2-- > s рассеяно в коде, вы должны изменить его в нескольких местах и выясните, какие твипы и какие сектора.


A magic constant будет числовым значением, которое вы просто вводите в некоторый код без объяснения того, почему он существует. Придумать хороший пример непросто. Но давайте попробуем так:

float areaOfCircle(float radius) {
    return radius * radius * 3.14159
}

здесь я использовал "магическую константу" 3.14159 без какого-либо объяснения того, откуда она берется. Было бы лучше сказать

const float pi = 3.14159
float areaOfCircle(float radius) {
    return radius * radius * pi;
}

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


магия:

int Q() { return 42; }

символично:

const int TheMeaningOfLifeAndEverything = 42;
int Q() { return TheMeaningOfLifeAndEverything; }