OOD: рефакторинг кода и лучший дизайн (защищенный или получатель / установщик) - PullRequest
0 голосов
/ 19 марта 2011

Читая код для проекта, я заметил эту ситуацию, есть два класса в следующем примере:


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, но при этом лучше сделать поля aE и aF защищенными в классе A и использовать их в классе B или добавить два метода в классе A как getE () и getF () и использовать этот метод в классе B?

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

класс B не расширяет A, это простое задание копирования-вставки с методами, необходимыми для реализации Runnable. Вам явно следует избегать этого и создать другой класс, единственной целью которого является запуск приложения, вам, вероятно, не понадобится класс B после этого.

0 голосов
/ 19 марта 2011

Любое утверждение о классах с именами 'A' и 'B', вероятно, не имеет достаточного контекста, чтобы быть либо неправильным, либо правильным.

Но я предпочел бы, если бы было разумно иметь расширение B, расширяющее A, почти всегда предпочитаю использовать защищенный доступ или доступ к элементу данных уровня пакета. Если у вас есть интерфейс, который является формальным и достаточно серьезным, чтобы использовать методы доступа Get / Set, вы, вероятно, находитесь вне контекста, в котором наследование реализации является хорошим выбором при проектировании.

0 голосов
/ 19 марта 2011

Mark, Из этого примера сложно указать, как следует рефакторинг этого кода. Вот несколько возможностей -

  1. Наличие общего родительского класса для A и B зависит от наличия логических родительско-дочерних отношений между фактическими классами.

  2. Вы также можете расширить класс B с A, если есть связь. В этом случае вам придется выставить aE и aF как открытые свойства.

  3. Другая возможность состоит в том, что вы можете реализовать Runnable на самом A, исключив класс B.

  4. Если очень часто оба класса E и F являются частными полями, вы можете рассмотреть возможность их инкапсуляции в один тип, например, EF, а затем составить другие классы с этим классом.

Тем не менее, правильный ответ может быть дан только после того, как вы узнаете, что такое классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...