Split-Betrag in Eingänge übergeben
Ich habe eine Anforderung, wo ich totalAmount bekomme und in wie viele Teile dieser Betrag als Eingaben aufgeteilt werden soll. Für die Ausgabeantwort verwende ich Builder-Muster und vermeide auch Nullfelder. Der Gesamtbetrag ist eine große Dezimalzahl (wenn null oder kleiner als 0, Ausnahme auslösen) und die Anzahl der Eingaben kann zwischen 1 und 3 liegen (wenn außerhalb dieses Bereichs oder nicht numerisch, Ausnahme auslösen). Ich habe diesen Code geschrieben, aber ich bin nicht überzeugt und denke, dass es einen saubereren und besseren Weg geben könnte, der auch einfach zu verstehen ist, wenn man sich nur den Code ansieht. Auch beim Splitten werden alle zusätzlichen Cents, die noch übrig sind, zum 1. Betrag hinzugefügt.
z.B. Wenn 100,01 der Gesamtbetrag ist, den ich in 3 Teile teilen muss, sollte ich 33,35 für den ersten Betrag und 33,33 für wiederkehrende Beträge erhalten. Bitte geben Sie an, ob es einen saubereren und besseren Weg gibt, dies zu erreichen.
public OutputResponse splitAmount(BigDecimal totalAmount, int divideInto) {
if (!(1 <= divideInto && 3 >= divideInto)) {
throw new Exception();
}
OutputResponse outputResponse;
if (totalAmount != null && totalAmount.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal recurringAmounts = null;
BigDecimal firstAmount = totalAmount;
if (divideInto > 1) {
recurringAmounts = totalAmount.divide(BigDecimal.valueOf(divideInto), 2, RoundingMode.FLOOR);
firstAmount = totalAmount.subtract(recurringAmounts.multiply(new BigDecimal(divideInto - 1)));
}
outputResponse = OutputResponse.builder()
.firstAmt(firstAmount)
.secondPmtAmt(recurringAmounts)
.build();
if (divideInto > 2) {
outputResponse.setThirdPmtAmt(recurringAmounts);
}
} else {
throw new Exception();
}
}
```
Antworten
Format
Verwenden Sie die richtige Einrückung, verwenden Sie nach einer geschweiften Klammer einen Tabulator oder 4 Leerzeichen.
Lesbarkeit
Fügen Sie eine Nachricht mit Ihren Ausnahmen hinzu. Es ist eine schreckliche Praxis, einfach eine normale Ausnahme und keine Nachricht zu werfen. Sie müssten sich die Zeilennummern im Stack-Trace ansehen, um zu wissen, woher die Ausnahmemeldung stammt. Es ist besser, eine benutzerfreundliche Nachricht zu haben, die das aufgetretene Problem beschreibt.
Nicht !mit >oder mischen <. Es ist verwirrend zu lesen.
Versuchen Sie, eine negative oder positive Validierung zu verwenden. Seien Sie zum Beispiel konsequent, indem Sie entweder überprüfen, ob die Eingaben falsch sind, oder immer überprüfen, ob sie richtig sind. Mit anderen Worten, Ihre Fehlermeldungen stehen ganz oben oder unten.
OutputResponseIst kein guter Name. Es ist bedeutungslos. Angenommen, dies ist eine Klasse, die Sie erstellt haben, sollten Sie den Namen ändern. Erwägen Sie auch die Verwendung von ArrayListanstelle von separaten Feldern, damit Sie keine 4+-Separationen umgestalten müssen.
Beispielcode:
public OutputResponse splitAmount(BigDecimal totalAmount, int divideInto) {
if ((1 > divideInto || 3 < divideInto)) {
throw new Exception("Divide into must be between 1-3");
}
if (totalAmount == null || totalAmount.compareTo(BigDecimal.ZERO <= 0) {
throw new Exception("Total amount must be a number greater than 0!");
}
BigDecimal recurringAmounts = null;
BigDecimal firstAmount = totalAmount;
if (divideInto > 1) {
recurringAmounts = totalAmount.divide(BigDecimal.valueOf(divideInto), 2, RoundingMode.FLOOR);
firstAmount = totalAmount.subtract(recurringAmounts.multiply(new BigDecimal(divideInto - 1)));
}
OutputResponse outputResponse = OutputResponse.builder()
.firstAmt(firstAmount)
.secondPmtAmt(recurringAmounts)
.build();
if (divideInto > 2) {
outputResponse.setThirdPmtAmt(recurringAmounts);
}
}