Тензорная архитектура на примере интерактива
От: LVE https://www.proza.ru/avtor/woldemar1974lve
Дата: 27.07.17 22:04
Оценка:
(я боюсь, что вообще не туда попал. Здесь все очень серьёзные)

По рекомендации господина LaptevVV, я осмелюсь предложить Вашему вниманию краткую выжимку из своего опыта и ряд соображений. Здесь речь идёт об управлении многообразием графических компонентов, известное как комбинаторный взрыв. Тема актуальна для разработчиков всевозможных редакторов, САПР и игр.
Если это окажется интересным, то я постараюсь экстраполировать свой опыт по этой теме, написать библиотеку и оформить статью.

За 20 лет моей работы в сфере ИТ, 80% работы было связано с рисованием и управлением, — то есть с интерактивной графикой. Это были всякого рода редакторы, GUI и игрушки.

Классическим руководством по этой тематике я считаю книгу Гради Буча про ООП. В ней есть ряд хороших примеров по построению иерархии классов и объектов с методами рисования и управления.

Следующим этапом исследования этой темы является библиотека Objective View на C++ от компании Stingray. Несмотря на то, что такой компании уже нет, реализованная архитектура MVC – модель, вид, контроллер, до сих пор является актуальной.

С точки зрения GUI эта тема имеет множество реализаций, начиная от WIN_API_32 – MFC, виджетами *nix – X-Windows и заканчивая множеством других подобных технологий.

Существенным вкладом в тему я считаю технологию Ангуляр 2. Основы её разрабатывались тогда (2008 – 2010 гг), когда я увлечённо писал собственную библиотеку. Теперь я нахожу много эффективных сходств. Прежде всего – это контекст управления. Во-вторых, — это каскадные свойства.

Это было введением в тему.
А теперь – постановка задачи:
— При отображении графических примитивов и организации управления ими, необходимо учитывать множество вариантов. Это я называю «способностью компонента». Сюда относятся такие вещи, как способ отображения (Заливка и Окантовка), буферизация, способы редактирования, декоративные навески (типа лейблов, рамочек и заголовков), хендлы редактирования, эффекты, связки, стрелочки и т.п.
Таким образом проявляется эффект комбинаторного взрыва.
Крупные компании могут себе позволить форсирование этой проблемы, нанимая 10, 100 и 1000 программистов, для обслуживания всех частных случаев. Ну Вы понимаете – что эта тошнятина – словно закат солнца в ручную.

Что же можно сделать? И причём тут тензорная архитектура?
Прежде всего, я предлагаю разделить интерактивную задачу на 4 пространства:
1. пространство пользовательских операций,
2. пространство команд для стека Undo/Redo,
3. пространство управляемых компонентов,
4. пространство способностей компонентов — элементов.

Теперь рассмотрим эти пространства подробнее.

1.Пространство пользовательских операций.
Каждая операция должна иметь метод или признак срабатывания. При этом, надо учитывать что обращение к каждой операции происходит в последовательном цикле. К сожалению, ничего более умного пока придумать не удалось. Может быть введение кодов типа MouseMove что-то изменит.
Кстати!
Вы можете существенно облегчить свой редактор, если будете игнорировать MouseMove, который происходит слишком часто.
Для интерактивной программы достаточно опрашивать позицию курсора синхронно с частотой обновления экрана – 25 Гц.
Здесь ещё надо добавить, что ряд операций захватывают управление. Типа перетаскивания.
Значит Вам надо где-то хранить: координаты курсора, нажатые клавиши, активную операцию и т.п.
Вот здесь мы приходим к пониманию важного класса – Контекст Управления. Его экземпляр нам надо передавать в каждую операцию, как при опознавании актуальной операции, так и при её реализации.

2.Пространство команд для стека Undo/Redo.
Надеюсь, что всем понятно – пользовательские операции не меняют объектов редактирования, за исключением операций выделения, изменением масштаба вида, положения холста и т.п.
Потому что при редакции они должны порождать команды.
В архитектуре MVC эта тема очень хорошо проработана.
Надо заметить, что в тензорной архитектуре нам придётся писать большинство команд не для компонентов, а для их элементов.

