Метод, генерирующий повторяющийся код. Как упростить? - PullRequest
0 голосов
/ 28 мая 2020

Я изучаю Java, и мне нужно будет создать проект для университетского проекта.

    public double getCreditAmount() {
    return movementList.stream()
            .filter(s -> s.getDate().before(tomorrow()))
            .filter(s -> s.type() == MovementType.CREDIT)
            .mapToDouble(s -> s.amount())
            .reduce(Double::sum)
            .orElse(0.0);
}

public double getDebitAmount(){
    return movementList.stream()
            .filter(s -> s.getDate().before(tomorrow()))
            .filter(s -> s.type() == MovementType.DEBIT)
            .mapToDouble(s -> s.amount())
            .reduce(Double::sum)
            .orElse(0.0);
}

public double updateBalance(){
    return sumOfTotal = getCreditAmount()-getDebitAmount();
}

Это мой код, который, принимая перечисление (ДЕБЕТ ИЛИ КРЕДИТ), добавляет текущие значения А метод updateBalance вычитает их друг из друга. Но я понимаю, что таким образом получается повторяющийся код, которого я мог бы как-то избежать. Как я мог избежать повторения кода? Я знаю, что должен создать более общий метод, который избегает повторения кода getCreditAmount () и getDebitAmount (). Но как мне это сделать?

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Поскольку единственная разница - это значение MovementType, укажите его в качестве параметра:

public double getAmount(MovementType type) {
    return movementList.stream().filter(s -> s.getDate().before(tomorrow()))
                       .filter(s -> s.type() == type).mapToDouble(s -> s.amount())
                       .reduce(Double::sum).orElse(0.0);
}

И используйте это так (не требуется промежуточная sumOfTotal переменная)

public double updateBalance(){
    return getAmount(MovementType.CREDIT) - getAmount(MovementType.DEBIT); 
}
0 голосов
/ 28 мая 2020

Как уже говорили другие, вы можете передать тип движения в качестве параметра, это следует ключевому принципу в кодировании: DRY (Не повторяйтесь).

Другие вещи, которые вам нужно сделать:

  1. Дайте вашему методу общее c имя, потому что теперь он поддерживает две операции: CREDIT и Debit Eg get, fetch, compute. Я выбрал вычисление, потому что мы выполняем некоторые вычисления в этом методе. этого потока. Итак, я предполагаю, что s.amount () не возвращает double, поэтому я передаю сумму (s.amount ()) в Double :: parseDouble, чтобы проанализировать ввод до значения Double

Вот как я подхожу к этой проблеме

public double computeAmount(MovementType type) {
    return movementList.stream()
            .filter(s -> s.getDate().before(tomorrow()))
            .filter(s -> s.type() == type)
            .mapToDouble(s -> Double::parseDouble(s.amount()))
            .reduce(Double::sum)
            .orElse(0.0);
}

public double updateBalance(){
    return computeAmount(MovementType.CREDIT) - computeAmount(MovementType.DEBIT); 
}
0 голосов
/ 28 мая 2020

Просто реализуйте один метод и передайте MovementType в качестве параметра:

public double getAmount(MovementType movementType) {
    return movementList.stream()
            .filter(s -> s.getDate().before(tomorrow()))
            .filter(s -> s.type() == movementType)
            .mapToDouble(s -> s.amount())
            .reduce(Double::sum)
            .orElse(0.0);
}

public double updateBalance() {
    return getAmount(MovementType.CREDIT) - getAmount(MovementType.DEBIT);
}

Допустимой альтернативой было бы определение дополнительного getBalanceAmount() метода, который делает все это за один go. Это предотвращает необходимость дважды передавать список:

public double getBalanceAmount(){
    return movementList.stream()
            .filter(s -> s.getDate().before(tomorrow()))
            .mapToDouble(s -> s.amount() * (s.type() == MovementType.DEBIT ? -1 : 1)
            .reduce(Double::sum)
            .orElse(0.0);
}
...