1

基于 minIndex,我正在设置不同的视图可见性。我认为它可以被重构为简单的方式。

switch (minIndex) {
    case 0:
        viewOne.setVisibility(View.VISIBLE);
        break;
    case 1:
        viewTwo.setVisibility(View.VISIBLE);
        break;
    case 2:
        viewThree.setVisibility(View.VISIBLE);
        break;
    case 3:
        viewFour.setVisibility(View.VISIBLE);
        break;
    case 4:
        viewFive.setVisibility(View.VISIBLE);
        break;
    case 5:
        viewSix.setVisibility(View.VISIBLE);
        break;
}

如何将此代码重构为更具可读性的代码?

4

2 回答 2

5

如果数字与实际视图很好地匹配,则可以使用数组。

View[] views = new View[] {viewOne, viewTwo, viewThree, ...};
...
views[minIndex].setVisibility(View.VISIBLE);
于 2013-10-26T05:15:45.840 回答
1

我假设你已经匿名了这个网站的代码。我打算建议@Sotirios Delimanolis 回答什么,但我认为你实际上做的太多和太少。

您将控制器绑定到视图太多,并且您将视图彼此绑定太多。为什么它们都应该在同一个switch语句中?

如果添加另一个视图,您需要更改多少?

相反,您应该让每个视图都PropertyChangeListener向持有 的对象注册 a minindex。顺便说一句,这是一个坏名字。当对象更改minindex时,它应该向PropertyChangeEvent所有侦听器发送一个。每个视图的侦听器都应检查事件是否希望该视图可见;如果是这样,视图应该自己唤醒。

class ViewController {
    private PropertyChangeSupport pcs = new PropertyChangeSupport();

    // delegate methods to add and remove listeners to pcs variable.

    private int viewIndex; // Changed for documentation.  Use String instead?

    public void setViewIndex(final int viewIndex) {
        int oldIndex = this.viewIndex;
        this.viewIndex = viewIndex; 
        pcs.firePropertyChange("viewIndex", oldIndex, this.viewIndex);
    }
}

class ViewOne {
    private ViewController vc;
    private final Integer myIndex = 1;

    // Constructor

    public void init() {
        // Never add this or an inner class to another object in a constructor.
        vc.addPropertyChangeListener("viewIndex",
            new PropertyChangeListener() {
                public propertyChange(final PropertyChangeEvent evt) {
                    if (myIndex.equals(evt.getNewValue()) {
                         setVisibility(View.VISIBLE);
                    }
                }
            });
    }
}

关于构造函数的警告是,如果您在构造函数中将this内部类或内部类暴露给另一个对象,则该外部对象可能会在完全构造之前this与之交互。this您可以在构造函数中构建 PCL;使用另一种方法将其添加到控制器。

于 2013-10-26T05:48:45.880 回答