Рефакторинг именованных бинов, чтобы избежать дублирования кода - PullRequest
0 голосов
/ 10 мая 2019

Я обнаружил, что систематически повторяю код в своих именованных компонентах, поэтому я ищу способ реорганизации кода.

Например, у меня есть три именованных bean-компонента, которые повторяют этот код о Collars:

@Named(value = "dogController")
@ViewScoped
public class DogController implements Serializable {

    private Dog dog;  // Class Dog has a List<Collar>
    private Collar collar = new Collar();  // to be used in an XHTML form
    ....
    public addCollar(){
        //adds collar in dog
    }
    public removeCollar(){
        //removes collar from dog
    }
  }

Таким образом, бобы CatController и BirdController также имеют одинаковый код. То же самое происходит с Photo, все они повторяют код. Так что я думаю, что я здесь за шаблоном.

Мой ближайший шаг - создать interface HasCollar для Dog, Cat и Bird. Затем я перемещаю повторный код в новый компонент:

@Named(value = "collarController")
@ViewScoped
public class CollarController implements Serializable {

    private HasCollar animal;
    private Collar collar = new Collar();  // to be used from the XHTML
    ....
    public addCollar(){
        //adds collar in animal
    }
    public removeCollar(){
        //removes collar from animal
    }
  }

Пока все хорошо. Моя проблема сейчас:

  • Как мне инициализировать animal? Тем более, что один и тот же XHTML может использовать как Dog, так и Cat. Раньше все было хорошо, потому что для каждого типа было Collar объекта. Если мне нужно ввести его, я понятия не имею, как. (Проблема кажется похожей на this , но она немного отличается).
  • Обычно я бы расширил именованные бины с CollarController и использовал бы всю функциональность повторно, но это невозможно, поскольку именованные бины уже наследуются от другого класса.

Итак, как я могу реорганизовать эту ситуацию, чтобы получить как можно меньше повторяющегося кода?

(Пожалуйста, дайте мне знать, если потребуется дополнительная информация)

1 Ответ

1 голос
/ 10 мая 2019

Рассмотрим отношения между Dog и Collar: a Dog has-a Collar.

Другими словами, addCollar() и removeCollar() являются действиями Dogпоэтому эти методы принадлежат Dog:

 public class Dog {
    public addCollar(){
        //adds collar
    }
    public removeCollar(){
        //removes collar
    }
}

То же самое для Cat, Bird и т. д. Код все еще дублируется на этом этапе.

Тогда контроллер может просто делегировать:

@Named(value = "dogController")
@ViewScoped
public class DogController implements Serializable {
    private Dog dog;  // Class Dog has a List<Collar>
    private Collar collar = new Collar();  // to be used in an XHTML form

    public addCollar(){
        //adds collar in dog
        dog.addCollar();
    }
    public removeCollar(){
        //removes collar from dog
        dog.removeCollar();
    }
}

То же самое для контроллеров Cat, Bird и т. Д.

Теперь общий код можно поместить в одинкласс, такой как:

public class CollarHandler {
    private List<Collar> collars;
    public addCollar(){
        //adds collar
    }
    public removeCollar(){
        // remove a collar;
    }
}

И конструктор Dog принимает CollarHandler, а его методы делегируются обработчику:

public class Dog {
    private CollarHandler collarHandler;
    public Dog(CollarHandler collarHandler) {this.collarHandler = collarHandler; }

    public addCollar(){
        collarHandler.addCollar();
    }
    public removeCollar(){
        collarHandler.removeCollar();
    }
}

То же самое для Cat,Bird и т. Д.

Нет ни общего интерфейса, ни наследования.Каждый контроллер все еще независим, но его поведение может быть общим.

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