代码之家  ›  专栏  ›  技术社区  ›  Crystal

爪哇中方法逻辑的帮助

  •  1
  • Crystal  · 技术社区  · 15 年前

    我有一个贷款类,在其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 回复  |  直到 15 年前
        1
  •  4
  •   cletus    15 年前

    你已经确定了 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 物体。 付款 是这个模型中的新对象;

    3. 这三种方法都是根据 GETApple() printPayment() .

    所以我希望这能引导你走向正确的方向。我想这里的概念是 功能成分 ,根据其他函数组成函数,并使内部函数具有足够的粒度,以便有效地组合在一起。

        2
  •  1
  •   Michael Aaron Safyan    15 年前

    您的打印付款功能非常大。一般来说,最好让每个函数“做一件事,做一件事”,并使函数相对较短。我建议您将计算逻辑与打印逻辑分开;提供计算这些不同付款的函数,让打印函数只打印调用这些计算函数的结果。

    如果您担心冗余(这是一些以后的计算依赖于以前可能执行过的早期计算),那么您可以使用动态编程,这基本上意味着您将以前的结果累积到一个数组或矩阵中,以便在后续计算中重用它们。您可以将整个摊销表计算为二维数组,在这种情况下,您可以通过在该数组中查找早期计算的付款来查找它们。

        3
  •  0
  •   ZeissS    15 年前

    也许您应该有一个方法来返回array/set/list/resultset/datacontainer( 添加更多的流行词来迷惑你 -它毕竟是你的家庭作业;)你可以在其他方法中使用。

        4
  •  0
  •   MeBigFatGuy    15 年前

    如果你描述一个方法的作用,你使用“和”这个词,那么这个方法很可能做的太多了。每个方法都应该做一件事,所以打印是一件事,计算是另一件事。所以有两种方法。