0

コンストラクターで 2 つの ArrayList 依存関係を削除するために、このクラスを DIP (依存関係反転原則) に従うように変更するにはどうすればよいですか? インターフェイスはどうあるべきですか?

私を混乱させることの 1 つは、新しい参照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);
    }
    ...
}
4

3 に答える 3

1

依存性逆転の方法でそれを行うには、次のいずれかを行うことができます。

  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実装に依存関係を導入する必要はありません。

于 2012-01-06T10:54:27.147 に答える
1

削除しようとしている依存関係は明確ではありませんが、明示的な 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;
}
于 2012-01-06T10:41:23.790 に答える
0

リストをモックして単体テストを行うためだけに、オブジェクトにリストを挿入してカプセル化を破ることはしません。List は外部依存関係ではありません。クラスの内部の一部です。

このクラスを単体テストする場合は、リストに格納されているオブジェクトを使用するメソッドが実際にそれらを使用する必要があるかどうかをテストします。コントローラーに追加したモデルのプロパティを変更するときに、propertyChange メソッドが呼び出されることもテストする必要があります。

または、getView()およびgetModels()メソッド (潜在的に保護されている) を追加して、追加が期待どおりに機能することをテストすることもできます。

于 2012-01-06T10:45:19.403 に答える