Помогите с логикой метода в Java, hw - PullRequest
1 голос
/ 26 апреля 2010

У меня есть класс Loan, который в своем методе printPayment печатает таблицу амортизации ссуды для присвоения hw.Мы также должны внедрить метод оплаты в первую очередь и метод оплаты в последний раз.Поскольку мои вычисления выполняются в методе printPayment, я не знал, как получить значение в первой или последней итерации цикла и вывести эту сумму.

Один из способов, который я могу придумать, - написать новый метод, который мог бы вернуть это значение, но я не был уверен, что есть лучший способ.Вот мой код:

public abstract class Loan
{   
    public void setClient(Person client)
    {
        this.client = client;
    }

    public Person getClient()
    {
        return client;
    }

    public void setLoanId()
    {
        loanId = nextId;
        nextId++;
    }

    public int getLoanId()
    {
        return loanId;
    }

    public void setInterestRate(double interestRate)
    {
        this.interestRate = interestRate;
    }

    public double getInterestRate()
    {
        return interestRate;
    }

    public void setLoanLength(int loanLength)
    {
        this.loanLength = loanLength;
    }

    public int getLoanLength()
    {
        return loanLength;
    }

    public void setLoanAmount(double loanAmount)
    {
        this.loanAmount = loanAmount;
    }

    public double getLoanAmount()
    {
        return loanAmount;
    }

    public void printPayments()
    {
        double monthlyInterest;
        double monthlyPrincipalPaid;
        double newPrincipal;
        int paymentNumber = 1;
        double monthlyInterestRate = interestRate / 1200;
        double monthlyPayment = loanAmount * (monthlyInterestRate) / 
                                (1 - Math.pow((1 + monthlyInterestRate),( -1 * loanLength)));

        System.out.println("Payment Number | Interest | Principal | Loan Balance");     

        // amortization table
        while (loanAmount >= 0) {
            monthlyInterest = loanAmount * monthlyInterestRate;
            monthlyPrincipalPaid = monthlyPayment - monthlyInterest;
            newPrincipal = loanAmount - monthlyPrincipalPaid;
            loanAmount = newPrincipal;


            System.out.printf("%d, %.2f, %.2f, %.2f", paymentNumber++, monthlyInterest, monthlyPrincipalPaid, loanAmount);
        }
    }
    /*
    //method to print first payment
    public double getFirstPayment()
    {
    }

    method to print last payment
    public double getLastPayment()
    {
    }*/

    private Person client;
    private int loanId;
    private double interestRate;
    private int loanLength;
    private double loanAmount;
    private static int nextId = 1;

}

Спасибо!

Ответы [ 4 ]

4 голосов
/ 26 апреля 2010

Вы уже определили, что методы printPayments(), printFirstPayment() и printLastPayment() имеют общую логику. Как правило, вы хотите минимизировать дублирование такого кода, и для этого есть два способа:

  1. Реализуйте все, кроме одного, в терминах одного из них; или

  2. Реализация всех методов в терминах частного метода.

Так, например:

public void printPayments() {
  for (Payment : getPayments()) {
    printPayment(payment);
  }
}

public void printFirstPayment() {
  printPayment(getPayments().get(0));
}

public void printLastPayment() {
  List<Payment> payments = getPayments();
  printPayment(payments.get(payments.size()-1));
}

private void printPayment(Payment payment) {
  ...
}

private List<Payment> getPayments() {
  ...
}

Теперь это домашнее задание, поэтому вы, возможно, еще не сталкивались с синтаксисом List<Payment>. Если нет, то это дженерики. Есть и другие способы сделать это: использовать неуниверсальный Collection или, например, использовать массивы.

Вот что я хотел проиллюстрировать:

  1. Логика создания и отображения платежей отделена;

  2. Один метод getPayments() выполняет вычисления и возвращает List из Payment объектов. Payment - новый объект в этом макете;

  3. Все три метода реализованы в терминах getPayments() и printPayment().

Так что я надеюсь, что это приведет вас в правильном направлении. Я предполагаю, что концепция функциональная композиция , сочетающая ваши функции в терминах других функций и делающая ваши внутренние функции достаточно гранулированными, чтобы с пользой сгруппироваться.

1 голос
/ 26 апреля 2010

Ваша функция printPayments ужасно велика. Как правило, лучше сделать так, чтобы каждая функция «хорошо выполняла одно и одно», а функции были относительно короткими. Я бы порекомендовал вам отделить логику вычислений от логики печати; предоставляют функции для вычисления этих различных платежей, и ваша функция печати просто печатает результат вызова этих функций вычисления.

Если вас беспокоит избыточность (то есть некоторые последующие вычисления зависят от более ранних вычислений, которые вы, возможно, выполняли ранее), то вы можете использовать динамическое программирование, что в основном означает, что вы накапливаете предыдущие результаты в массиве или матрице, что они могут быть повторно использованы в последующих вычислениях. Вы можете вычислить всю таблицу амортизации в виде двумерного массива, и в этом случае вы можете искать ранее вычисленные платежи, просто просматривая их в этом массиве.

0 голосов
/ 26 апреля 2010

если при описании метода используется слово «и», скорее всего, метод выполняет слишком много. каждый метод должен выполнять одно, поэтому печать - это одно, а вычисление - другое ... поэтому два метода

0 голосов
/ 26 апреля 2010

Может быть, у вас должен быть метод, который возвращает массив / set / list / resultset / datacontainer ( добавьте больше модных слов, чтобы сбить вас с толку - в конце концов, это ваша домашняя работа;)), которую вы можете использовать в другом методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...