2016-12-18 4 views
0

JPanelクラスのJPanelの色を設定するMVC構造体があります。私は2つの選択肢のどれが最良の解決策であるのだろうかと思います。ゲッターとセッターの代替品

  1. 代替2.

代替とセッターを有するパネル・クラスの色を設定するパネルクラス

  • にゲッターと方法を転送することにより、コントローラ・クラスの色を設定します私にとってより良い解決策として2つの音が、それは大きな違いがあるかどうかを知っているので、両方が動作しているので、その場合は、なぜですか?

    ありがとうございます!


    代替案1:

    実行スレッド内

    コントローラクラス:

    theView.getPanelClass().getPanel().setBackground(new Color(255)); 
    

    Viewクラス

    private final PanelClass panel = new PanelClass(); 
    
    public PanelClass getPanelClass() { 
        return panel; 
    } 
    

    (theViewに宣言された)パネルクラス

    JPanel thePanel = new JPanel(); 
    
    public JPanel getPanel() { 
        return thePanel; 
    } 
    

    代替2:

    コントローラクラス スレッドを実行している場合:

    theView.setPanel(new Color(255)); 
    

    Viewクラス

    private final PanelClass panel = new PanelClass(); 
    
    public void setPanel(Color col) { 
        panel.setThePanel(col); 
    } 
    

    (theViewで宣言された)Panelクラス

    JPanel thePanel = new JPanel(); 
    
    public void setThePanel(Color c) { 
        thePanel.setBackground(c); 
    } 
    

    UPDATE 次のように私は今、ビュークラスはので、私のコードをしている編集しましたJPanelクラスを通して色を設定します。

    ALTERNATIVE 3:スレッドを実行するには

    Controllerクラス

    if(x>y) {  
        theView.setPanel(1); 
    } else { 
        theView.setPanel(2); 
    } 
    

    Viewクラス

    private final PanelClass panel = new PanelClass(); 
    
    public void setPanel(int n) { 
        panel.setThePanel(n); 
    } 
    

    Panelクラス(DECLAR TheView in ed)

    public void setThePanel(int n) { 
        switch (n) { 
         case 1: 
          panelS1.setBackground(new Color(255)); 
          break; 
         case 2: 
          panelS1.setBackground(new Color(0)); 
          break; 
        } 
    } 
    
  • 答えて

    1

    契約上の決定です。これが開発者の視点の内部を知る責任があることと、背景色を設定する前に彼がgetPanelClass()getPanel()を知っていることが受け入れられることに同意する場合、この解決策(1)は実行可能です。

    プログラマが実装の詳細を知っていると思うのが嫌な人は、(2)をお勧めします。

    これはおそらく理由がありますが、コントローラから色を設定する理由は何ですか?とにかく、それ自体がビューによって純粋に決定されるべきではありませんか?コントローラからのビューを分離する目的は、この種の決定に干渉しないことです。 x年のビューを別のコンポーネントで更新することにした場合、背景色の設定も確実になるでしょうか?そのような場合は、現在のビューが例えば "ViewWithBackgroundColorSetter"インターフェースを実装していることを確認してください。

    私は少し拡大していますが、あなたの問題はあなたが思っているよりも深いと分かります。

    +0

    はい、しかし、あなたは実際にそれをやっているべきであるの責任を考えるか?ビューはx/yの比較を観察し、それに基づいてそれ自体を更新する必要があります。コントローラが行うべきことは、ビューの更新自体ではなく情報を提供することです。 – Sebas

    +0

    ありがとうございます。コントローラーから色を設定する理由は、ifステートメントに応じて色が異なるからです。 setBackground(new Color(0、0、0)); setBackground(new Color(0、0、0));もしそうであれば、 ); } – acroscene

    +0

    私のコメントはまだ立っていると思います。しかし、それはより広い建築上の問題があるように見えるので、この質問を超えて拡大するかもしれません。コードレビューを検討することをお勧めします。 – Sebas

    1

    最初の選択肢は、いわゆるハリウッド原則に違反しているようです。私はむしろ第二の選択肢を選ぶだろう

    +0

    一般に、ある場所から別の場所に呼び出された1つの方法を転送することは一般的には良い考えではありませんか? theVIew.method2()。method3();などのように。 – acroscene

    +0

    それは避けられるべきですが、すべての原則として、それはまた塩の穀物で取られるべきです。それは、原則を守るために強制するのではないということです。 – Pavisa

    関連する問題