F
@Helmut-Jakoby sagte in Code refactoring C/C++:
PS. Der Vorschlag von @cpr scheint mir auch schlüssig, das mit den Strukturen.
Attributen einer Klasse stelle ich persönlich ein "m_" voran. "This" benutze ich aber auch, und zwar bei Aufrufen von "eigenen" Methoden.
Ich persönlich bevorzuge direkte Namen und empfinde solche Präfixe eher als Krücken. Entweder sind die Funktionen so kurz, so dass man leicht Member von Parametern oder lokalen Variablen unterscheiden kann, oder der Editor hebt mir ohnehin die verschiedenen Variablen-Kategorien entsprechend hervor.
Was Namenskonflikte angeht, so gebe ich Parametern und Membern durchaus gerne die selben Namen, wenn sie die exakt selbe Sache repräsentieren. Das lässt sich nämlich meistens elegant mit einer Member-Initialisierungsliste lösen:
Connection(const char* host, ...)
: host{ strdup(host) }, ...
{
...
}
In diesem Fall hier natürlich nicht, da es sich nicht um einen Konstruktor handelt, aber bei mir wären die Verbindungsdaten wahrscheinlich auch eine eigene Klasse, so dass das letztendlich ebenfalls ein Konstruktoraufruf wäre:
EstablishConnection(const char* host, ...)
: connection_data{ host, ... }, ...
{
...
}
Aber letztendlich sind Namen Geschmackssache, ich hab's halt gern direkt und simpel ohne zu viel "Dekorationen".
@orangejuice23 @cpr Regarding the number of parameters i was thinking it would be neat if C++ had keyword arguments just like Python. I then came up with the idea to emulate this using C++20 Designated Initializers, which achieves a similar effect:
#include <iostream>
#include <cstdint>
#include <string>
#include <print>
using namespace std;
struct ConnectionParams
{
string host;
uint16_t port = 80;
string clientId;
string customKey = "default_key";
string customValue = "default_value";
uint16_t timeout = 300;
};
struct Connection
{
Connection(ConnectionParams params)
: params{ params }
{
}
ConnectionParams params;
};
auto main() -> int
{
Connection c{{ .host = "my-host", .clientId = "client1" }};
std::print(
R"(
host:{0}
port:{1}
clientId:{2}
customKey:{3}
customValue:{4}
timeout:{5}
)",
c.params.host,
c.params.port,
c.params.clientId,
c.params.customKey,
c.params.customValue,
c.params.timeout
);
}
Output:
host:my-host
port:80
clientId:client1
customKey:default_key
customValue:default_value
timeout:300
https://godbolt.org/z/vWjWcr86G
This approach allows to specify default values for parameters and only pass those which are relevant in the current context. I think that would be a nice solution, as you don't have to clutter your code by passing all arguments whenever a connection is established. You have to pass the arguments in the same order they were defined in the struct though (Designated Initializers require this), but you can leave out the ones where you are fine with the default values.