Как следует изменить этот класс, чтобы следовать DIP (принципу внедрения зависимостей)? - PullRequest
0 голосов
/ 06 января 2012

Как я могу изменить этот класс, чтобы он следовал DIP (принцип инверсии зависимости), чтобы удалить две зависимости ArrayList в конструкторе? Как должны быть интерфейсы?

Меня смущает то, что новые ссылки указывают на ArrayList<type>, а не только на конструктор класса. И я не знаю, как справиться с этой ситуацией ...

package mvc.controllers;

import java.util.ArrayList;
import mvc.models.AbstractModel;
import mvc.views.AbstractViewPanel;

public abstract class AbstractController {

    private ArrayList<AbstractViewPanel> registeredViews;
    private ArrayList<AbstractModel> registeredModels;

    public AbstractController() {
        registeredViews = new ArrayList<AbstractViewPanel>();
        registeredModels = new ArrayList<AbstractModel>();
    }

    public void addModel(AbstractModel model) {
        registeredModels.add(model);
        model.addPropertyChangeListener(this);
    }

    public void removeModel(AbstractModel model) {
        registeredModels.remove(model);
        model.removePropertyChangeListener(this);
    }

    public void addView(AbstractViewPanel view) {
        registeredViews.add(view);
    }

    public void removeView(AbstractViewPanel view) {
        registeredViews.remove(view);
    }
    ...
}

Ответы [ 3 ]

1 голос
/ 06 января 2012

Чтобы сделать это в Deverdency Inversion -way, вы можете выполнить одно из следующих действий:

  1. Зависимости от списков приведены в конструкторе:

    public abstract class AbstractController {
    
    private List<AbstractViewPanel> registeredViews;
    private List<AbstractModel> registeredModels;
    
    public AbstractController(List<AbstractViewPanel> registeredViews, List<AbstractModel> registeredModels) {
        this.registeredViews = registeredViews;
        this.registeredModels = registeredModels;
    }
    
  2. Добавить мутаторы (сеттеры) для списков:

    public abstract class AbstractController {
    
    private List<AbstractViewPanel> registeredViews;
    private List<AbstractModel> registeredModels;
    
    public AbstractController() {
    }
    
    public void setRegisteredViews(List<AbstractViewPanel> views) {
       this.registeredViews = views;
    }
    
    public void setRegisteredModels(List<AbstractModel> models) {
       this.registeredModels = models;
    }
    

Кстати, я изменил ArrayLists на Lists. Нет необходимости вводить зависимость от реализации List.

1 голос
/ 06 января 2012

Не совсем понятно, какую зависимость вы пытаетесь удалить, но если вы хотите удалить явное создание экземпляра ArrayList, вы можете использовать инъекцию конструктора:

private final List<AbstractViewPanel> registeredViews;
private final List<AbstractModel> registeredModels;

public AbstractController(final List<AbstractViewPanel> registeredViews,
        final List<AbstractModel> registeredModels) {
    this.registeredViews = registeredViews;
    this.registeredModels= registeredModels;
}
0 голосов
/ 06 января 2012

Я бы не вставлял List в объект и, таким образом, не нарушал инкапсуляцию, просто для того, чтобы проверить его модулем путем насмешки над списком.Список не является внешней зависимостью.Это часть внутренних элементов класса.

Если вы хотите выполнить модульное тестирование этого класса, проверьте, что метод, использующий объекты, хранящиеся в списке, действительно использует их так, как должен.Вам также следует проверить, что метод propertyChange вызывается при изменении свойства модели, добавленной в контроллер.

Или вы можете добавить методы getView() и getModels() (потенциально защищенные).), чтобы проверить, что дополнение работает как ожидалось.

...