0

コンストラクタで2つのArrayListの依存関係を削除するために、このクラスをDIP(Dependency Inversion Principle)に従うように変更する方法はありますか?インターフェイスはどのようにすべきですか?DIP(Dependency Injection Principle)に従うためにこのクラスをどのように変更する必要がありますか?

私を混乱させる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); 
    } 
    ... 
} 
+0

do what?疑問は、むしろぼんやりとしており、おそらくタイプミスや理解の欠如によっておそらく不明確です。あなたはあなたが知りたいことを言い換えて、苦労しているところでより多くを得ることができますか? – Pete

+0

完了しました。私の文法上の誤りを許してください。英語は私の最初の言語です。 – Jeflopo

+0

このガイドhttp://misko.hevery.com/code-reviewers-guide/にはDI –

答えて

1

依存反転-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; 
    } 
    

Btw、私はリストにArrayListsを変更しました。 Listの実装に依存関係を導入する必要はありません。

+0

本当にありがとうございました。 artbristolへの返信もあなたの返信を考慮してください。どちらも非常に便利でした! – Jeflopo

1

それは本当にあなたが削除しようとしているものの依存関係は明らかではないのですが、あなたは明示的なArrayListのインスタンスを削除したい場合、あなたはコンストラクタ・インジェクションを使用することができます...そのような状況に対処する方法がわかりません:

+0

私はArraylistsインスタンスを挿入するためのインタフェースを作成しなければならないと思っていました...しかし、それはポイントではありません。インタフェースは、addModel、addView、removeModel、viewModelのメソッドの実装を隔離する(またはカップルを失う)のに役立ちます...しかし、私はちょうど配列を外部化したい場合は必要ありません。ビューメソッドは、このAbstractControllerクラスの実装の一部です。そのとおり ? – Jeflopo

0

私はリストをオブジェクトに挿入しないで、リストをモックして単体テストするためにカプセル化を中断します。リストは外部依存関係ではありません。それはクラスの内部の一部です。

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

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

+0

あなたはそこにない問題を解決しようとしていたことを指摘していますか? :D私は問題を作りました...私はあなたが指しているものも好きです。しかし、私はまた、そのようなことをすることができるようにしていました...それが正しいかどうかは、この場合ではないかもしれません...しかし、他のコードでうまく収まるかもしれません。 – Jeflopo

関連する問題