LINUX.ORG.RU

Вопрос по архитектуре

 , ,


0

2

Привет, ЛОР. С 8м марта тебя.

Вопрос по архитектуре. Существует следующая схема:

Основная структура:

[theme]
+-------steps
+-------replacers

Дополнительные структуры:
[steps]
+-------data
+-------painter
+-------releaser

[replacers]
+-------target
+-------replacer

Суть в чем - эта штука отвечает за отрисовку тем. Steps - это шаги для отрисовки. Каждый шаг может быть примитивом (квадрат, круг, etc), эффектом (gauss, etc) или, например, текстом. Чтобы не городить огороды я стандартизировал тип для хранения шага ([steps] выше). Т.е. там теперь хранится коллбек на отрисовщика (типа зачем блоку обратки тем знать про то, как рисовать квадрат, если этим может заниматься стандартизированный модуль квадрата), указатель на releaser (типа если модуль обработки примитива аллоцировал память для чего-то, пусть сам, так как он знакет как, освобождает), и указатель на void *, где хранятся данные, нужные для шага (ширина, высота, цвет, etc).

Блок replacers отвечает за следующую вещь - если в теме будет сказано «напиши „Вася“ по позиции 1,103 черным цветом шрифтом Tahoma», он напишет. Но практической пользы ноль. Поэтому тут объявляются «замены» - т.е. Например в файле темы будет написано «напиши »$BUTTONCAPTION" по позиции 1,103 черным цветом шрифтом Tahoma", а в функции ButtonSetCaption будет добавляться замена в массив Replacers -> $BUTTONCAPTION; MyButton.

Теперь проблема - функция painter в примитивах имеет сигнатуру - (изображение, где рисовать, указатель на блок данных). Каждый обработчик в своем модуле знает как интерпретировать указатель на блок данных, поэтому ему проблем нет. Но при этом обработчик painter в примитиве «надпись» не знает о заменах. поэтому он будет писать «$BUTTONCAPTION» вместо кепшена самой кнопки. Я не могу дать этому примитиву указатель на массив замен, так как тогда мне придется менять сигнатуру функции и давать такой указатель ВСЕМ примитивам. А всем остальным этот указатель не нужен, он нужен только примитиву «Надпись». Я так же не могу производить замены уровнем выше, потому что обработчик тем не знает, какого типа примитив лежит по этому адресу, у него только указатель на отрисовщик, указатель на освободитель и указатель на блок памяти без опознавательных знаков.

В общем загнал себя в угол. Есть идеи, как решить? Если непонятно объяснил, могу схемами.

★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Тебе же для каждого типа нужна своя замена? Тогда напиши каждому свой replacer в steps.

four_str_sam
()

Если замены постоянны или редко меняются, тогда нужно отдельно создавать некоторое событие перевода всех надписей приложения.
Пример: Qt5. Dynamic Translation

anonymous
()

Немного мутное описание Replacers, например:

в функции ButtonSetCaption будет добавляться замена в массив

Replacers -> $BUTTONCAPTION; MyButton.

Откуда берётся функция ButtonSetCaption и о какой кнопке идёт речь (я, конечно, догадываюсь, но лучше выяснить точно)? Что именно хранится в target и replacer?

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

Если непонятно объяснил, могу схемами.

Лучше кодом.

runtime ★★★★
()

Решил так - привязал replacers не к теме, а к изображению. Т.е. кнопка будет при SetButtonCaption прописывать замену в replacers не в тему, которая к ней привязана, а к каждому изображению кнопки (normal, hover, etc). Так как в функцию отрисовки пойдет изображение, то доступ у drawer'a будет доступ к replacer'a.

four_str_sam

Тогда напиши каждому свой replacer в steps.

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

anonymous

Если замены постоянны или редко меняются

Часто. Зависит от пользователя. Некоторые в надпись на кнопке обратный отсчет суют с миллисекундами.

runtime

Пока выглядит так, что проще всего поменять сигнатуру функций.

Просто эти replacers нужны ТОЛЬКО одному примитиву - отрисовке текста. Другим они никогда не понадобятся.

при котором «лишние» параметры в сигнатуре можно не указывать (но тут тоже возникает вопрос эстетичности).

pure c.

sambist ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.