У нас в Haskell есть большое консольное приложение, которое мне поручено сделать кроссплатформенным и добавить графический интерфейс.
Требования:
- Собственный внешний вид, как это возможнои чувствовать.
- Клиенты для Windows и Mac OS X, Linux, если это возможно.
- Нет отдельной среды выполнения для установки.
- Нет необходимости сетевого взаимодействия.Код haskell имеет дело с очень чувствительной информацией, которая не может быть передана по проводам.Это действительно единственная причина, по которой это не веб-приложение.
Теперь настоящая причина этого вопроса состоит в том, чтобы объяснить одно решение, которое я сейчас изучаю, и обратиться по причинам, по которым яЯ не думаю, что это плохая идея.
Мое решение - родной графический интерфейс.Winforms в Windows, Cocoa в Mac OS X и GTK / Glade в Linux, которые просто обрабатывают презентацию.Затем я напишу слой поверх кода на Haskell, который превращает его в ответчик для сообщений в и из пользовательского интерфейса, используя ZeroMQ для обработки сообщений и, возможно, protobufs для сериализации данных назад и вперед.Таким образом, собственное приложение запустится, которое само запустит демон, где происходит вся магия, и отправит сообщения туда и обратно.
Помимо проверки того, что демон принимает соединения только от приложения, которое его запустило, изадача обеспечения нужных данных взад и вперед для продвинутых элементов графического интерфейса (я имею в виду представления таблиц, ячеек и т. д.), я не вижу много минусов в этом.
О чем я не думаючто делает это плохой идеей?
Я, наверное, должен упомянуть, что на первый взгляд я собирался использовать GTK на всех платформах.Проблема в том, что, хотя она близка, и с поддержкой Haskell GTK и Glade приятно работать, результат не выглядит «правильным».Это близко, но просто не достаточно нативно, что делает это решение неприемлемым для людей, которые пишут чек на эту работу.
Кроме того, проблема нескольких платформ и, следовательно, нескольких языков для графического интерфейса.это не проблема, поэтому я не обязательно ищу другие способы решения этой проблемы, если только это не упрощает взаимодействие с кодом haskell.