【问题标题】:Scala model-view-presenter, traitsScala模型-视图-演示者,特征
【发布时间】:2010-05-26 16:48:08
【问题描述】:

我是 Martin Fowler(已弃用)模型-视图-演示者模式的粉丝。我正在编写一个包含几个按钮类的 Scala 视图类。我想包括设置按钮动作属性的方法,由演示者调用。典型的代码片段如下所示:

private val aButton = new JButton
def setAButtonAction(action: Action): Unit = { aButton.setAction(action) }

每个按钮都会重复此代码。如果 Java/Scala 有 C 预处理器,我将创建一个宏来生成此代码,给定按钮名称(请不要讲授 C 预处理器的弊端)。这段代码显然非常冗长和重复。在 Scala 中有没有更好的方法来做到这一点,也许是使用特征?

请举行有关 scala.swing 的讲座。我在这里寻找一般模式。

【问题讨论】:

    标签: scala macros mvp


    【解决方案1】:

    与 java 相比,Scala 更少关于显式 setter 和 getter 方法。而是使用抽象字段来定义公开的接口。像这样的东西怎么样:

    trait ActionUser {
      def setAction(action:Action):Unit
    }
    
    trait Container {
      val aButton:ActionUser
    }
    
    trait ContainerImpl {
      val aButton = new JButton with ActionUser
    }
    

    针对Container 操作的类将只能访问setAction,而内部方法将其视为JButton。

    另一个注意事项:C 使用宏来减少代码重复。 Scala 使用特征的多重继承来完成同样的事情。

    【讨论】:

    • 不错的答案。我将进一步探索这一点。
    • @Ralph 你探索了吗?你能分享你在 Scala 中的 MVP 框架代码吗?我问这个问题值得赏金,请检查:stackoverflow.com/questions/17631080/mvp-in-scala-swing
    • @MyTitle:几年前我开始了一个探索这个项目的项目,但不得不继续进行另一个项目并且再也没有回去过。但是,如果我必须这样做,我会使用 sblundy 的答案中显示的模式。
    猜你喜欢
    • 2015-07-23
    • 2011-06-15
    • 1970-01-01
    • 2010-10-05
    • 2011-04-18
    • 2012-07-06
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多