3.Пространство управляемых компонентов.
В идеале, класс компонента должен быть одним, универсальным. Объект этого класса — это та единица, с которой работает пользователь.
Что он должен делать? – Иметь список своих элементов-способностей и работать с Контекстом Управления. А именно: быть активным, выделенным, перемещаться, копироваться, трансформироваться, быть группой или членом группы и т.п.
Однако есть исключения. Такие компоненты, как Холст, Лист и Вид, легче породить от универсального класса как частный случай.

4.Пространство способностей компонентов – элементов.
Здесь сосредоточена вся работа: способ отображения (Заливка и Окантовка), буферизация, способы редактирования, декоративные навески (типа лейблов, рамочек и заголовков), хендлы редактирования, трансформации, эффекты, связки, стрелочки и т.п. Поскольку элементы заносятся в список компонента, то пользователь может настраивать свои компоненты динамически, определяя порядки и способности.

Итак. Мы рассмотрели 4 пространства классов, которые можно обозначить k, l, m, n. При нахрапистом подходе потребуется написать код примерно для k * l * m * n методов!
Всё будет очень жёстко и фирма изнасилует много программистов, чтобы добиться элементарного единообразия.

При тензорной архитектуре, которую я нарисовал, Вам достаточно написать примерно k + l + m + n методов. Ещё можно написать ряд методов для настройки компонентов. Единообразие гарантировано самой архитектурой.

***
Я очень надеюсь, что для программистов с опытом создания редакторов — тема ясна.
Я очень надеюсь, что для всяких специалистов — тема будет интересна и полезна.
Прошу не вдаваться в демагогию. И требовать от меня определений — пока не надо. Тема ещё сырая.

Далее — мне проще приводить конкретный код с комментариями, чтобы постепенно довести его до практической применимости.
Пускай мой код служит доказательством. Чтобы мы не уходили в словоблудие.
Отредактировано 28.07.2017 5:15 LVE . Предыдущая версия . Еще …
Отредактировано 28.07.2017 4:57 LVE . Предыдущая версия .
Отредактировано 28.07.2017 4:51 LVE . Предыдущая версия .
Отредактировано 28.07.2017 4:49 LVE . Предыдущая версия .
Отредактировано 28.07.2017 4:36 LVE . Предыдущая версия .
Re: Тензорная архитектура на примере интерактива
От: Arsen.Shnurkov  
Дата: 28.07.17 04:55
Оценка: :)
LVE> Пускай мой код служит доказательством.

и? ссылка на github/bitbucket где?
Re[2]: Тензорная архитектура на примере интерактива
От: LVE https://www.proza.ru/avtor/woldemar1974lve
Дата: 28.07.17 05:03
Оценка: -1
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>и? ссылка на github/bitbucket где?


https://money.yandex.ru/to/410013231711715
Re: Тензорная архитектура на примере интерактива
От: Stanislav V. Zudin Россия  
Дата: 28.07.17 06:29
Оценка: 5 (2)
Здравствуйте, LVE, Вы писали:

LVE>По рекомендации господина LaptevVV, я осмелюсь предложить Вашему вниманию краткую выжимку из своего опыта и ряд соображений. Здесь речь идёт об управлении многообразием графических компонентов, известное как комбинаторный взрыв. Тема актуальна для разработчиков всевозможных редакторов, САПР и игр.

LVE>Если это окажется интересным, то я постараюсь экстраполировать свой опыт по этой теме, написать библиотеку и оформить статью.

LVE>За 20 лет моей работы в сфере ИТ, 80% работы было связано с рисованием и управлением, — то есть с интерактивной графикой. Это были всякого рода редакторы, GUI и игрушки.


Судя по написанному ниже, игрушек было больше (вот такое сложилось мнение). А т.к. подходы для проектирования принципиально разные, то я не стал бы собирать всё в одну кучу.

LVE>Следующим этапом исследования этой темы является библиотека Objective View на C++ от компании Stingray. Несмотря на то, что такой компании уже нет, реализованная архитектура MVC – модель, вид, контроллер, до сих пор является актуальной.


