Вверх ↑
Ответов: 4629
Рейтинг: 749
#1: 2015-11-03 12:09:42 ЛС | профиль | цитата
С ChanelToIndex и некоторыми другими компонентами возникает следующая дилемма. Обычно компонентам, которые реализуют некоторый конкретный функционал на целевом языке, требуется вполне определенный тип данных (или несколько допустимых типов), но в любом случае, для того чтобы сгенерировать код, оперирующий этими данными, нужно знать тип данных на этапе генерации кода. Например, у компонента EditText точка Value возвращает данные типа string, а метод doText требует тип string для задания текста в поле. Если подать на doText тип string, метод и задаст этот текст. А если подать тип int? В компоненте (и в кодогенераторе) предусмотрено, что компонент, требующий тип string не просто читает данные из потока, а читает их с помощью специальной функции, которая проверяет тип входных данных и по заданным правилам оборачивает их в функции целевого языка так, чтобы компонент получил их строковое представление или пустую строку, если конвертация невозможна. Например, числовые типы можно преобразовать в строку, а вот объекты - нет (да и нет смысла). Так вот, когда метод doText получает на входе данные типа int, то в целевой код выводится такая конструкция:
ed2.setText(String.valueOf(данные типа int), TextView.BufferType.EDITABLE);

Здесь пока всё нормально. А теперь возьмём компонент ChanelToIndex с нижней точкой Data, которая выдаёт данные с методов. Какой тип данных должна выдать точка Data, с учётом того, что методы вызываются тогда, когда им нужно, а она читается в процессе генерации кода только тогда, когда какой-нибудь компонент запрашивает у неё данные? При этом, естественно, с методов поступают данные разных типов, а присоединенный компонент должен сгенерировать только один код.

Приведённое выше решение уже не может работать. В пакете для таких случаев (обобщённо: когда некоторый компонент может хранить и выдавать данные любых типов, например, Memory) при записи предусмотрено сохранение данных в специальном объекте в процессе работы программы и при чтении компонентами они получают не немедленную конвертацию одного типа в другой (а когда конвертация не нужна, она и не производится), а вызывают функцию типа "мне нужен тип string - выдай". А этот специальный объект проверяет, какой тип данных в нём сейчас записан и для каждого такого типа вызывает функцию преобразования и выдаёт результат. Это немного влияет на производительность, поэтому я стараюсь не очень активно это использовать.

Когда ChanelToIndex разрабатывался, эта методика ещё не была реализована, поэтому там точка Data не добавлялась. Я посмотрю, может в ближайшее время и добавлю.

GanjaKyp писал(а):
такая конструкция будет использовать одни и те же ресурсы картинок
Там картинки с одинаковыми именами перезапишут друг друга и останется только один экземпляр. Но более корректно использовать одни и те же FileResource с помощью LineBreakEx.
карма: 26

0