为了账号安全,请及时绑定邮箱和手机立即绑定

减少导致重复代码的参数列表

减少导致重复代码的参数列表

元芳怎么了 2022-09-14 16:03:47
我正在处理ATM机项目,我经常需要将账单金额作为参数传递给函数。有许多函数看起来类似于depositCash(int fives, int tens, int twenties, int fifties){...}我知道使用具有太多参数(例如4)的函数是不明智的做法。因此,我试图将这些参数捆绑到一个新的类 billBundle 中,并将其作为参数传递。但后来我遇到了一个新问题,即反复编写重复的代码,如下所示:Billbundle billBundle = new BillBundle(); billBundle.setFives(fives); billBundle.setTens(tens); billBundle.setTwenties(twenties); billBundle.setFifties(fifties); depositCash(billBundle);如果我只是通过所有法案到法案捆绑,那么这将完全做我试图避免的事情。我应该如何处理这个问题?谢谢。
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

BillBundle因为参数对象是一种可伸缩的方法,用于减少方法的参数列表。正如参数对象设计模式的任何实现一样,也意味着在处理参数的代码中移动。避免代码重复以获取账单并将其传递给方法的选项可能是访问者设计模式(以获取账单)和模板方法设计模式(用于处理账单)之间的混合depositCash

假设用于计算账单的信息来自ATM,账单发射器可以计算账单并接受账单处理器作为访客,该处理器获取账单并对其进行处理

interface BillEmitter {


    int getFives();


    int getTens();


    int getTwenties();


    int getFifties();


    default void accept(Visitor v) {

        v.visit(this);

    }

}


// add BillEmitter implementations as needed


public class SomeBillEmitter implements BillEmitter {


    private Atm atm;


    public SomeBillEmitter(Atm atm) {

        this.atm = atm;

    }


    public int getFives() {

        int theFivesBill = 0;

        // compute the fives bill with the information from ATM

        return theFivesBill;

    }


    public int getTens() {

        int theTensBill = 0;

        // compute the tens bill with the information from ATM

        return theTensBill;

    }


    public int getTwenties() {

        int theTwentiesBill = 0;

        // compute the twenties bill with the information from ATM

        return theTwentiesBill;

    }


    public int getFifties() {

        int theFiftiesBill = 0;

        // compute the fifties bill with the information from ATM

        return theFiftiesBill;

    }

}

参观者


interface Visitor {


    default void visit(BillEmitter billEmitter) {


        // template method which gets the bills from the billEmitter

        // and pass them to the bill processor


        Billbundle billBundle = new BillBundle();

        billBundle.setFives(billEmitter.getFives());

        billBundle.setTens(billEmitter.getTens());

        billBundle.setTwenties(billEmitter.getTwenties());

        billBundle.setFifties(billEmitter.getFifties());


        processBills(billBundle);

    }


    void processBills(BillBundle billBundle);

}


// add Visitor implementations as needed


public class DepositCashVisitor implements Visitor {


    public void processBills(BillBundle billBundle) {

        // deposit the cash

        ...

    }

}

用法


public class Atm {

    // add methods which returns information used to emit bills

}


public class Test {


    public static void main(String[] args) {


        Visitor depositCashVisitor = new DepositCashVisitor();


        Atm atm = new Atm();

        BillEmitter billEmitter = new SomeBillEmitter(atm);

        billEmitter.accept(depositCashVisitor);


        // add more bill emitters and visit them with depositCashVisitor

        // or add more visitors and visit billEmitter with them

    }

}


查看完整回答
反对 回复 2022-09-14
?
狐的传说

TA贡献1804条经验 获得超3个赞

你的想法在我看来很好。你说你必须反复编写这样的代码:BillBundle

Billbundle billBundle = new BillBundle();
billBundle.setFives(fives);
billBundle.setTens(tens);
billBundle.setTwenties(twenties);
billBundle.setFifties(fifties);
depositCash(billBundle);

你真的或者你只是在想你可能会吗?

像这样的事情只有在计算账单时才应该真正进行,如果这种情况发生在不止几个地方,我会感到惊讶。BillBundle

实际上不会更改或确定每个账单数量的代码应该只是通过账单捆绑包。记录每种类型存入多少张账单的方法?通过它,你从计数得到。将总金额相加的方法?通过它,你从计数得到。等等等等。BillBundleBillBundle

这比到处传递4个参数要好得多,原因有两个:

  1. 搞砸事情的机会要少得多 - 每个采用4个账单参数并将其传递到其他地方的函数都有机会以错误的顺序或错误的参数位置传递它们。这尤其成问题,因为实际的计数都是相同的类型(即 ),并且许多参数将该类型用于完全不同的事情。int

  2. 实际上,更少的代码取决于您支持的账单类型。假设你的国家换成5美元的硬币,或者你只是不想再把它们放在机器里了......需要更改多少代码才能摆脱五?您需要更改计算账单的代码以及实际关心每个账单金额的所有其他内容,但是您不必更改任何只是传递这些计数的代码。他们可以传递原始文件,而不必担心它。BillBundle

我建议的一个改变是让你的比尔邦德尔不可变。然后,您不必担心任何人在您传递它时更改它。

像这样:

class BillBundle

{

    public final int fives;

    public final int tens;

    public final int twenties;

    public final int fifties;


    public BillBundle(int fives, int tens, int twenties, int fifties)

    {

       this.fives = fives;

       this.tens = tens;

       this.twenties = twenties;

       this.fifties = fifties;

    }

}

我会警告你,大多数Java程序员更喜欢getter方法而不是公共的最终字段,但是没有充分的理由。


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号