Стингреевские контролы в свое время были неплохи. Ихнее MVC для графических редакторов ну никак не вписывалось. Может для каких-нибудь табличных редакторов оно и пригодно —


LVE>А теперь – постановка задачи:

LVE>- При отображении графических примитивов и организации управления ими, необходимо учитывать множество вариантов. Это я называю «способностью компонента». Сюда относятся такие вещи, как способ отображения (Заливка и Окантовка), буферизация, способы редактирования, декоративные навески (типа лейблов, рамочек и заголовков), хендлы редактирования, эффекты, связки, стрелочки и т.п.
LVE>Таким образом проявляется эффект комбинаторного взрыва.
LVE>Крупные компании могут себе позволить форсирование этой проблемы, нанимая 10, 100 и 1000 программистов, для обслуживания всех частных случаев. Ну Вы понимаете – что эта тошнятина – словно закат солнца в ручную.

Но тут пришел наш камрад Андрей Федонюк (АКА c-smile) и одним махом решил все проблемы, создав замечательную библиотеку htmlayout.

LVE>Что же можно сделать? И причём тут тензорная архитектура?

LVE>Прежде всего, я предлагаю разделить интерактивную задачу на 4 пространства:

LVE>1.Пространство пользовательских операций.

LVE>Каждая операция должна иметь метод или признак срабатывания. При этом, надо учитывать что обращение к каждой операции происходит в последовательном цикле. К сожалению, ничего более умного пока придумать не удалось. Может быть введение кодов типа MouseMove что-то изменит.

Непонятное утверждение. Какая операция? В каком цикле?
Жмякнули на checkbox, получили уведомление, обработали событие. Где цикл?

LVE>Кстати!

LVE>Вы можете существенно облегчить свой редактор, если будете игнорировать MouseMove, который происходит слишком часто.
LVE>Для интерактивной программы достаточно опрашивать позицию курсора синхронно с частотой обновления экрана – 25 Гц.

Мой опыт подсказывает, что MouseMove приходит реже, чем 25Гц.
Поэтому если надо делать графический редактор, то лучше привязываться к MouseMove. Для игр, где графика должна быть плавной и изображение может меняться без участия пользователя (анимация — дует ветер, деревья колышутся, персонаж стоит и ковыряется в носу) нужна привязка к FPS.

LVE>Здесь ещё надо добавить, что ряд операций захватывают управление. Типа перетаскивания.

LVE>Значит Вам надо где-то хранить: координаты курсора, нажатые клавиши, активную операцию и т.п.
LVE>Вот здесь мы приходим к пониманию важного класса – Контекст Управления. Его экземпляр нам надо передавать в каждую операцию, как при опознавании актуальной операции, так и при её реализации.

Для этого существуют конечные автоматы. А контекст элементарный — исходное положение курсора + текущее положение курсора.

LVE>2.Пространство команд для стека Undo/Redo.

LVE>Надеюсь, что всем понятно – пользовательские операции не меняют объектов редактирования, за исключением операций выделения, изменением масштаба вида, положения холста и т.п.
LVE>Потому что при редакции они должны порождать команды.

Агащяззз.
Существует два способа реализации Undo/Redo.
1. "действие-антидействие" (АКА паттерн "Команда")
2. Сделать snapshot БД перед началом редактирования (паттерн "состояние").

Первый способ применим для дискретных операций — удалить объект, сменить состояние крыжика.
А вот если тебе надо переместить объект, а во время перемещения надо объект отрисовывать, попутно перестраивая какие-нибудь связи... тут я пожелаю тебе удачи. Здесь необходим второй метод.
Реализация второго способа простая, достаточно хранить не всю базу, а только модифицируемые объекты.
Оба способа легко комбинируются.


LVE>3.Пространство управляемых компонентов.

LVE>В идеале, класс компонента должен быть одним, универсальным. Объект этого класса — это та единица, с которой работает пользователь.
LVE>Что он должен делать? – Иметь список своих элементов-способностей и работать с Контекстом Управления. А именно: быть активным, выделенным, перемещаться, копироваться, трансформироваться, быть группой или членом группы и т.п.
LVE>Однако есть исключения. Такие компоненты, как Холст, Лист и Вид, легче породить от универсального класса как частный случай.

