Dividi l'importo in input passati

Aug 22 2020

Ho un requisito in cui ottengo totalAmount e in quante parti suddividere tale importo come input. Per l'outputresponse sto usando il modello builder ed evitando anche i campi nulli. L'importo totale è un numero decimale grande (se nullo o minore di 0, genera un'eccezione) e il numero di input può variare tra 1 e 3 (se al di fuori di questo intervallo o non numerico, genera un'eccezione). Ho scritto questo codice, ma non sono convinto e penso che potrebbe esserci un modo più pulito e migliore che sia anche facile da capire solo guardando il codice. Inoltre, durante la divisione, qualsiasi centesimo aggiuntivo rimasto verrà aggiunto al 1° importo.

per esempio. se 100,01 è l'importo totale che devo dividere in 3 parti, dovrei ottenere 33,35 per il primo importo e 33,33 per gli importi ricorrenti. Si prega di avvisare se esiste un modo più pulito e migliore per raggiungere questo obiettivo.

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();
        }
}
```

Risposte

3 dustytrash Aug 22 2020 at 00:24

Formato

Usa il rientro corretto, dopo una parentesi graffa usa una tabulazione o 4 spazi.

Leggibilità

Aggiungi un messaggio con le tue eccezioni. È una pratica terribile lanciare solo un'eccezione regolare e nessun messaggio. Dovresti guardare i numeri di riga nella traccia dello stack per sapere da dove proviene il messaggio di eccezione. È meglio avere un messaggio intuitivo che descriva il problema che si è verificato.

Non mescolare !con >o <. È confuso da leggere.

Prova a utilizzare la convalida negativa o positiva. Ad esempio, sii coerente controllando se gli input sono sbagliati o controlla sempre che siano corretti. In altre parole, i tuoi messaggi di errore sono tutti in alto o in basso.

OutputResponseNon è un bel nome. Non ha senso. Supponendo che questa sia una classe che hai creato, considera di cambiare il nome. Considera anche l'utilizzo ArrayListdi campi piuttosto che separati, in questo modo non è necessario eseguire il refactoring per includere 4+ separazioni.

Codice di esempio:

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);
    }
}