Lösung für die Magic-Number-Problem...?
Betrachten Sie das folgende code-segment...
public static UserStatus getEnum(int code) {
switch (code) {
case 0:
return PENDING;
case 1:
return ACTIVE;
case 2:
return SUSPENDED;
case 3:
return DELETED;
case 4:
return LOGIN_DISABLED;
default:
return null;
}
}
Nun Nummer 3 und 4 in den Fällen(Fall 3 und Fall 4) erkannt werden als "Magische zahlen", die von SONAR.
Zu vermeiden, dass Problem, ich habe meinen code-segment wie folgt...
public static UserStatus getEnum(int code) {
final int Pending=0;
final int Active=1;
final int Suspended=2;
final int Deleted= 3;
final int Login_details=4;
switch (code) {
case Pending:
return PENDING;
case Active:
return ACTIVE;
case Suspended:
return SUSPENDED;
case Deleted:
return DELETED;
case Login_details:
return LOGIN_DISABLED;
default:
return null;
}
}
Ist dies ein guter Weg, um zu lösen die Magische Zahl in dieser Art von Szenario ?.
Was meinst du, dass 3 und 4 sind "erkannt als " Magische zahlen"? Was ist die "Magische Zahl-Problem"?
Ich nehme an, du redest
ja Ihr habt Recht: überprüfen Sie diese andere Frage Referenz: stackoverflow.com/questions/47882/...
Eine bessere Möglichkeit wäre, eine Klasse haben, mit
Dies ist in Bezug auf das SONAR. SONAR erkennt diese als "Magische Zahlen"
Ich nehme an, du redest
SONAR
erkennen Sie als Magic Numbers
?ja Ihr habt Recht: überprüfen Sie diese andere Frage Referenz: stackoverflow.com/questions/47882/...
Eine bessere Möglichkeit wäre, eine Klasse haben, mit
static
Werte, so dass Häufig verwendete Magic
zahlen können dorthin verlegt werden, dass Sie überall verwendet werden können in das Projekt.Dies ist in Bezug auf das SONAR. SONAR erkennt diese als "Magische Zahlen"
InformationsquelleAutor Ruchira Gayan Ranaweera | 2013-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entnehme ich, dass Sie wollen, vermeiden die Verwendung von integer-Literale im code. Ihre Lösung ist nicht besonders effektiv, weil es bewegt sich einfach die Literale an die Spitze der Methode. Gewinnt es ein bisschen, denn es gibt aussagekräftige Namen für Konstanten, aber diese Namen sind privat für die Methode.
Ein besserer Ansatz wäre zu definieren, die die zahlen als Felder in einer Schnittstelle. Sie können dann statisch importieren Sie die Felder aus und verwenden Sie Sie als symbolische Namen für die Konstanten.
Wenn die enum deklariert ist, in der gleichen Reihenfolge wie die Konstanten:
können Sie tun, ein weiterer trick:
Jedoch, dies schafft eine Verknüpfung zwischen der Konstanten Werte und die Deklaration der enum. Dies kann in Ordnung sein, je nachdem, wo die tatsächlichen Parameterwerte erzeugt werden, die in aufrufen von
getEnum
.Ja, in diesen Tagen ist es besser als Stil zu verwenden, eine Klasse zu deklarieren, symbolische Konstanten. So oder so wäre eine Verbesserung gegenüber dem OP ist der aktuelle code.
Ich denke, es ist nicht über das setzen der Konstante in der "Klasse" oder "Schnittstelle". Die anti-pattern : Erstellung einer Schnittstelle nur für das setzen von Konstanten. Konstanten sollten geht an die Klasse/Schnittstelle/Typ, geeignet ist, enthalten. Wenn keine dann mit einer letzten un-instanziierbaren Klasse statt, zu verhindern, dass falsche semantische Bedeutung auf den umschließenden Typ
Das eigentliche anti-pattern bringt die Konstanten in einer Klasse namespace Implementierung einer Schnittstelle. Aus diesem Grund, "class "und "interface" ist eine wichtige Unterscheidung. (Sie verlängern, anstatt Sie umzusetzen, Klassen.) Mit
import static
und deklarieren Sie Konstanten, die in einem (nicht-instanziierbaren) - Klasse statt einer Schnittstelle ist es aus dem Reich der ein anti-pattern. (Siehe zum Beispiel die Wikipedia article Constant interface.)Das anti-pattern " Umsetzung ein Konstanten-interface, nicht deklarieren, und eine statisch importieren der Konstanten-Namen.
InformationsquelleAutor Ted Hopp
Das problem ist geradlinig und klar: wenn die Leute Lesen Ihren code, es ist nicht ersichtlich, warum 1 geben wird, ANGEMELDET. Was ist die Bedeutung von 1?
Sollten Sie eine semantische Bedeutung zu. Die Verwendung von Konstanten ist, was normalerweise getan werden sollte:
(Angenommen, die
getEnum()
ist Teil des UserService, sollte der code so Aussehen)Vorgeschlagen von einer anderen Antwort, verlassen Sie sich auf die Ordnungszahl Wert des enum zu tun, die int-enum-mapping. Allerdings müssen Sie sich bewusst sein, dass, eine solche Art und Weise kann dazu führen, problem, wenn Sie rearraged die Werte von enum, oder neue Werte Hinzugefügt, an der position, abgesehen vom Ende. Die ordinale Werte werden geändert und Sie haben keine Möglichkeit, zu überschreiben.
Andere Sache zu beachten ist, gibt es etwas, was Sie nicht richtig gemacht in deinem code:
InformationsquelleAutor Adrian Shum