Как только появляются связи между объектами (или компонентами в твоей терминологии??? я уже запутался), так все эти общие классы летят к чертям.
Можно выделить некоторые общие интерфейсы, но это предел.
С интерфейсами, кстати, есть занятная проблема. Полиморфизьм это, конечно, замечательно. Но! Следует помнить, что алгоритмы определяют структуры данных, а не наоборот. Можно нарисовать красивые структуры данных, разные там интерфейсы, но если из-за этого алгоритм из O(N) превращается в О(N^3), то нафиг такие структуры данных.


LVE>4.Пространство способностей компонентов – элементов.

LVE>Здесь сосредоточена вся работа: способ отображения (Заливка и Окантовка), буферизация, способы редактирования, декоративные навески (типа лейблов, рамочек и заголовков), хендлы редактирования, трансформации, эффекты, связки, стрелочки и т.п. Поскольку элементы заносятся в список компонента, то пользователь может настраивать свои компоненты динамически, определяя порядки и способности.

Если говорить о редакторе, то число состояний каждого компонента конечно. Определяется на уровне представления (View в MVC).

LVE>Итак. Мы рассмотрели 4 пространства классов, которые можно обозначить k, l, m, n. При нахрапистом подходе потребуется написать код примерно для k * l * m * n методов!

LVE>Всё будет очень жёстко и фирма изнасилует много программистов, чтобы добиться элементарного единообразия.

LVE>При тензорной архитектуре, которую я нарисовал, Вам достаточно написать примерно k + l + m + n методов. Ещё можно написать ряд методов для настройки компонентов. Единообразие гарантировано самой архитектурой.


Это в обычной архитектуре будет примерно l + m + n методов (k — лишнее, а кстати, что такое k? ), без всяких комбинаторных взрывов.

LVE>Я очень надеюсь, что для программистов с опытом создания редакторов — тема ясна.


LVE>Далее — мне проще приводить конкретный код с комментариями, чтобы постепенно довести его до практической применимости.

LVE>Пускай мой код служит доказательством. Чтобы мы не уходили в словоблудие.

Сдается мне, Владимир Евгенич, что ты сильно усложняешь.
Но подождём кода.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Тензорная архитектура на примере интерактива
От: LVE https://www.proza.ru/avtor/woldemar1974lve
Дата: 28.07.17 08:53
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:
...

Я рад Вашему вниманию к теме.
Сожалею, что не могу ответить на все Ваши замечания.

Давайте знакомиться. Меня зовут – Владимир Евгеньевич.
Меня интересует создание учебных пособий по интерактивной графике и по тензорной архитектуре.

Всё хочется сделать с пошаговой демонстрацией рабочего кода.
Я ориентируюсь на С#. Можно продублировать код на С++.

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

Более того. Вы можете выступить в качестве эксперта по интерактивным технологиям, но только если есть возможность документально подтвердить свою квалификацию.
Re: Тензорная архитектура на примере интерактива
От: vmpire Россия  
Дата: 28.07.17 08:54
Оценка: +2 -1
Здравствуйте, LVE, Вы писали:

LVE>Что же можно сделать? И причём тут тензорная архитектура?

LVE>Прежде всего, я предлагаю разделить интерактивную задачу на 4 пространства:
LVE>1. пространство пользовательских операций,
LVE>2. пространство команд для стека Undo/Redo,
LVE>3. пространство управляемых компонентов,
LVE>4. пространство способностей компонентов — элементов.
Никакая это не "тензорная архитектура", обыкновенный частный случай Separation of Concerns
Re[3]: Тензорная архитектура на примере интерактива
От: Stanislav V. Zudin Россия  
Дата: 28.07.17 09:21
Оценка: 6 (1) +1
Здравствуйте, LVE, Вы писали:

LVE>Меня интересует создание учебных пособий по интерактивной графике и по тензорной архитектуре.


