我们有一个大型的Haskell控制台应用程序,我被委托使其跨平台并添加GUI界面。要求如下:
我的解决方案是本地GUI。在Windows上使用Winforms,在Mac OS X上使用Cocoa,在Linux上使用GTK / Glade,仅处理演示文稿。然后,我会编写一个层,将其转换为对UI的消息进行响应的Haskell代码,并使用ZeroMQ来处理消息,也许使用protobuf来序列化来回传输的数据。因此,本地应用程序将启动,它自己启动所有魔法的守护程序,并发送消息来回传递。
除了确保守护程序仅接受来自启动它的应用程序的连接以及提供适当的数据来回传递高级GUI元素(例如表视图和单元格)之外,我没有看到太多的缺点。
那么我没有考虑到什么使它变成个不好的主意呢?
我应该提到,乍一看我会在所有平台上使用GTK。问题是,尽管它很接近,并且Haskell对GTK和Glade的支持很好,但结果看起来并不“正确”。 它接近,但在微妙的方式中却不足以满足正在为此工作付款的人的要求,因此这种解决方案是不可接受的。
此外,多个平台及其多个GUI语言的问题不是问题,因此我不需要寻找解决该问题的其他方法,除非它简化了与Haskell代码之间的交互。
- 尽可能本地化外观和感觉。
- 客户端需要支持Windows和Mac OS X,如果可能还有Linux。
- 不需要单独安装运行时。
- 不需要网络通信。 Haskell代码处理非常敏感的信息,不能通过网络传输。 这实际上是这不是Web应用程序的唯一原因。
我的解决方案是本地GUI。在Windows上使用Winforms,在Mac OS X上使用Cocoa,在Linux上使用GTK / Glade,仅处理演示文稿。然后,我会编写一个层,将其转换为对UI的消息进行响应的Haskell代码,并使用ZeroMQ来处理消息,也许使用protobuf来序列化来回传输的数据。因此,本地应用程序将启动,它自己启动所有魔法的守护程序,并发送消息来回传递。
除了确保守护程序仅接受来自启动它的应用程序的连接以及提供适当的数据来回传递高级GUI元素(例如表视图和单元格)之外,我没有看到太多的缺点。
那么我没有考虑到什么使它变成个不好的主意呢?
我应该提到,乍一看我会在所有平台上使用GTK。问题是,尽管它很接近,并且Haskell对GTK和Glade的支持很好,但结果看起来并不“正确”。 它接近,但在微妙的方式中却不足以满足正在为此工作付款的人的要求,因此这种解决方案是不可接受的。
此外,多个平台及其多个GUI语言的问题不是问题,因此我不需要寻找解决该问题的其他方法,除非它简化了与Haskell代码之间的交互。