Je mehr Variablen eingeführt werden, desto weniger lesbar und komplizierter wird der Code sein.
Manchmal ist es sogar schwierig, zwei Namen für eine Entität zu erfinden, die semantisch identisch aussehen würden.
Zum Beispiel kann eine Funktionsauflistung mehrere Bildschirme belegen. In diesem Fall müssen Sie, wenn Sie einen Namen wie locVar
gefunden haben, die Funktionsauflistung nach hinten scrollen, um zu bestimmen, was dieser Name bedeutet.
Außerdem kann eine Funktion mehrere Parameter haben. Wirst du neue Aliase für jeden Parameter einführen?
Für Leser Ihres Codes wird es nicht klar sein, dass Sie neue lokale Variablen nur eingeführt haben, um Ihren Kodierungsstil zu unterstützen. Sie können zum Beispiel denken, dass Sie die Funktion geändert haben und vergessen haben, Variablen zu entfernen, die nicht mehr notwendig sind :)
Betrachten Sie zum Beispiel eine rekursive Funktion, die die Summe der Ziffern einer Zahl berechnet.
unsigned int sum(unsigned int x)
{
const unsigned int Base = 10;
unsigned int digit = x % Base;
return digit + ((x /= Base) == 0 ? 0 : sum(x));
^^^^^^^^^^^^^
}
oder das kann wie
unsigned int sum(unsigned int x)
{
const unsigned int Base = 10;
return x % Base + (x/Base == 0 ? 0 : sum(x/Base));
}
geschrieben werden Was ist der Zweck ist es, eine neue lokale Variable als Alias von x
in dieser Funktion einzuführen?
unsigned int sum(unsigned int x)
{
const unsigned int Base = 10;
unsigned int y = x;
unsigned int digit = y % Base;
return digit + ((y /= Base) == 0 ? 0 : sum(y));
}
Was mich dann die erste Funktion Implementierung ohne die Zwischengröße y
ist klar. Die rekursive Natur der Funktion ist sichtbarer, wenn dieselbe Variable x
verwendet wird.
Wenn Sie darauf hinweisen möchten, dass ein Parameter in einer Funktion nicht geändert wird, können Sie die Funktion mit dem Parameter mit dem Qualifier const deklarieren oder definieren.
Zum Beispiel
unsigned int sum(const unsigned int x)
{
const unsigned int Base = 10;
return x % Base + (x/Base == 0 ? 0 : sum(x/Base));
}
In C++ Funktionsaufrufe aussehen könnte
#include <iostream>
constexpr unsigned int sum(const unsigned int x)
{
const unsigned int Base = 10;
return x % Base + (x/Base == 0 ? 0 : sum(x/Base));
}
int main()
{
std::cout << sum(123456789) << std::endl;
int a[sum(123456789)];
std::cout << sizeof(a) << std::endl;
}
Die Programmausgabe
ist
45
180
Ja, die Änderung der Parameter ist etwas fehleranfälliger. Auch im Debug werden Sie nicht wissen, was der ursprüngliche Wert eines Parameters ist, sondern dessen tatsächlicher Wert. Sie tun nicht # 1 (richtig) wegen Compiler und/oder Performance, sondern für sich selbst. –
IMO Parameter ändern ist nicht schlecht Codierungsstil. Es liegt ganz bei Ihnen. –
@Plouff Der einzige Grund für die Verwendung des ersten Ansatzes besteht darin, dass der ursprüngliche Wert mehrmals verwendet wird. Ansonsten muss keine neue lokale Variable eingeführt werden. Funktionsparameter sind bereits seine lokalen Variablen. –