Struktur oder Klasse nur in einer Funktion deklarieren
-
Hi zusammen
ich stelle mir gerade eine Stilfrage.
Ich habe eine Funktion, die nur Daten verarbeitet und dazu eine Zwischenstruktur benötigt. Ich wollte darauf verzichten, diese Zwischenstruktur in meiner gesamten Klasse bekannt zu machen.void processingDataFunction( const std::unordered_map<unsigned, DataClass> &data ) { // Struktur wird nur lokal benoetigt struct TemporaryDataStorage { std:.string TempString = ""; unsigned TempNumber = 0; }; // Process Data std::vector<TemporaryDataStorage> TempData; for ( auto &dataitem : data ) { // Do Stuff } }
Wie findet ihr das vom Stil her? ( unabhängig davon ob es "struct" oder "class" ist ).
Ich könnte auch ein Tupel benutzen, aber bin eigentlich kein Freund davon, einfach weil:TemporaryDataStorage dummy; dummy.TempString
aussagekräftiger ist als
std::get<0> ( dummy )
-
Warum nicht ¯\(ツ)/¯.
Solang du es nicht rausgibst um es vom "Benutzer" wiederzukriegen an anderer stelle.
-
Mache ich auch manchmal. Ist jedenfalls besser lesbar als z.B. ein pair oder tupel. Ich finde es schon furchtbar genug, dass man ein std::pair in maps hat - mir wäre da .key und .value lieber als .first und .second.
-
@wob sagte in Struktur oder Klasse nur in einer Funktion deklarieren:
mir wäre da .key und .value lieber als .first und .second.
for( auto&& [ key, value ] : aMap ) ...
-
@It0101 sagte in Struktur oder Klasse nur in einer Funktion deklarieren:
Wie findet ihr das vom Stil her?
Gut. Warum fragst du?
-
Eigene Definitionen sollten einen möglichst kleinen Scrope haben, damit möglichst wenig Seiteneffekte entstehen können, wenn sie geändert werden. Dein Vorgehen ist also völlig in Ordnung.
Übrigens wurden aus diesem Grund namespaces eingeführt.
-
@manni66 sagte in Struktur oder Klasse nur in einer Funktion deklarieren:
@wob sagte in Struktur oder Klasse nur in einer Funktion deklarieren:
mir wäre da .key und .value lieber als .first und .second.
for( auto&& [ key, value ] : aMap ) ...
Nice. Ab welchem Standard geht das?
Gut. Warum fragst du?
Ich rate mal: weil er Anfänger ist und sich bei vielen Dingen daher nicht sicher, ob seine auf beschränkter Erfahrung beruhende Einschätzung auch "richtig" ist. Anders gesagt: es könnte ja Gründe geben aus denen das furchtbar doof ist was er vor hat, die er bloss nicht kennt.
Was in dem Fall halt nicht so ist. Aber ich finde das schon gut lieber mal zu fragen als zu riskieren sich grässliche Unarten anzugewöhnen.
EDIT: Upps, übersehen. @It0101 ist ja gar kein Anfänger. Das selbe gilt aber auch irgendwo für erfahrene Programmierer. Ich bin mir auch oft nicht sicher ob irgendwas ne tolle Idee oder doch nicht so schlau ist.
-
@hustbaer sagte in Struktur oder Klasse nur in einer Funktion deklarieren:
Nice. Ab welchem Standard geht das?
C++17
https://en.cppreference.com/w/cpp/language/structured_binding
-
Aber ich finde das schon gut lieber mal zu fragen als zu riskieren sich grässliche Unarten anzugewöhnen.
Ja. Mich interessiert nur, ob da irgendwo ein Ratschlag existiert, der das nicht gutheißt.
-
@manni66 OK, stimmt, das wäre wirklich interessant.
-
@hustbaer sagte in Struktur oder Klasse nur in einer Funktion deklarieren:
Gut. Warum fragst du?
Anders gesagt: es könnte ja Gründe geben aus denen das furchtbar doof ist was er vor hat, die er bloss nicht kennt.
Ganz genau. Ich habe das Feature noch nie verwendet, war mir nicht mal sicher ob es kompiliert. Ich wollte halt ganz bewusst die Struktur nicht bekannt machen, weil sie eben nur lokale Bedeutung hat. Und da ich mir nicht sicher war, ob das "üblich" ist, habe ich lieber mal nachgefragt.
Auch erfahrene Softwareentwickler haben nicht immer schon jedes Feature mal benutzt. Und da man ja auch nach langer Zeit immer noch besser werden will, muss man halt auch mal neue Ideen verfolgen und auf Sinnhaftigkeit prüfen
Danke Euch!
Beim nächsten Mal stelle ich eine kompliziertere Frage, damit ihr nicht wieder unterfordert seid
-
Also wie üblich es ist das direkt lokal in der Funktion zu machen weiss ich ehrlich gesagt nicht. Vermutlich nicht sehr. Das, also der Überraschungsfaktor, wäre aber IMO das einzige was dagegen spricht.
Üblicher wäre es das Zeug in einen anonymen Namespace zu packen. Die einzigen beiden Vorteile dieser Variante die mir auf schnell einfallen sind
- Üblicher -> weniger Überraschung (POLA) - weiss aber nicht ob das so ein guter Grund ist in diesem Fall
- Wenn man alles in einem anonymen Namespace am Anfang des Files sammelt, hat man einen besseren Überblick über alle in dem File verwendeten Hilfstypen
-
@hustbaer sagte in Struktur oder Klasse nur in einer Funktion deklarieren:
Üblicher wäre es das Zeug in einen anonymen Namespace zu packen.
Aber auch nur, weil lokale Strukturen bis C++11 nicht im Zusammenhang mit Templates (wie hier der vector) erlaubt waren.
-
@manni66 Vermutlich.
Wobei mir gerade ein Grund für
std::pair
/std::tuple
einfällt: es macht potentiell weniger Template-Bloat. Wenn ich an 10 Stellen einpair<string, int>
verwende und damit nenvector
spezialisiere, dann ist das eine Spezialisierung. Wenn ich es an 10 Stellen mit nem lokalenstruct Foo { string bar; int baz; };
mache, dann sind es 10 Spezialisierungen.Als Zwischenlösung eignen sich structs in anonymen Namespaces dann aber auch nicht gut. Da müsste man dann schon detail Namespaces verwenden und die Hilfs-structs recyclen.
-
Der "bloat" wäre mir derzeit egal. Die Lesbarkeit hatte in dem Moment für mich Vorrang und die ist halt bei std::pair/std::tuple eher mittelmäßig.