Благое начинание, а есть потребность в таком учебном пособии?
Методичка обычно пишется в формате "делай так". Такой формат хорош для выполнения отдельно взятой задачи, но в общем виде, для расширения кругозора, кмк не подходит.
Если есть чем поделиться, то лучше книга в формате "как я рожал ёжиков", т.е. с описанием задачи, проблем, с которыми пришлось столкнуться и способов, какими эти проблемы разрулили.
В качестве примера замечательная книжица (думаю, в библиотеке возможно найти).

LVE>Вы можете выступить в качестве соавтора методички, если представите свою концепцию интерактивных взаимодействий.

LVE>Я уверен, что Ваш опыт будет очень интересен читателям.

У нас, я подозреваю, несколько различный взгляд на проблему, передерёмся Поэтому сразу беру самоотвод.

LVE>Более того. Вы можете выступить в качестве эксперта по интерактивным технологиям, но только если есть возможность документально подтвердить свою квалификацию.


Даже не представляю, как можно документально подтвердить квалификацию.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Тензорная архитектура на примере интерактива
От: alpha21264 СССР  
Дата: 28.07.17 10:09
Оценка: -1
Здравствуйте, vmpire, Вы писали:

V>Никакая это не "тензорная архитектура", обыкновенный частный случай Separation of Concerns


Чё пристал?
Ну нравится человеку слово "тензор".
Он таким образом воспринимает многомерность и независимость этих ваших "концернов".

Я под его влиянием даже начал книжку про тензоры читать

Течёт вода Кубань-реки куда велят большевики.
Re[2]: Тензорная архитектура на примере интерактива
От: LVE https://www.proza.ru/avtor/woldemar1974lve
Дата: 28.07.17 10:20
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Никакая это не "тензорная архитектура"...


ТЕНЗОРНАЯ АРХИТЕКТУРА (с) — Владимир Евгеньевич Липатов.
Re[3]: Тензорная архитектура на примере интерактива
От: vmpire Россия  
Дата: 28.07.17 11:08
Оценка: +2 :))
Здравствуйте, alpha21264, Вы писали:

A>Чё пристал?

A>Ну нравится человеку слово "тензор".
A>Он таким образом воспринимает многомерность и независимость этих ваших "концернов".

A>Я под его влиянием даже начал книжку про тензоры читать

Не, ну тогда, конечно, польза есть
Re[3]: Тензорная архитектура на примере интерактива
От: vmpire Россия  
Дата: 28.07.17 11:09
Оценка: +2
Здравствуйте, LVE, Вы писали:

LVE>ТЕНЗОРНАЯ АРХИТЕКТУРА (с) — Владимир Евгеньевич Липатов.

Ну да, если копирайт налепить на любое сочетание слов, оно, конечно же станет осмысленным
Re[3]: Тензорная архитектура на примере интерактива
От: Arsen.Shnurkov  
Дата: 28.07.17 11:20
Оценка: -1
A>Ну нравится человеку слово "тензор".
A>Я под его влиянием даже начал книжку про тензоры читать

А силён ли ты в "миварных технологиях"?
Отредактировано 28.07.2017 11:21 Arsen.Shnurkov . Предыдущая версия . Еще …
Отредактировано 28.07.2017 11:20 Arsen.Shnurkov . Предыдущая версия .
Re[4]: Тензорная архитектура на примере интерактива
От: alpha21264 СССР  
Дата: 28.07.17 11:38
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

A>>Ну нравится человеку слово "тензор".

A>>Я под его влиянием даже начал книжку про тензоры читать

AS>А силён ли ты в "миварных технологиях"?


Оооо, какая интересная штучка!
Слово такое вижу впервые, но про что-то подобное много думал.
Может быть и силён. Начну с того, что про это почитаю.

Течёт вода Кубань-реки куда велят большевики.
Re[5]: Тензорная архитектура на примере интерактива
От: Arsen.Shnurkov  
Дата: 28.07.17 11:49
Оценка: -1
A>Слово такое вижу впервые

гонишь:
http://rsdn.org/forum/humour/6054917?tree=tree
Автор: alpha21264
Дата: 21.05.15


