Initialisatorlisten Denn Strukturen haben zwei tödliche Nachteile:
- Sie sind namenlos; Wenn ich ein Dutzend Parameter desselben Typs (Farben von UI-Elementen) habe, kann es leicht passieren, dass sie durcheinander geraten. Es ist schwer zu erkennen, was jeder von ihnen bedeutet, und Kommentare helfen nicht weiter und könnten aufgrund von (2) sogar irreführen.
- Die Reihenfolge der Strukturfelder ist ein festgelegter Vertrag (oder eine API oder eine Schnittstelle). ); Wenn ein Entwickler morgen die Reihenfolge der Felder ändert (bessere Speicheranpassung, häufigere Verwendung, alphabetische Reihenfolge usw.), werden alle Initialisiererlisten mit Werten desselben Typs in unvorhersehbarer Entfernung zerstört. Starke Stellen im Code, die ziemlich schwer zu finden sind, selbst wenn man merkt, was passiert ist.
Betrachten wir den Code (bitte bleiben Sie nicht bei dem konkreten Beispiel hängen, die Farben der Benutzeroberfläche dienen hier nur der Einfachheit des Beispiels):
params.h
Code: Select all
struct RGB { unsigned char r=0, g=0, b=0; };
struct UIColors {
RGB background;
RGB font;
};
namespace params {
extern bool ui_bright_mode;
extern UIColors night_mode;
extern UIColors bright_mode;
}
Code: Select all
namespace params {
bool ui_bright_mode = 1;
UIColors night_mode = {
/*background*/ {1, 1, 1},
/*font*/ {0, 0, 200}
};
UIColors bright_mode = {
/*background*/ { 255, 255, 255 },
/*font*/ { 50, 50, 50 }
};
}
Code: Select all
#include
UIColors& ui_colors() {
return params::ui_bright_mode ? params::bright_mode : params::night_mode;
}
int main()
{
std::cout