OOD:代码重构和最佳设计(受保护或getter / setter)

时间:2011-03-18 21:19:50

标签: java oop inheritance refactoring

读取项目的代码,我注意到了这种情况,有两个类如下例所示:


class A {
    private class E aE;
    private class F aF;

    public A(){
        aE = new E();
        aF = new F();
    }

    public void foo1(){
        aE.bar();
        ...
        aF.poo();
    }
}

class B implements Runnable {
    private class E aE;
    private class F aF;

    public B(){
        aE = new E();
        aF = new F();
    }

    public void run(){
        ...
        x = aE.bar()
        ...
    }

}

我会重构这段代码以获得超类A,但是顺便说一句,最好在A类中使字段aE和aF受保护并在类B中使用它们或在A类中添加两个方法作为getE()和getF()并在B类中使用此方法?

3 个答案:

答案 0 :(得分:2)

B不会扩展A,它似乎是一个简单的复制粘贴作业,其中包含实现Runnable所需的方法。你显然应该避免这种情况,并制作另一个专门用于运行应用程序的类,之后你可能不需要类B

答案 1 :(得分:0)

Mark,从这个例子中很难指出你应该如何重构这段代码。以下是一些可能性 -

  1. 是否拥有A和B的公共父类取决于实际类之间是否存在逻辑父子关系。

  2. 如果存在关系,您也可以从A扩展B类。在这种情况下,您必须将aE和aF公开为公共属性。

  3. 另一种可能性是您可以在A上实现Runnable,从而消除B类。

  4. 如果同时将E类和F类作为私有字段放在一起很常见,那么您可以考虑将它们封装在一个类型中,比如EF,然后用该类组成其他类。

    < / LI>

    但是,只有在知道了实际的课程后才能给出正确的答案。

答案 2 :(得分:0)

关于名为“A”和“B”的类的任何声明可能没有足够的上下文可能是错误的或正确的。

但我想,假设一个B扩展A是合理的情况,几乎总是喜欢使用受保护或包级数据成员访问。如果你有一个正式且严重到足以使用Get / Set访问器的接口,那么你可能在实现继承是一个很好的设计选择的上下文之外。