A> Может быть и силён. Начну с того, что про это почитаю.


уже два года читаешь, как дочитаешь — поделись выводами.
Re[4]: Тензорная архитектура на примере интерактива
От: LVE https://www.proza.ru/avtor/woldemar1974lve
Дата: 28.07.17 11:51
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:
AS>А силён ли ты в "миварных технологиях"?

Похоже наш ТРИЗ украли, перевели, а теперь нам обратно его впаривают.
Re[4]: Тензорная архитектура на примере интерактива
От: LVE https://www.proza.ru/avtor/woldemar1974lve
Дата: 28.07.17 12:01
Оценка:
Здравствуйте, vmpire, Вы писали:

LVE>>ТЕНЗОРНАЯ АРХИТЕКТУРА (с) — Владимир Евгеньевич Липатов.

V>Ну да, если копирайт налепить на любое сочетание слов, оно, конечно же станет осмысленным

Мне совершенно не важно — что вы думаете об этом сочетании слов.
Мне интересно то, что вы можете сделать, услышав их.
Re[5]: Тензорная архитектура на примере интерактива
От: vmpire Россия  
Дата: 28.07.17 12:07
Оценка: +1
Здравствуйте, LVE, Вы писали:

AS>>А силён ли ты в "миварных технологиях"?

LVE>Похоже наш ТРИЗ украли, перевели, а теперь нам обратно его впаривают.
Не, похоже это что-то для распила бюджета
Re[5]: Тензорная архитектура на примере интерактива
От: vmpire Россия  
Дата: 28.07.17 12:11
Оценка: +2
Здравствуйте, LVE, Вы писали:

LVE>Мне совершенно не важно — что вы думаете об этом сочетании слов.

LVE>Мне интересно то, что вы можете сделать, услышав их.
Сделать я могу только одно: заявить о том, что не понимаю их смысла.
По начальному посту — это просто частный случай SoC. По крайней мере, я не понял, в чём отличие.
Если сможете объяснить — тогда смогу прокомментировать подробнее.
А так — разбить систему на подзадачи и компоненты, чтобы не было связей всех со всеми — это абсолютно типовая задача любого проектировщика ПО.
Под которую давно уже есть и теоретическая база и метрики качества этой работы (coupling/cohesion) и эмпирические правила по её осуществлению.
Само разбиение будет, естественно, разным для разных решаемых задач.
Re[6]: Тензорная архитектура на примере интерактива
От: Arsen.Shnurkov  
Дата: 28.07.17 12:38
Оценка: :)
V> Под которую давно уже есть и теоретическая база и метрики качества этой работы

И такой код с Undo/Redo уже написано на C# (я его не сам писал, но в моём репозитории на Github такой есть)
приведённое топикстартером решение является банальностью, которая применяется в графических редакторах лет 15 точно.
И всё это вещается с жутчайшим апломбом, мол "20 лет опыта, внимайте мне, меня волнует как я вас вдохновил".
Re[7]: Тензорная архитектура на примере интерактива
От: LVE https://www.proza.ru/avtor/woldemar1974lve
Дата: 28.07.17 15:07
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>И такой код с Undo/Redo уже написано на C# (я его не сам писал, но в моём репозитории на Github такой есть)

AS>приведённое топикстартером решение является банальностью, которая применяется в графических редакторах лет 15 точно.
AS>И всё это вещается с жутчайшим апломбом, мол "20 лет опыта, внимайте мне, меня волнует как я вас вдохновил".

Твоё возмущение — абсолютно не обосновано. Банальная зависть и личная неприязнь.
А вот у меня есть серьёзные основания для развития этой темы.

Дело в том, что множество фирм имеют либо избыток ресурсов, либо тырят готовые компоненты без оглядки.

Ярким примером этого является то, что частенько в редакторе ввода и в окне вывода — используются разные шрифты.
Меня это напрягает, потому что иногда я публикую таблицы.
В такой ситуации я не знаю — как будет выглядеть моё сообщение и как сделать так, чтобы всё было выровнено.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.