首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >费用分摊计算

费用分摊计算
EN

Code Review用户
提问于 2017-10-12 08:43:48
回答 4查看 4K关注 0票数 5

朋友A,B,C,D去旅行。他们花在各种开支上。费用是分摊的。

例子:

  • A花100英镑买A,B,C和D的早餐
  • D花500英镑买B和C的出租车。
  • B花300英镑午餐吃A,B和C

编写一个程序来计算每个人应该得到多少,或者每个人应该给对方多少。应用程序应该是可伸缩的,朋友的数量可以改变。

针对上述问题,我编写了以下代码。我需要帮助,以了解我是否编写了质量代码,使用了最优的OOP设计。

代码语言:javascript
复制
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);

    }
}
EN

回答 4

Code Review用户

发布于 2017-10-12 09:49:55

注释

内联推荐通常没有JavaDoc评论(/*/**)。请检查您的注释,如果它们添加了任何新的信息,这些信息不在方法或变量名称的范围之内,例如:

代码语言:javascript
复制
    /**
     * If the payer is beneficiary remove the payer from the list of
     * beneficiaries
     */

    if (IfPayerIsBenificiary) {

        consolidatedBenificiary.remove(payer);
    }

可能是一个需要改进的人(意见!)可读性:

代码语言:javascript
复制
  if (ifPayerIsBenificiary) consolidatedBenificiary.remove(payer);

正如其他审查员所提到的,我只能强调这一点:注释不是用来解释您在做什么,而是解释原因。

Variables/Method

变量在java中开始小写。

在java中,在方法的开头定义/初始化变量并不常见。当你需要的时候就去做。(如amountToBePaid)

命名一个方法getPayDetails并返回void是令人困惑的。就叫它print...

泛型

代码语言:javascript
复制
List<String> benificiaryList = new ArrayList<String>();

从Java 7开始,您可以省略第二个<String>并使用菱形操作符<>

Simplification

checkIfPayerIsBenificiary可以写成:

代码语言:javascript
复制
public boolean checkIfPayerIsBenificiary(String payer, List<String> beneficiary)
{
    return beneficiary.contains(payer);
}

如果不需要使用public,只需内联一种用法即可。你的变量告诉了那个地方的一切-- IfPayerIsBenificiary

未使用代码

不使用setPayableOrToBePayedoutputMap。如果您的问题中没有遗漏代码,只需删除它。

consolidatedBenificiary是多余的,可以内联。

(在您完成代码后继续)

票数 4
EN

Code Review用户

发布于 2017-10-12 10:07:39

谢谢你分享你的代码!

OOP

payDetails.Payable = payDetails.Payable +量;

这违反了最重要的OO原则:信息隐藏/封装。它还包含了嫉妒代码气味的特性。

杂乱的评论

您所拥有的注释看起来是生成的,并且不包含代码本身以外的任何信息。

但是注释应该解释为什么您的代码是这样的。

票数 4
EN

Code Review用户

发布于 2017-10-12 10:07:05

@mheinzerling可能会提到关于代码lol的所有内容。因此,我只需指出您的代码中可能还没有讨论过的一件事。

我不鼓励使用注释来解释您的方法正在做什么或您使用的变量。您已经通过它们的名称表达了一些方法的意图。添加一条评论来解释上述意图是多余的。

如果要使用注释,它们应该解释代码的原因,而不是代码的内容。我不确定使用JavaDoc注释的最佳实践是什么,但我认为没有它们我们会更好。

用代码表达自己!

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/177737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档