![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Писать GUI на хаскеле - это все равно, что писать GUI на SQL.
Если обернуть фразу - то для того, чтобы сделать нормальный GUI фреймворк для хаскеля (а не сплошную имитацию императивщины на монадах), нужно представить GUI в декларативно-функционально-теоретико-множественном стиле :)
Если обернуть фразу - то для того, чтобы сделать нормальный GUI фреймворк для хаскеля (а не сплошную имитацию императивщины на монадах), нужно представить GUI в декларативно-функционально-теоретико-множественном стиле :)
no subject
Date: 2008-11-25 02:34 pm (UTC)вполне себе функционально. кстати, а где в описании GUI нужна императивщина?
no subject
Date: 2008-11-25 03:05 pm (UTC)Но вообще идея насчет комбинирования GUI из элементов сама по себе правильная.
А императивщина нужна, когда GUI сильно динамический, т.е. юзер ткнул в один элемент - десять других поменяли свое состояние. Я делал декларативное описание такого на XML - этот продукт в процессе разработки потерял поддерживаемость года где-то за два, сейчас буду переделывать и переносить декларативные описания внутрь кода(структура примерно такая же, но в качестве описания будет структура .NET класса, управляющего GUI, а всякие проверки и прочее - чисто императивный код).
no subject
Date: 2008-11-25 03:21 pm (UTC)ну а что GUI страшное, так речь не о том; это - интерфейс, снизу к нему хоть Qt пристегнуть можно, хоть GTK# (насчёт WinForms не уверен)
no subject
Date: 2008-11-25 03:45 pm (UTC)no subject
Date: 2008-11-25 02:34 pm (UTC)no subject
Date: 2008-11-25 02:55 pm (UTC)no subject
Date: 2008-11-25 02:59 pm (UTC)no subject
Date: 2008-11-25 03:11 pm (UTC)Что касается контроллеров -- вся логика валидации действий тоже как правило целиком функциональна. Единственная императивщина -- собственно дергание модели запросом на изменение состояния.
Все жесткие правила относительно последовательных цепочек действий -- разруливаем, реализовав на уровне модели объект "сессия" и сведя задачу к предыдущей.
Вот и выбросили из ГУИ 99% императивщины, которой там при правильном проектировании изначально не должно было быть.
no subject
Date: 2008-11-25 03:37 pm (UTC)Зависимости внутри GUI между элементами проще выражать в виде обычного императивного кода "выбрали строку в гриде->кнопки стали разрешены", а не в виде "Выбрали строку в гриде - событие ушло в адаптер грид-источник данных -> адаптер поменял модель -> пошло событие "модель изменена" на view -> view перерисовалось". При этом еще желательно что бы изменялись только кнопки, а не весь view целиком, т.е. нужно на каждое изменяемое свойство отдельное событие, и все это писать руками никакой радости нет.
no subject
Date: 2008-11-25 04:30 pm (UTC)no subject
Date: 2008-11-25 06:38 pm (UTC)no subject
Date: 2008-11-25 07:45 pm (UTC)Но как всегда, сначала на это дело не хватило времени, а потом проект законсервировался, т.к. тендер выиграла другая контора :)
no subject
Date: 2008-11-25 10:31 pm (UTC):)
Потом другой контроллер модифицирует то же отображение по-своему, и дальше начнется, потом третий контроллер попробует эту кнопку "восстановить в исходную позицию" сообразно своей логике...
И готово.
no subject
Date: 2008-11-25 07:55 pm (UTC)Альтернатива дороге в ад - отладка вызовов функций 20-уровневой вложенности - от кнопки до модели и обратно до view :)
no subject
Date: 2008-11-25 10:34 pm (UTC)И включать-выключать кнопки по итогам чтения этого состояния, а не по воле контроллера?
А обмен сигналами об изменении -- через простенький диспетчер, решающий кому надо перерисовываться по итогам изменения набора переменных?
Не вижу что-то тут 20 уровней вложенности.
Банальное отделение логики от представления.
no subject
Date: 2008-11-25 11:14 pm (UTC)Соответственно, направлений взаимодействия -- никак не может быть больше 6 (а реально -- 3-5).
Зато один раз написанный и оттестированный MVC-каркас (вкупе с соответствующим проектированием остальной части) всерьез и надолго избавляет от побочных эффектов и непредсказуемого роста сложности в дальнейшем.