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,它添加了滑块、按钮等来显示和控制 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”。“构造函数”具有过于具体的 OO 含义,无法在您使用它的上下文中使用。
  3. 您可能过度使用类属性(最终的静态属性)而不是使用对象的属性来描述压缩器。为什么不将阈值和比例作为对象的属性?否则,创建子 LinearCompressor 或 ExponentialCompressor 类将需要它们自己的引用(而不是使用覆盖)。
  4. 我不知道'new SetThreshold(c)'是什么意思。看起来您已经命名了一个类,其名称让人想起类上的 setter 方法。考虑重命名该对象。

希望这可以帮助,

约翰...

于 2012-11-05T04:25:34.720 回答