Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller Clojure模型视图控制器(MVC)设计_Model View Controller_Design Patterns_Clojure_Functional Programming_Observer Pattern - Fatal编程技术网

Model view controller Clojure模型视图控制器(MVC)设计

Model view controller Clojure模型视图控制器(MVC)设计,model-view-controller,design-patterns,clojure,functional-programming,observer-pattern,Model View Controller,Design Patterns,Clojure,Functional Programming,Observer Pattern,我正在使用JavaSwing在Clojure中编写一个桌面GUI应用程序。通常,在使用Java时,我也会使用Observer模式,根据MVC设计模式设计应用程序。通过这种方式,视图与模型解耦,其中的更改不会相互影响,从而使更改更容易进行 我想知道Clojure是否有比普通MVC和Observer设计模式更好的方法来解决这个问题?我是函数式编程新手,所以我不确定如何将模型与视图分离。我需要这样做,因为应用程序将以迭代方式开发,并且可能会有更具挑战性的需求 非常感谢您的帮助 谢谢 Adam当您使用一

我正在使用JavaSwing在Clojure中编写一个桌面GUI应用程序。通常,在使用Java时,我也会使用Observer模式,根据MVC设计模式设计应用程序。通过这种方式,视图与模型解耦,其中的更改不会相互影响,从而使更改更容易进行

我想知道Clojure是否有比普通MVC和Observer设计模式更好的方法来解决这个问题?我是函数式编程新手,所以我不确定如何将模型与视图分离。我需要这样做,因为应用程序将以迭代方式开发,并且可能会有更具挑战性的需求

非常感谢您的帮助

谢谢


Adam

当您使用一阶函数、宏(代码作为数据)和并发持久数据结构时,java MVC世界中的许多设计模式都会变得有点愚蠢。例如,“观察者模式”基本上只是一个设置了一些手表的代理。它从一个模式变成了一个函数调用

如果将状态(模型)存储在ref或代理中,并将视图设置为显示该状态的函数(在该词的函数编程意义上);当使控制器成为一个函数(同样是FP意义上的)时,在给定旧状态和一些新输入的情况下产生一个新状态,那么MVC模型就非常适合了


它有点过时了,但斯图尔特·塞拉确实帮助我开始了这方面的工作。

在Clojure中,你当然可以使用MVC,但我建议在Clojure引用中使用手表来实现它

代码类似于:

; define the model as an immutable structure stored in a ref
(def model (ref (create-my-model)))

; function to update the UI when the model changes
(def update-function [old-model new-model]
  (do-whatevever-updates old-model new-model))

; add a watch to the model to call update-function when a change happens
(add-watch model :on-update
  (fn [key reference old-state new-state]
    (if (not= old-state new-state)
      (update-function old-state new-state))))
此外,如果您正在Clojure中构建GUI,那么很有必要查看一些现有的Swing库包装,例如:

  • -具有用于定义UI元素的良好DSL
  • -可能是Swing最成熟的包装器

如果你经常和Clojure一起挥杆,你可能会发现这很有用。我是第二个跷跷板。非常实用和一致的界面。考虑将跷跷板()添加到所列出的库中。