|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
Интересно, есть ли такие системы разработки ПО, где программисту достаточно задумываться только над логикой работы программы, а удобный графический пользовательский интерфейс (UI) строился бы автоматически? Например, генератор UI при запуске создавал бы экземпляр определённого в программе главного класса, для всех найденных в нём открытых полей создавал бы элементы управления. Для открытых методов создавал бы кнопки или пункты меню. Ну а дальше, конечно, реагировал бы на изменения внутренней структуры открытых членов этого экземпляра главного класса, равно как и на факты создания, изменения, удаления вложенных в него объектов. Я, конечно, понимаю, что всех случаев, что можно запрограммировать и как это можно отобразить предусмотреть невозможно. Но может, есть попытки реализовать подобную систему для каких то специальных применений, где есть смысл упростить работу программистов, рисующих миллионы форм, гридов и ... Если, прежде всего, требуется сделать правильной логику работы, а удобное расположение кнопок, тулбаров, панелек, наличие всяких рюшечек дело десятое. Тем более что хватает графических компонентов с большими возможностями настройки их внешнего вида в режиме выполнения. Да и просто хочется, решая какую-то сложную задачу, при успешном запуске программы сразу иметь возможность удобно воздействовать на запущенную систему и созерцать результаты без необходимости дополнительного рисования форм, юзер контролов или без использования отладчика. Я пишу не о построении пользовательского интерфейса по модели базы данных или по некой структуре XML, а о том, что бы эту структуру не приходилось строить и связывать с кодом бизнес-логики руками, а иметь расширяемый генератор UI. У меня есть опыт построения подобной системы разработки ПО, и ещё больше пока не реализованных идей по этому поводу. Но интересно, не придумываю ли я велосипед? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2012, 20:39 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k, ну мой велик посмотри здесь ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2012, 23:39 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k, ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 09:25 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
vill_ager, ViPRos, я правильно понимаю что в Ваших системах функциональность конечной программы расширяется через заполнение метаданных а не через написание кода? То есть в случае если понадобиться реализовать какую то совершенно непредусмотренуе возможность бизнес-логики: скажем, работа с другой базой данных или просто использовать другую ОРМ, или скажем взаимодействие с каким то внешним сервисом, то придётся дорабатывать сам фреймворк? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 12:34 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k, не обязательно, это зависит... у меня скрипты на Python и Qt - пиши что хочешь Базы внешние через ODBC и Qt можно можно открывать MySql, SQLite - напрямую только ORM я не использую, есть только класс для работы с таблицей/запросом ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 12:54 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k, ORM не нужен а так куда хошь, как хошь, лазить можно (просто випрос вызовет твою фигню как плагин, если не задейстованы механизмы самой ВИПРОС), обычно это нафиг не надо ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 13:18 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
ViPRos, навороченная система если всё в ней предусмотрено. ViPRos, vill_ager, как я понял у вас другой подход - декларативное описание бизнес-логики с возможностью императивных вставок. Я рассуждаю так. В любом языке существует ограниченный набор базовых типов данных. Для обеспечения возможности взаимодействия с пользователями так же может быть достаточно ограниченного набора юзер контролов. Пользовательский интерфейс можно упростить например до командной строки. Но при этом модель может быть очень сложной, например операционная система или ядерный реактор. Можно в любой момент рефакторингом проанализировать состояние модели, считать структуру и значения и отобразить в аналогичном графическом виде. Но это не рационально. Лучше что бы представление подписывалось на события изменения состояний в модели и адекватно модифицировалось, отображало: открытые методы -> кнопки, открытые массивы -> гриды, открытые свойства -> поля для ввода, создание объекта -> создание панели или контрола. Ещё, насколько я знаю, попытки формализовать написания кода с помощью например UML диаграмм пока провалились. Сложновато с помощью формального описания достичь таких же возможностей, которые легче реализовать в языке. Ищу людей, кому тоже приходили в голову подобные мысли... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 15:34 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k Лучше что бы представление подписывалось на события изменения состояний в модели и адекватно модифицировалось, отображало: открытые методы -> кнопки, открытые массивы -> гриды, открытые свойства -> поля для ввода, создание объекта -> создание панели или контрола. все так и есть и немного больше ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 15:39 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
Тогда я не понял, ViPRos, на каком языке разрабатываете бизнес-логику? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 15:42 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k, На любом (но лучше на нетовских или SQL) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 16:37 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
ViPRos, только необходим заботиться о событиях. Например если захочу написать на C# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
то не получиться запустить готовый генератор пользовательского интерфейса Код: c# 1. 2. 3. 4. 5. 6.
так что бы он создал форму c кнопкой Do и полем DoCount. При этом пользовался только рефлексией. Он не может знать что при вызове Do() обновиться DoCount и это значение нужно считать на форму. Нужно вместо Код: c# 1.
либо Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
либо использовать во всех случаях специально обученные типы Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Для библиотечных типов тоже придётся делать обёртки, содержащие события. То есть код получается громоздким, а вместо обычных методов и свойств C# приходиться использовать структуры данных. Думаю Nemerle и АОП для этих целей подойдёт. Но может я не первый кто так думает? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 18:43 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k, в ВИПРОС явно указываются, какие методы типа в какую группу меню-кнопок попадет, так что нет нужды в аннотациях и рефлексии ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 19:03 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
ViPRos, а если требуется переработать модель, заменить какую сущность на группу сущностей приходиться сопровождать эти явные указания? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 21:24 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1kДумаю Nemerle и АОП для этих целей подойдёт. Но может я не первый кто так думает? нужно сначала разобраться в архитектуре системы. Вы задаете вопрос из области архитектуры, но в итоге скатываетесь к банальному программированию. Да хоть Немерль, хоть Паскаль подойдет, какая разница ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 22:13 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1kViPRos, а если требуется переработать модель, заменить какую сущность на группу сущностей приходиться сопровождать эти явные указания? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2012, 22:48 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
iscrafm, Может и Brainfuck подойдёт. Вообще про языки это продолжение темы, это второстепенно, но весьма существенно. На голом C тоже можно подобие ООП строить, однако это неудобно. А на ассемблере наверное ещё сложнее. Есть вещи которые очень очень сложно эмулировать на неподходящем языке. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2012, 00:35 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1kЯ, конечно, понимаю, что всех случаев, что можно запрограммировать и как это можно отобразить предусмотреть невозможно. Но может, есть попытки реализовать подобную систему для каких то специальных применений Системы определенных классов: фактографические, учетные, бухгалтерские. Т.е если в систему заложена определенная модель, то в рамках этой модели все делается автоматом - не только UI, но структура данных, БЛ, отчетные формы и т.д. Все, что в модель не влазит, программируется вручную и вставляется плагинами. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2012, 09:44 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1kУ меня есть опыт построения подобной системы разработки ПО, и ещё больше пока не реализованных идей по этому поводу. Но интересно, не придумываю ли я велосипед? а как читатели могут понять, придумываете ли вы велосипед или нет? Ни слова же не сказано об опыте и о том, какие варианты исследованы уже, почему они не подошли и почему ищется альтернатива ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2012, 11:34 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
iscrafm, спасибо за интерес! Попытаюсь описать суть моей архитектуры. Пользовательский интерфейс (UI) и бизнес-логика (модель) разделены. Взаимодействие с базой данных я не беру, это отдельная тема. Модель во время выполнения представлена деревом вложенных друг в друга объектов. Объект может быть простого типа: число, дата, строка и т.п., может быть действием (паттерн команда), может быть составным типом: набором полей или массивом записей - таблицей. Таблица дополнительно может включать в свой состав поля и действия. Для каждого типа: и простого и сложного предусмотрен свой класс, который кроме прочего предусматривает события на изменение своего состояния. События позволяют генератору UI выполнять свои функции. Для простых типов это ValueChanging и ValueChanged – начало и окончание обновления значения. Для таблицы – начало, окончание обновления или, например, события обновления перечня строк… Для каждого типа модели на стороне UI есть свой контрол. Я использовал DevExpress. Полезной особенностью для моей идеи оказалась возможность настройки внешнего вида многих компонентов в режиме выполнения. Для числа, даты, строки и т.п. – приспособил потомки от CalcEdit, DateEdit, TextEdit. Для набора полей породил класс от LayoutControl. Для таблиц - потомок GridControl. Все эти потомки я обучил считывать содержимое объектов модели при связывании и подписываться на события. При запуске приложения генератору UI вызывает некий метод из модели, который возвращает стартовый объект составного типа. Генератор создаёт соответствующий контрол и связывает его с объектом модели. Привязываясь, контрол считывает содержимое объекта модели и создаёт внутри себя соответствующие контролы, которые так же связаны. Действия модели становятся кнопками или инструментами на панели. Вложенные в объект наборы полей – всплывающими панелями. Объекты простых типов двусторонне связываются с моделью. Если модель только написана и запущена 1-ый раз, то элементы на контролах располагаются по умолчанию: контролы в LayoutControl друг за другом списком, вложенные LayoutControl в панелях в определённом месте. Панель инструментов тоже аналогично. Я их настраиваю и запоминаю. Каждый объект характерезует идентификатор сохранения. Обученные котролы запоминают внешнее представление в базу данных по составному ключу: идентификатор сохранения, пользователь. Идентификатор сохранения определяет какие объекты одного и того же класса будут иметь один и тот же вид. Идентификатор сохранения в модели может быть вычислен из полного пути в дереве объектов модели – тогда представление экземпляра одного и того же класса модели, но в разных местах дерева будет запоминаться по-разному. Если идентификатор сохранения состоит из имени типа объекта, тогда все будут представлены одинаково. То есть легко добиться что бы, например, некий список, используемый для работы с ним как с таковым, выглядел внешне одним образом, а при использовании его в качестве словаря – другим образом. Проиллюстрирую архитектуру на примере из реальной практики. Я значительно упростил задачу с целью показать используемый принцип как можно яснее. В организацию поступают запросы на получение документов. От приложения требуется реализовать возможность прикреплять требуемые документы к запросу. Новые запросы разбирает исполнитель, который формирует список прикреплённых к запросу документов. Обработанные исполнителем запросы подписывает или направляет на доработку начальник. Начальник не может менять список документов. Модель обработчика запросов я представил классом Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
В нём инкапсулировано относящееся ко всем режимам. В нём описано, что запрос включает некие поля в зависимости от режима, и одно поле для всех режимов поле - список документов, состав которого так же зависит от режима. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Все различая делегированы в потомки ModeBase (по принципу паттерна стратегии) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Для исполнителя создаю объект Код: c# 1.
и связываю его Код: c# 1.
Для начальника Код: c# 1.
Для простого просмотра, без возможности каких либо изменений Код: c# 1.
где Код: c# 1. 2. 3.
Эти объекты передаю генератору объектов, который создаёт контролы, связывает, те в свою очередь наполняют себя контролами и связывают с соответствующими объектами модели. Динамически реагируют на изменения её интерфейса. Не приходиться рисовать формы в дизайн тайме и связывать их с моделью. Приходиться располагать компоненты по местам. Прикрепил принтскрин для иллюстрации. iscrafmпочему они не подошли и почему ищется альтернатива Ищу потому что предположил что не одному мне приходят в голову подобные идеи. Осознал и недостатки наработок. Понял, что таблицы и наборы полей реализуют одно и то же – включают в свой состав поля. А это много подобного кода. То есть неплохо бы предусмотреть возможность того, что таблицы могут включать таблицы и наборы полей как элементы контейнера. Наборы полей так же могут включать подтаблицы и наборы полей. Всего 4 варианта включений, из которых я реализовал только 2: таблица в наборе полей и набор полей в таблице. И получалось некрасиво там, где нужно привязать таблицу к таблице. Кроме того, логично было бы, что бы простые типы так же могли бы включать в свой интерфейс, например, дополнительные действия. Держусь варианта, что элемент любого типа может включать в свой состав элементы любого типа. То есть все элементы, выводимые в интерфейс, имели бы функциональность включения в свой состав других элементов. Так же каждый элемент мог являться каким-либо из базовых типов: метод, число, строка, дата, массив и т.п. Смущает так же то, что вместо использования свойств и методов языка C# приходиться городить свои классы и работать через них. Это повело к эмуляции полиморфизма. То есть если определю действие в каком то базовом классе, то для перегрузки его в порождённом, я его удаляю и добавляю другое с тем же именем, вместо override. P.S. На самом деле я подумал, что фраза iscrafmнужно сначала разобраться в архитектуре системы. касается архитектуры випрос. Вижу у ViPRos довольно развитая система, судя по принтскринам, до которой моим наработкам далеко. В ней взят за основу популярный вариант: ViPRos на основе реляционных структур данных с объектными расширениями на базе метаданных . Некая систему формального описывания для построения каркаса бизнес-логики, и конечно, оставляют лазейки для реализации нестандартного поведения - то, что не укладывается в придуманную схему. Пример: 1С, Visual Studio LightSwitch, где по модели базы данных строиться интерфейс. Ещё вариант XAML для декларативного описания графического интерфейса, но это чисто описание интерфейса, логику разумно вынести отдельно. Наверное, подобные идеи идут со времён появления графического интерфейса как такового. Я не о таких моделях, хотя они могут быть хороши. Я думаю, вместо взять за основу язык, что ограничит и стандартизует представление представление, но не ограничит и не усложнит бизнес-логику. Тормозит то, что тот же C# не приспособлен для такой организации. Если бы была возможность подписываться на любое действие выполняемое в C# создание, уничтожение, изменение значения и состава объекта - было бы очевиднее. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2012, 00:41 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2012, 00:41 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k, спасибо за описание. понятно ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2012, 02:28 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
d8m1k, Насколько я понимаю, после первого запуска нужна некая "настройка", для придания приложению "человеческого" вида. Это тоже своего рода программирование интерфейса, только визуальное. 1. Предполагается ли, что эта "настройка" будет определена создателем, и будет единой для всех пользователей? Или отдельные пользователи могут настраивать что-то под себя? Как соотносятся "пользовательские" и "централизованные" настройки? 2. Как и для всякого программирования, для "настройки" проявится необходимость контроля версий: "нет, вот кто и когда это натворил?". Есть ли это? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2012, 11:07 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
Cane Cat Fisher, системные, ролевые, юзерские, можно и версионировать, хотя нафиг ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2012, 12:13 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
В моей системе есть генератор форм. Не знаю это ли имел ввиду автор. http://www.sql.ru/forum/actualthread.aspx?tid=874730 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2012, 12:32 |
|
Генерация пользовательского интерфейса
|
|||
---|---|---|---|
#18+
Cane Cat Fisher, правильно понимаете! Нужна такая настройка. Только это просто декларативное описание. По сути это аналог работы в дизайнере среды разработки. Однако есть отличия: Дизайнер среды разработки Моя системаДоступно море компонентов не обязательно адекватных модели На каждом этапе выполнения компоненты уже созданы и нужно только настроить их вид и взаимное расположениеМожно вкладывать компоненты в компоненты как угодно Порядок вложения уже определён моделью на каждом этапе работы системыНеобходимо связывать компоненты с моделью Компоненты уже связаны с интерфейсом модели В девэкспрессе понаделали своих велосипедиков для такой визуальной настройки. У меня мечта - было бы здорово приспособить инструмент вроде Expression Blend, для WPF, только учитывающий упомянутые ограничения. Например, для каждого визуального контейнера был виден список всех элементов. Каждый элемент можно сопоставить с определённым компонентом из списка подходящих. Может есть смысл для каждого элемента создавать от 0 до нескольких компонентов. Всё это на этапе выполнения программы. Поясню на примере некого редактора, в котором может быть открыто несколько документов одновременно. В классе документа в модели определено действие "сохранить". Классически в дизайнере среды разработки программист волен расположить кнопку "сохранить" в главном меню приложения и тогда прийдётся реализовывать логику доступности этой кнопки на случай если не один документ не открыт. То есть развивать ViewModel если по MVVM или Presentator если по MVP. По моей задумке можно будет перемещать эту кнопку по панелям только внутри компонента документ - засунуть в меню документа, на панель инструментов, в статус бар, в локальное меню, но нельзя вынести кнопку в главном меню приложения, пока соответствующий интерфейс не будет предоставлен от модели. Вот если в модели написать фасад в классе редактор - создать действие "сохранить текущий документ", а в классе документа "сохранить" сделать недоступным - оставить для внутреннего использованию. Тогда кнопку можно будет настраивать уже в главном меню представления, а в компоненте документа она исчезнет. Таким образом интерфейс модели полностью определяет внешний вид. Программный интерфейс классов однозначно отображается на визуальный интерфейс. Cane Cat Fisher 1. Предполагается ли, что эта "настройка" будет определена создателем, и будет единой для всех пользователей? Или отдельные пользователи могут настраивать что-то под себя? Как соотносятся "пользовательские" и "централизованные" настройки? Предусмотрены "центральные" настройки по-умолчанию, которые для каждой версии приложения свои, но единые для всех пользователей. У пользователя могут быть свои настройки, но не привязаны к версии программы. Настройки по-умолчанию применяются в случаях - если пользователь не сделал своих настроек в данном контейнере - если сам намеренно удалил свои настройки Есть какой-то контейнер модели изменился в новой версии. То пользователь у которого уже есть свои настройки соответствующего визуального компонента увидит новые элементы в стандартном месте, а старых не увидит. Например, новые столбцы таблицы увидит в конце. Новые поля будут доступны через настройки. Cane Cat Fisher 2. Как и для всякого программирования, для "настройки" проявится необходимость контроля версий: "нет, вот кто и когда это натворил?". Есть ли это? У меня этого не было. Все настройки хранились в базе данных. Но по-хорошему это нужно. Принципиальных трудностей не вижу. Можно настройки хранить, например, в файловой системе так же как и код программы. Только визуальные редактор конечно нужно обучить пользоваться системой контроля версий. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2012, 13:31 |
|
|
start [/forum/topic.php?fid=33&fpage=19&tid=1547771]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
169ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 258ms |
0 / 0 |