И еще
Писать GUI на хаскеле - это все равно, что писать GUI на SQL.
Если обернуть фразу - то для того, чтобы сделать нормальный GUI фреймворк для хаскеля (а не сплошную имитацию императивщины на монадах), нужно представить GUI в декларативно-функционально-теоретико-множественном стиле :)
Если обернуть фразу - то для того, чтобы сделать нормальный GUI фреймворк для хаскеля (а не сплошную имитацию императивщины на монадах), нужно представить GUI в декларативно-функционально-теоретико-множественном стиле :)
no subject
вполне себе функционально. кстати, а где в описании GUI нужна императивщина?
no subject
no subject
no subject
no subject
Но вообще идея насчет комбинирования GUI из элементов сама по себе правильная.
А императивщина нужна, когда GUI сильно динамический, т.е. юзер ткнул в один элемент - десять других поменяли свое состояние. Я делал декларативное описание такого на XML - этот продукт в процессе разработки потерял поддерживаемость года где-то за два, сейчас буду переделывать и переносить декларативные описания внутрь кода(структура примерно такая же, но в качестве описания будет структура .NET класса, управляющего GUI, а всякие проверки и прочее - чисто императивный код).
no subject
Что касается контроллеров -- вся логика валидации действий тоже как правило целиком функциональна. Единственная императивщина -- собственно дергание модели запросом на изменение состояния.
Все жесткие правила относительно последовательных цепочек действий -- разруливаем, реализовав на уровне модели объект "сессия" и сведя задачу к предыдущей.
Вот и выбросили из ГУИ 99% императивщины, которой там при правильном проектировании изначально не должно было быть.
no subject
ну а что GUI страшное, так речь не о том; это - интерфейс, снизу к нему хоть Qt пристегнуть можно, хоть GTK# (насчёт WinForms не уверен)
no subject
Зависимости внутри GUI между элементами проще выражать в виде обычного императивного кода "выбрали строку в гриде->кнопки стали разрешены", а не в виде "Выбрали строку в гриде - событие ушло в адаптер грид-источник данных -> адаптер поменял модель -> пошло событие "модель изменена" на view -> view перерисовалось". При этом еще желательно что бы изменялись только кнопки, а не весь view целиком, т.е. нужно на каждое изменяемое свойство отдельное событие, и все это писать руками никакой радости нет.
no subject
no subject
no subject
no subject
Но как всегда, сначала на это дело не хватило времени, а потом проект законсервировался, т.к. тендер выиграла другая контора :)
no subject
Альтернатива дороге в ад - отладка вызовов функций 20-уровневой вложенности - от кнопки до модели и обратно до view :)
no subject
:)
Потом другой контроллер модифицирует то же отображение по-своему, и дальше начнется, потом третий контроллер попробует эту кнопку "восстановить в исходную позицию" сообразно своей логике...
И готово.
no subject
И включать-выключать кнопки по итогам чтения этого состояния, а не по воле контроллера?
А обмен сигналами об изменении -- через простенький диспетчер, решающий кому надо перерисовываться по итогам изменения набора переменных?
Не вижу что-то тут 20 уровней вложенности.
Банальное отделение логики от представления.
no subject
Соответственно, направлений взаимодействия -- никак не может быть больше 6 (а реально -- 3-5).
Зато один раз написанный и оттестированный MVC-каркас (вкупе с соответствующим проектированием остальной части) всерьез и надолго избавляет от побочных эффектов и непредсказуемого роста сложности в дальнейшем.