Здравствуйте, desperado_gmbh, Вы писали:
_>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>Да очень просто. Базовый алфавит тебе известен — набор элементарных типов SQL. Пишешь набор редакторов (по одному для каждого SQL-типа), унаследованных от общего интерфейса с виртуальными функциями и конфигурируешь их набор в зависимости от поступившего набора колонок. Но это не имеет ничего общего с rtti! Это — распознавание входных данных.
_>И формирование выходных данных тоже — после редактирования надо разобрать введенную строку в значение нужного типа и записать его в курсор. В результате свитч все равно остается,
Где? Цепочка конвертеров вполне избавляет от необходимости свитчей. Свитч по большому счёту нужен только для первичного распознавания SQL-типа, да и то без него можно обойтись списком конвертеров.
_>но называется все это не rtti, а каким-то другим умным словом. Вместо проверки typeid мы будем проверять какой-то заведенный нами enum. Сейчас у нас в проекте так и сделано. И чем это лучше передачи типа object/variant в функцию форматирования, где внутри стоит свитч по типу?
Чем это лучше в вашем проекте — не знаю, но рискну предположить, что enum появился не случайно. Скорее всего вы ограничили набор SQL-типов, сведя, например, char(x), varchar(x) и text в единый тип с набором ограничений.
Хотя, надо сказать, что ты сейчас сравниваешь подход и конкретное решение. При моём подходе общая функция форматирования будет вырожденной, т.е., не содержащей кода форматирования. Последний будет вынесен в отдельные функции, специфические для каждого типа (скорее всего — методы).
Один из плюсов такого подхода — в возможности добавления новых конвертеров без влияния (т.е., — даже без потенциального редактирования!) на код, реализующий общую часть алгоритмов форматирования, например.
ГВ>>Узлы синтаксического дерева (или дерева вычисления выражения) вполне можно сделать по аналогии с редакторами.
_>Да-да. Со свитчами.
Зачем? Можно при распознавании синтаксиса сразу развесить нужные конвертеры. Свитчи снова остаются в области анализа входных данных (парсируемое выражение + набор колонок). Но там без них в общем случае не обойдёшься.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!