朋友A,B,C,D去旅行。他们花在各种开支上。费用是分摊的。
例子:
编写一个程序来计算每个人应该得到多少,或者每个人应该给对方多少。应用程序应该是可伸缩的,朋友的数量可以改变。
针对上述问题,我编写了以下代码。我需要帮助,以了解我是否编写了质量代码,使用了最优的OOP设计。
public class SpendDetect
{
Map<String, PayDetails> outputMap = new HashMap<String, PayDetails>();
public void getPayDetails(String payer, int amount, List<String> beneficiary) {
List<String> consolidatedBenificiary = beneficiary;
int dividableCount = consolidatedBenificiary.size();
int amountToBePaid = 0;
/**
* Check if the payer is also a beneficiary
*/
boolean IfPayerIsBenificiary = checkIfPayerIsBenificiary(payer,
beneficiary);
/**
* If the payer is beneficiary remove the payer from the list of
* beneficiaries
*/
if (IfPayerIsBenificiary) {
consolidatedBenificiary.remove(payer);
}
/**
* Calculate the amount to be payed back by the benificiary
*/
amountToBePaid = amount / dividableCount;
/**
* List the details to be paid by the beneficiary to the payer
*/
for (String benificiaryIndividual : beneficiary) {
System.out.println(benificiaryIndividual + " should be paying "
+ amountToBePaid + " to " + payer);
}
}
/**
* Method to check if the payer is a benificiary
*
* @param payer
* @param beneficiary
* @return
*/
public boolean checkIfPayerIsBenificiary(String payer,
List<String> beneficiary) {
boolean IfPayerIsBenificiary = false;
if (beneficiary.contains(payer)) {
return true;
}
return IfPayerIsBenificiary;
}
/**
* Set whether the amount is payable
*
* @param isPayable
* @param amount
* @param payDetails
* @return
*/
public PayDetails setPayableOrToBePayed(boolean isPayable, int amount,
PayDetails payDetails) {
if (isPayable) {
payDetails.Payable = payDetails.Payable + amount;
} else {
payDetails.toBePayed = payDetails.toBePayed + amount;
}
return payDetails;
}
public static void main(String[] args) {
SpendDetect spd = new SpendDetect();
List<String> benificiaryList = new ArrayList<String>();
benificiaryList.add("A");
benificiaryList.add("B");
benificiaryList.add("C");
benificiaryList.add("D");
spd.getPayDetails("A", 100, benificiaryList);
benificiaryList.clear();
benificiaryList.add("B");
benificiaryList.add("C");
spd.getPayDetails("D", 500, benificiaryList);
benificiaryList.clear();
benificiaryList.add("A");
benificiaryList.add("B");
benificiaryList.add("C");
spd.getPayDetails("B", 300, benificiaryList);
}
}发布于 2017-10-12 09:49:55
内联推荐通常没有JavaDoc评论(/*对/**)。请检查您的注释,如果它们添加了任何新的信息,这些信息不在方法或变量名称的范围之内,例如:
/**
* If the payer is beneficiary remove the payer from the list of
* beneficiaries
*/
if (IfPayerIsBenificiary) {
consolidatedBenificiary.remove(payer);
}可能是一个需要改进的人(意见!)可读性:
if (ifPayerIsBenificiary) consolidatedBenificiary.remove(payer);正如其他审查员所提到的,我只能强调这一点:注释不是用来解释您在做什么,而是解释原因。
变量在java中开始小写。
在java中,在方法的开头定义/初始化变量并不常见。当你需要的时候就去做。(如amountToBePaid)
命名一个方法getPayDetails并返回void是令人困惑的。就叫它print...吧
List<String> benificiaryList = new ArrayList<String>();从Java 7开始,您可以省略第二个<String>并使用菱形操作符<>
checkIfPayerIsBenificiary可以写成:
public boolean checkIfPayerIsBenificiary(String payer, List<String> beneficiary)
{
return beneficiary.contains(payer);
}如果不需要使用public,只需内联一种用法即可。你的变量告诉了那个地方的一切-- IfPayerIsBenificiary。
不使用setPayableOrToBePayed和outputMap。如果您的问题中没有遗漏代码,只需删除它。
consolidatedBenificiary是多余的,可以内联。
(在您完成代码后继续)
发布于 2017-10-12 10:07:39
谢谢你分享你的代码!
payDetails.Payable = payDetails.Payable +量;
这违反了最重要的OO原则:信息隐藏/封装。它还包含了嫉妒代码气味的特性。
您所拥有的注释看起来是生成的,并且不包含代码本身以外的任何信息。
但是注释应该解释为什么您的代码是这样的。
发布于 2017-10-12 10:07:05
@mheinzerling可能会提到关于代码lol的所有内容。因此,我只需指出您的代码中可能还没有讨论过的一件事。
我不鼓励使用注释来解释您的方法正在做什么或您使用的变量。您已经通过它们的名称表达了一些方法的意图。添加一条评论来解释上述意图是多余的。
如果要使用注释,它们应该解释代码的原因,而不是代码的内容。我不确定使用JavaDoc注释的最佳实践是什么,但我认为没有它们我们会更好。
https://codereview.stackexchange.com/questions/177737
复制相似问题