[英]Help with method logic in Java, hw
我有一個Loan類,在其printPayment方法中,它為硬件分配打印貸款的攤銷表。 我們還將實現先打印后付款的方式和先打印后付款的方式。 由於我的計算是通過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;
}
謝謝!
您已經確定了printPayments()
, printFirstPayment()
和printLastPayment()
方法具有共同的邏輯。 通常,您希望最大程度地減少此類代碼的重復,並且這樣做的兩種常見方法是:
根據其中一種方法實施除一種方法外的所有方法; 要么
根據私有方法實現所有方法。
因此,例如:
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
或使用數組。
我想在這里說明的要點是:
創建付款和顯示付款的邏輯已分開;
單個方法getPayments()
進行計算並返回“ Payment
List
”對象。 Payment
是此模型中的新對象;
這三種方法都是根據getPayments()
和printPayment()
。
因此,我希望這會引導您朝正確的方向前進。 我想這里的概念是功能組合 ,即根據其他功能組合您的功能,並使內部功能細化到可以有效組合在一起的程度。
您的printPayments函數非常大。 通常最好使每個功能“做好一件事情,一件事情做好”,並使功能相對較短。 我建議您將計算邏輯與打印邏輯分開; 提供用於計算這些各種付款的功能,並讓您的打印功能僅打印調用這些計算功能的結果。
如果您擔心冗余(某些后續計算取決於您先前可能執行的早期計算),則可以使用動態編程,這基本上意味着您將先前的結果累加到數組或矩陣中,以便它們可以可在后續計算中重用。 您可以將整個攤銷表計算為二維數組,在這種情況下,您可以簡單地通過在該數組中進行查找來查找以前計算的付款。
也許您應該有一個返回數組/集合/列表/結果集/數據容器的方法( 添加更多的流行詞使您感到困惑 -畢竟是您的功課;),該方法可以在其他方法中使用。
如果在描述方法的作用時使用“和”一詞,則可能是該方法做得太多。 每種方法應該做一件事,所以打印是一件事,而計算是另一件事..所以是兩種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.