metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2008-11-25 04:11 pm

И еще

Писать GUI на хаскеле - это все равно, что писать GUI на SQL.

Если обернуть фразу - то для того, чтобы сделать нормальный GUI фреймворк для хаскеля (а не сплошную имитацию императивщины на монадах), нужно представить GUI в декларативно-функционально-теоретико-множественном стиле :)

[identity profile] jtootf.livejournal.com 2008-11-25 02:34 pm (UTC)(link)
Phooey (http://darcs.haskell.org/packages/phooey/doc/html/Graphics-UI-Phooey-Applicative.html), Fudgets (http://www.cs.chalmers.se/ComputingScience/Research/Functional/Fudgets/springschool95-intro.html)

вполне себе функционально. кстати, а где в описании GUI нужна императивщина?

[identity profile] sergiej.livejournal.com 2008-11-25 02:34 pm (UTC)(link)
Я видел веб гую генерируемую полностью из Pl/SQL. И ничего. Конечно сама она была HTML

[identity profile] aamonster.livejournal.com 2008-11-25 02:55 pm (UTC)(link)
Вот я пишу на императивщине, и все мне кажется, что изрядная часть гуя должна быть декларативной. Как минимум - лэйауты, enable/disable кнопок и т.п.

[identity profile] metaclass.livejournal.com 2008-11-25 02:59 pm (UTC)(link)
Я такое делал, после чего оказалось, что в таблицу состояний UI приходится подключать большие куски кода на императивном языке(через подгрузку классов по их имени) и это все становится неподдерживаемым и неотлаживаемым.

[identity profile] metaclass.livejournal.com 2008-11-25 03:05 pm (UTC)(link)
Видел я скриншоты GUI на этом. За такое с работы увольняют.
Но вообще идея насчет комбинирования GUI из элементов сама по себе правильная.

А императивщина нужна, когда GUI сильно динамический, т.е. юзер ткнул в один элемент - десять других поменяли свое состояние. Я делал декларативное описание такого на XML - этот продукт в процессе разработки потерял поддерживаемость года где-то за два, сейчас буду переделывать и переносить декларативные описания внутрь кода(структура примерно такая же, но в качестве описания будет структура .NET класса, управляющего GUI, а всякие проверки и прочее - чисто императивный код).

[identity profile] g-rub.livejournal.com 2008-11-25 03:11 pm (UTC)(link)
Если посмотреть в разрезе парадигмы MVC, то логика грамотно спроектированного View (отрисовывающего себя сообразно состоянию модели) -- целиком и полностью функциональна.

Что касается контроллеров -- вся логика валидации действий тоже как правило целиком функциональна. Единственная императивщина -- собственно дергание модели запросом на изменение состояния.

Все жесткие правила относительно последовательных цепочек действий -- разруливаем, реализовав на уровне модели объект "сессия" и сведя задачу к предыдущей.

Вот и выбросили из ГУИ 99% императивщины, которой там при правильном проектировании изначально не должно было быть.

[identity profile] jtootf.livejournal.com 2008-11-25 03:21 pm (UTC)(link)
это не императивщина, это уже event-driven. а как раз в event-driven функциональщина чувствует себя очень неплохо - можно смотреть FRP, работы Элиотта, YAMPA (AFRP)

ну а что GUI страшное, так речь не о том; это - интерфейс, снизу к нему хоть Qt пристегнуть можно, хоть GTK# (насчёт WinForms не уверен)

[identity profile] metaclass.livejournal.com 2008-11-25 03:37 pm (UTC)(link)
Да, так обычно и делается, только вот накладываемые ограничения приводят к тому что "мыши плакали, кололись, но продолжали жрать кактус".
Зависимости внутри GUI между элементами проще выражать в виде обычного императивного кода "выбрали строку в гриде->кнопки стали разрешены", а не в виде "Выбрали строку в гриде - событие ушло в адаптер грид-источник данных -> адаптер поменял модель -> пошло событие "модель изменена" на view -> view перерисовалось". При этом еще желательно что бы изменялись только кнопки, а не весь view целиком, т.е. нужно на каждое изменяемое свойство отдельное событие, и все это писать руками никакой радости нет.

[identity profile] metaclass.livejournal.com 2008-11-25 03:45 pm (UTC)(link)
Да, FRP, видимо, должно подойти. Промоделировать юзера как две сущности - одна генератор событий, а вторая - функция, преобразующая вывод программы в вводимые данные :)

[identity profile] g-rub.livejournal.com 2008-11-25 04:30 pm (UTC)(link)
Давненько уже гуйню не писал, но что-то мне кажется что явным образом включать-выключать кнопки меню из обработчика табличного поля -- прямая дорога в ад.

[identity profile] 1ceheart.livejournal.com 2008-11-25 06:38 pm (UTC)(link)
+1, но умение перерисовывать часть модели (и соответственно, знание того, какая часть была изменена) часто довольно важно, даже в вебморде, иначе никакого сервера не хватит. А если я 3D-чертеж на экране отображаю, то "перерисовать view" - это может вечность занять. Жизнь все-таки сложнее голых схем, но глобально, конечно, енаблить кнопку по нажатию другой кнопки не сильно кошерно :)

[identity profile] metaclass.livejournal.com 2008-11-25 07:45 pm (UTC)(link)
Я думал после того, как сделаю общую функциональность, оптимизировать это дело методом вычисления диффа между объектами, потом по этому диффу вычислить дифф для view объекта.
Но как всегда, сначала на это дело не хватило времени, а потом проект законсервировался, т.к. тендер выиграла другая контора :)

[identity profile] metaclass.livejournal.com 2008-11-25 07:55 pm (UTC)(link)
Да, так и есть.
Альтернатива дороге в ад - отладка вызовов функций 20-уровневой вложенности - от кнопки до модели и обратно до view :)

[identity profile] g-rub.livejournal.com 2008-11-25 10:31 pm (UTC)(link)
Ну как бы "сказать части view перерисовать себя" и "из напрямую из контроллера модифицировать отображение" -- две ооочень большие разницы.

:)

Потом другой контроллер модифицирует то же отображение по-своему, и дальше начнется, потом третий контроллер попробует эту кнопку "восстановить в исходную позицию" сообразно своей логике...

И готово.

[identity profile] g-rub.livejournal.com 2008-11-25 10:34 pm (UTC)(link)
Хранить логическое состояние хотя бы в соответствующих переменных-атрибутах формы не судьба?

И включать-выключать кнопки по итогам чтения этого состояния, а не по воле контроллера?

А обмен сигналами об изменении -- через простенький диспетчер, решающий кому надо перерисовываться по итогам изменения набора переменных?

Не вижу что-то тут 20 уровней вложенности.
Банальное отделение логики от представления.

[identity profile] g-rub.livejournal.com 2008-11-25 11:14 pm (UTC)(link)
В MVC не 20 уровней, а 3.
Соответственно, направлений взаимодействия -- никак не может быть больше 6 (а реально -- 3-5).

Зато один раз написанный и оттестированный MVC-каркас (вкупе с соответствующим проектированием остальной части) всерьез и надолго избавляет от побочных эффектов и непредсказуемого роста сложности в дальнейшем.