Es gibt verschiedene Probleme mit diesem Codeteil, die sich übrigens wie folgt verkürzen lassen:
public List<Money> getMoneyByPersons() {
return persons.size() == 1 ?
moneyService.getMoneyIfHasOnePerson() :
moneyService.getMoney();
}
Es ist unklar, warum eine Person ein Sonderfall ist. Ich nehme an, dass es eine bestimmte Geschäftsregel gibt, die besagt, dass das Erhalten von Geld von einer Person sich grundlegend vom Erhalten von Geld von mehreren Personen unterscheidet. Ich muss jedoch in beide hineinschauen getMoneyIfHasOnePerson
und getMoney
in der Hoffnung zu verstehen, warum es unterschiedliche Fälle gibt.
Der Name getMoneyIfHasOnePerson
sieht nicht richtig aus. Vom Namen würde ich erwarten, dass die Methode prüft, ob es eine einzelne Person gibt, und wenn dies der Fall ist, Geld von ihm bekommt; Sonst nichts tun. In Ihrem Code ist dies nicht der Fall (oder Sie führen die Bedingung zweimal aus).
Gibt es einen Grund, List<Money>
eher eine als eine Sammlung zurückzugeben?
Zurück zu Ihrer Frage, da unklar ist, warum es für eine Person eine Sonderbehandlung gibt, sollte die Ziffer 1 durch eine Konstante ersetzt werden, es sei denn , es gibt eine andere Möglichkeit, die Regeln explizit zu machen. Hier unterscheidet man sich nicht sehr von jeder anderen magischen Zahl. Sie könnten Geschäftsregeln haben, die besagen, dass die Sonderbehandlung für eine, zwei oder drei Personen oder nur für mehr als zwölf Personen gilt.
Wie kann ich den Kontext unterscheiden, um die beste Lösung auszuwählen?
Sie tun alles, was Ihren Code expliziter macht.
Beispiel 1
Stellen Sie sich den folgenden Code vor:
if (sequence.size() == 0) {
return null;
}
return this.processSequence(sequence);
Ist Null hier ein magischer Wert? Der Code ist ziemlich klar: Wenn die Sequenz keine Elemente enthält, verarbeiten wir ihn nicht und geben einen speziellen Wert zurück. Dieser Code kann aber auch so umgeschrieben werden:
if (sequence.isEmpty()) {
return null;
}
return this.processSequence(sequence);
Hier nicht mehr konstant, und der Code ist noch klarer.
Beispiel 2
Nehmen Sie einen weiteren Code:
const result = Math.round(input * 1000) / 1000;
Es dauert nicht allzu lange, um zu verstehen, was es in Sprachen wie JavaScript tut, die es nicht haben round(value, precision)
überladen sind.
Wenn Sie nun eine Konstante einführen möchten, wie würde sie heißen? Der nächste Begriff, den Sie bekommen können, ist Precision
. So:
const precision = 1000;
const result = Math.round(input * precision) / precision;
Verbessert es die Lesbarkeit? Es könnte sein. Hier ist der Wert einer Konstante eher begrenzt, und Sie können sich fragen, ob Sie das Refactoring wirklich durchführen müssen. Das Schöne daran ist, dass die Genauigkeit jetzt nur einmal deklariert wird. Wenn sie sich also ändert, riskieren Sie nicht, einen Fehler zu machen, wie zum Beispiel:
const result = Math.round(input * 100) / 1000;
Ändern des Werts an einem Ort und Vergessen des Werts an dem anderen Ort.
Beispiel 3
Aus diesen Beispielen können Sie den Eindruck gewinnen, dass Zahlen in jedem Fall durch Konstanten ersetzt werden sollten . Das ist nicht wahr. In einigen Situationen führt eine Konstante nicht zu einer Verbesserung des Codes.
Nehmen Sie den folgenden Code:
class Point
{
...
public void Reset()
{
x, y = (0, 0);
}
}
Wenn Sie versuchen, Nullen durch eine Variable zu ersetzen, besteht die Schwierigkeit darin, einen aussagekräftigen Namen zu finden. Wie würdest du es nennen? ZeroPosition
? Base
? Default
? Das Einführen einer Konstante hier würde den Code in keiner Weise verbessern. Es würde es etwas länger machen, und genau das.
Solche Fälle sind jedoch selten. Wenn Sie also eine Nummer im Code finden, bemühen Sie sich, herauszufinden, wie der Code überarbeitet werden kann. Fragen Sie sich, ob die Nummer eine geschäftliche Bedeutung hat. Wenn ja, ist eine Konstante obligatorisch. Wenn nein, wie würden Sie die Nummer nennen? Wenn Sie einen aussagekräftigen Namen finden, ist das großartig. Wenn nicht, haben Sie wahrscheinlich einen Fall gefunden, in dem die Konstante nicht erforderlich ist.
persons
und was beschreibt es? Ihr Code enthält keinerlei Kommentare, daher ist es schwierig zu erraten, was er tut.