﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Программирование / Программирование  / Хранение кода в базе данных - как / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Fri, 05 Sep 2008 17:25:20 GMT</lastBuildDate><ttl>20</ttl><item><title>Хранение кода в базе данных - как</title><link>http://www.relib.com/forums/Topic911225-15-1.aspx</link><description>Хочу хранить код (модуль) в базе данных. &lt;BR&gt;Код представляет собой набор функций. &lt;/P&gt;&lt;P&gt;Я передаю в вычислитель ссылку на коллекцию глобальных переменных и запускаю одну из функций модуля, установив ей параметры. &lt;/P&gt;&lt;P&gt;Каким способом добиться максимальной производительности (хочется хранить уже скомпилированный код)? &lt;/P&gt;&lt;P&gt;Код - простейший. &lt;BR&gt;В основном это обращения к методам других объектов, конструирование объектов (список доступных классов опять же в коллекции глобальных переменных), арифметические и строковые операции, ветвления. &lt;/P&gt;&lt;P&gt;То бишь хочется такого: когда я создаю некий объект, я залажу в базу данных (или кэш) и в переменную Code этого объекта заношу уже скомпилированный код этого объекта. &lt;/P&gt;&lt;P&gt;Далее, когда идет обращение к методу например Test() этого объекта, нужно чтобы вызвался метод Test этого объекта. &lt;/P&gt;&lt;P&gt;&lt;BR&gt;Или другой, более конкретный пример. &lt;/P&gt;&lt;P&gt;Например я описал классы для базовых элементов - документов, справочников, регистров накопления и т.д. &lt;BR&gt;Допустим я объявляю новый класс справочника номенклатуры Reference_Goods, наследуемый от класса справочники Reference. &lt;/P&gt;&lt;P&gt;Так вот, конкретные вопросы: &lt;BR&gt;1. Как мне сделать, чтобы при выполнении кода я мог сконструировать экземпляр этого класса, т.е. где должно быть размещено хранилище классов. &lt;BR&gt;2. Можно скомпилировать только этот класс (DLL), не перекомпилируя весь код приложения (EXE). То бишь вообще можно компилировать все классы отдельно, а &lt;BR&gt;3. Как мне объявлять в коде обращение к методам класса, если класс неопределен? Использовать метод, который возвращает имя класса и преобразовывать к этому классу или можно как-то прозрачнее реализовать? &lt;BR&gt;   for each el in collection do &lt;BR&gt;       Msg(Convert(el, el.GetType()).GetShtrihCode()); &lt;BR&gt;   next &lt;BR&gt;   а хочется просто: &lt;BR&gt;   for each el in collection do &lt;BR&gt;       el.GetShtrihCode(); &lt;BR&gt;   next &lt;/P&gt;&lt;P&gt;Есть ли в Pascal /delpy нетипизированный объект как в 1С? &lt;BR&gt;То бишь если x - variant, то как программа при этапе выполнения (а не компиляции) поймет как ей выполнять метод X.PRINT(), даже если этот метод действительно есть у объекта Х? &lt;BR&gt;И сильно ли будет тормозить такой нетипизированный объект. &lt;BR&gt;А как отыграть трюк 1С x["Print"](), т.е. вызов метода по имени? &lt;/P&gt;&lt;P&gt;4. Желательно, чтобы приложение и код пользовательских классов были написаны на одном языке, если я буду использовать Pascal, а разрабатывать приложение в Delpy, смогу ли я достать свободно распространяемый небольшого объема компилятор, чтобы компилировать только пользовательские классы? Основное приложение уже будет скомпилировано. &lt;BR&gt;5. Учитывая, что скорее всего это все будет под KYLYX, те же вопросы и под Linux. &lt;/P&gt;&lt;P&gt;То есть в идеале я хочу иметь набор откомпилированных классов: &lt;BR&gt;Application, Documents, References, Document_Invoice:Documents, Document_Income:Documents, Reference_Goods:References &lt;BR&gt;Нужно их как-то объединить, чтобы можно было создавать любой из этих классов динамически и обращаться к свойствам и методов этих классов. &lt;/P&gt;&lt;P&gt;То бишь работа приложения начнется с создания класса Application. &lt;BR&gt;Метод Application:OnStart может выглядеть так &lt;/P&gt;&lt;P&gt;S=New Reference_Users; //Создаем класс справочника &lt;BR&gt;//Как вариант можно так &lt;BR&gt;//S=References.Create("Users"); &lt;BR&gt;//где References - глобальная переменная, хранящая экземпляр класса справочники, аналог Справочники 1С80 &lt;/P&gt;&lt;P&gt;R=S.SearchByName(This.CurrentUserName); //Ищем по наименованию &lt;BR&gt;//Если не найден, создаем справочник пользователя &lt;BR&gt;If R=Nothing Then &lt;BR&gt;   SO=S.CreateNew();   &lt;BR&gt;   SO.Name=This.CurrentUserName; //Даем этому справочнику имя пользователя. &lt;BR&gt;   SO.Save(); &lt;BR&gt;   S=SO.Link; &lt;BR&gt;EndIF &lt;BR&gt;This.Globals.Add("CurrentUser", S); //Запоминаем в параметрах сеанса текущего пользователя &lt;BR&gt;Желательно также, чтобы классы подгружались только по мере их создания. &lt;/P&gt;&lt;P&gt;Как видно в примере, используется язык без явной типизации (типо Visual Basic). &lt;BR&gt;Конечно если писать на Kylyx(Delphi) придется подумать, как это реализовать. &lt;/P&gt;&lt;P&gt;Если такая хрень с кодом возможна, то тогда разработка приложения будет достаточна проста. &lt;BR&gt;Достаточно объявить класс, сделать его от правильного наследника, откомпилировать - и вуаля! &lt;/P&gt;&lt;P&gt;Тогда форма справочника наследует от базовой формы Form, форма документа тоже от Form. &lt;BR&gt;Форма Form может привязывать к некоторому своему элементу управления Control данные. В Control содержится реквизит Data (аналог данные 1С). &lt;BR&gt;Form справочника умеет передавать данные из объекта справочника этому Control и т.п. &lt;BR&gt;</description><pubDate>Fri, 02 Mar 2007 20:42:20 GMT</pubDate><dc:creator>fixin</dc:creator></item></channel></rss>