Ho visto il codice C in cui le persone usavano pesantemente enum. Ma tutto ciò che fa è confondere gli altri. In molti posti gli interi semplici possono fare la stessa cosa con meno ambiguità. Quali sono gli abusi comuni di enum?
Un caso che riesco a pensare, anche se non ho ancora visto in natura, è di abusare delle enumerazioni come una raccolta di costanti intere disgiunte:
enum somestuff { days_in_week = 7,
months_in_year = 12,
number_of_planets = 8,
fingers_per_hand = 5 };
L'esempio più patologico e innocente che posso immaginare sarebbe
enum numbers { one, two, three, four, five, six, seven, eight, nine, ten };
perché one
== 0, two
== 1 ecc.
Il problema più grande che ho avuto con le enumerazioni è che vengono definiti due volte.
EnumZ
{
Yes,
No,
Maybeso
}
e qualcun altro, con un nome molto simile, avrebbe
EnumZee
{
No,
Maybeso,
Yes
}
Non è una "presa rapida" perché è l'enumerazione che hai fatto ... giusto? È qualcosa che non vedi fino a quando non passi il codice e vedi che il tuo "No" sta tornando a zero anziché uno.
In C ++ (sarebbe stato pubblicato come commento, ma per il codice funziona meglio)
enum ELength
{
mm = -3,
m = 0,
km = 3,
// ...
}
double operator*(double d, ELength scale)
{
return d * pow(10, scale);
}
// allows:
double len = 2*mm;
Un'altra applicazione potrebbe essere qualificante:
enum EConstraintMode
{
abs = 1,
rel = 2,
expand = 3,
};
struct Constraint
{
EConstraintMode mode;
int value;
}
Constraint operator-(EConstraintMode mode, int value)
{
Constraint c = { mode, value };
return c;
}
void SetConstraints(Constraint top, Constraint Left,....) { ... }
SetConstraint(abs-12, rel-50, abs-12, rel-50);
Sono ancora indeciso se questo è maledettamente bello, malvagio orribile, o entrambi. (Non lo userei nel codice di produzione, per questo motivo).