0

モデルにCompressorコンポーネントがあります。

public class Compressor extends MComponent {    

    public static final double THRESHOLD_MAX = 1; 
    public static final double THRESHOLD_MIN = 0;
    public static final double THRESHOLD_DEFAULT = 1; 
    private double threshold; 

    /* <snip> - many other parameters*/

    public void setThreshold(double v)      { this.threshold = v; }
}

そして、この特定のアプリケーション用に、Java Swing で構築している GUI があります。この GUI には、Compressors パラメーターを表示および制御するためのスライダーやボタンなどが追加されています。

これらのスライダーの一部は線形スケールで動作する必要がありますが、他のスライダーは対数/指数スケールで動作する必要があります (スライダーの移動により、下端で値がわずかに変化し、上端で値が大きく変化します)。終わり)。

スライダーとその移動イベントを簡単に作成する GuiConstructor クラスがあるので、最小値、最大値、指数/線形型、および aq 値 (指数型の場合) を指定して適切に動作します。

    gc.addSliderPanel(
            panel,
            "Threshold",
            Compressor.THRESHOLD_MIN,
            Compressor.THRESHOLD_MAX,
            c.getThreshold(),
            GuiConstructor.Scale.LINEAR, /*<-- this line*/
            0,
            new SetThreshold(c),
            DEFAULT_SLIDER_GRAINS,
            GuiConstructor.SliderValueType.FLOAT); 

問題は、ビューで表示タイプを宣言する必要があるか、それともモデルで表示タイプを指定してもよいかということです。

例えば。

public class Compressor extends MComponent {    

    public static final double THRESHOLD_MAX = 1; 
    public static final double THRESHOLD_MIN = 0;
    public static final double THRESHOLD_DEFAULT = 1;
    public static final GuiConstructor.Scale THRESHOLD_SCALETYPE = GuiConstructor.Scale.LINEAR;  
    private double threshold;           

モデルで指定するというアイデアが気に入っています。表示パラメータについて考える必要があるのは、コンポーネントを組み立てるときではなく、各コンポーネントを作成するときだけだからです。

4

1 に答える 1

2

モデルには、モデルがどのように機能するかを説明する属性を含めることができます。これは、モデルが線形圧縮と指数圧縮であるということです。ただし、あなたが提案するような特定のビュー オブジェクトへの直接参照を持つべきではありません。代わりに、本質的に説明的な属性を作成し、「GuiConstructor」に属性の値に基づいて適切なビューを選択させます。

例えば:

// Not apart of the View, but in the model package:    
public enum ScaleType {
    LINEAR,
    EXPONENTIAL;
}

public class Compressor extends MComponent {    

    private ScaleType scaleType = ScaleType.LINEAR;
    public ScaleType getScaleType() { return this.scaleType; }

}

    //  In your construction method:
    gc.addSliderPanel(
            panel,
            "Threshold",
            Compressor.THRESHOLD_MIN,
            Compressor.THRESHOLD_MAX,
            c.getThreshold(),
            c.getScaleType(), /*<-- this line*/
            0,
            new SetThreshold(c),
            DEFAULT_SLIDER_GRAINS,
            GuiConstructor.SliderValueType.FLOAT);

最優先の原則は、モデルがビューを認識してはならないということです。モデルを変更する必要なく、ビュー オブジェクトを変更できる必要があります。別の言い方をすれば、まったく異なる一連の UI クラスが構築されているとします。モデル クラスのコーディングを変更する必要はありません。

コードに関するいくつかのわかりやすい観察事項を次に示します。

  1. 上記で、「GuiConstructor.Scale」は列挙型であると想定しました。そうでない場合は、静的ファイナルの代わりに使用することを検討してください。
  2. 「GuiConstructor」の名前を「GuiFactory」または「GuiBuilder」に変更することをお勧めします。「コンストラクター」は、それを使用しているコンテキストで使用するには、オブジェクト指向の意味があまりにも具体的です。
  3. コンプレッサを記述するためにオブジェクトの属性を使用する代わりに、Class 属性 (最終的な静的属性) を過剰に使用している可能性があります。しきい値とスケールをオブジェクトの属性にしないのはなぜですか? それ以外の場合、子 LinearCompressor または ExponentialCompressor クラスを作成するには、(オーバーライドを使用するのではなく) 独自の参照が必要になります。
  4. 「新しい SetThreshold(c)」が何を意味するのかわかりません。クラスのセッターメソッドを連想させる名前でクラスに名前を付けたようです。そのオブジェクトの名前を変更することを検討してください。

お役に立てれば、

ジョン...

于 2012-11-05T04:25:34.720 に答える