如何避免将一个变量从一种方法传递给另一种方法

时间:2019-02-25 16:07:27

标签: java refactoring

我正在重构一些旧的Java代码,我想知道是否有更好的方法来重构以下代码

private void createControlPanel() {
  int row = 0;
  row = initSessionControls(controlPanelGB, row);
  row = initBidControls(controlPanelGB, row);
  row = initSnapshotControls(controlPanelGB, row);
}

行在每种方法中都会递增。在我看来,这很丑。我也不想执行以下操作

private void createControlPanel() {
  row = initSessionControls(controlPanelGB, 1);
  row = initBidControls(controlPanelGB, 2);
  row = initSnapshotControls(controlPanelGB, 3);
}

关于如何最好地重构它的任何建议?我正在使用Java 8。

3 个答案:

答案 0 :(得分:1)

我建议使用ControlPanelFiller类:

class ControlPanelFiller {
    private final ... controlPanel;
    private int row = 0;
    public ControlPanelFiller(... controlPanel) {
        this.controlPanel = controlPanel;
    }
    public ControlPanelFiller initSessionControls() {
        ...
        ++row;
        return this;
    }
    public ControlPanelFiller initBidControls() {
        ...
        ++row;
        return this;
    }
    public ControlPanelFiller initSnapshotControls() {
        ...
        ++row;
        return this;
    }
}

private void createControlPanel()
{
    ControlPanelFiller cpf = new ControlPannelFiller(controlPanelGB);
    cpf.initSessionControls()
        .initBidControls()
        .initSnapshotControls();
}

答案 1 :(得分:1)

您可以尝试以下代码

private void createControlPanel() {
int row =0;
  row += initSessionControls(controlPanelGB);
  row += initBidControls(controlPanelGB);
  row += initSnapshotControls(controlPanelGB);
}

答案 2 :(得分:0)

您对这个代码感到不舒服是正确的。似乎每个被调用的方法都知道要处理的下一行是什么,因此它们紧密耦合,并且用于确定下一行的逻辑分布在多个方法中。嗯如果下一行确实比前一行大1,则最好在createControlPanel方法中集中此逻辑:

private void createControlPanel() {
  int initialRow = 0;
  initSessionControls(controlPanelGB, initialRow);
  initBidControls(controlPanelGB, initialRow+1);
  initSnapshotControls(controlPanelGB, initialRow+2);
}

这比上面的第二个解决方案更清楚,因为很明显第二个参数是一行,以及它与初始行值的关系。