===[ Программизм ]=== #post-id: 6632-03-53 #original-date: 22.09.2018 Sat #original-time: 3:53 AM #original-day: 6632 #original-host: WinXP Home SP3 (Build 2600) Была программа, которая делала некую задачу. Код задачи был прямо в модуле формы, даже запуск через командную строку выполнялся загрузкой формы без её показа и «нажатием» кнопки «Выполнить». Потом я решила доработать код этой задачи. Дорабатывала на VBScript, фактически переписала с нуля. Получился набор модулей со своей истемой настроек (переменные и константы) и прочего. Думала потом вкорячить это в программу, вписав настройки в настройки программы. Потом забросила это дело из-за нехватка времени и желания, а через некоторое время ради прикола портировала на Руби. Тоесть взяла все исходники, переименовала файлы и начала расставлять и исправлять лючевые слова. Потом вносила некоторые правки, при чём параллельно внедряла их. Оказалось, что код на Руби может пригодиться в совершенно другой области, где VBScript не работает. Получилась библиотека. Код на VBScript портировала на VB6 и VBA – оказалось, что не достаточно только расставить типы переменных, некоторые моменты работают в одном диалекте и не работают в другом. Но к счастью изменений было буквально на пару костылей в отдельных модулях, чтобы сновной код был одинаковым. Наконец, недавно я занялась основной программой. Поскольку некая задача выполнялась теперь более интересно, пришлось переписать интерфейс, в главном окне оставить только главные параметры, а все галочки, которые меняются раз в пятилетку – в отдельные диалоги спрятать. Так как весь код задачи уже заизолирован в отдельных модулях, само собой случилось разделение интерфейса и этого кода. Таким образом, программа грузит настройки в переменные, интерфейс показывает их и позволяет менять, а при вызове кода библиотеки, программа устанавливает тамошние переменные, транслируя свои настройки в настройки библиотеки. Я попыталась сделать так, что бы оно более-менее соответствовало по конкретным значениям, но всёже не стремилась к полному соответствию. Когда интерфейсная часть была готова, я начала пытаться ввести модули библиотеки в проект. И тут оказалось, что модули между собой хорошо общаются, но программе этого видеть не нужно – мало ли какие конфликты будут. Поскольку VB6 не поддерживает неймспейсов и тому подобного (когда использовала код на Руби, такой проблемы не было), решила идти ва-банк и вынесла код библиотеки в COM компонент. Ну, чтобы ещё где использовать. Но и тут не всё так просто. Для COM нам нужен класс, который и будет интерфейсом всего этого дела, а это дело уже в модулях живёт. Со своими настройками. Пришлось делать класс, который напрямую вызывает нужные функции модулей, а так же свои настройки и имена константы для этих настроек. Тут, конечно, соответствие уже было полным, но имена разные. В итоге у меня получается трансляция трансляции: интерфейс инициализирует свои переменные с настройками и вызывает свойства и методы класса для настройки и запуска задачи. Класс транслирует всё это в настройки библиотеки и вызывает её функции. А библиотека уже выполняет задачу. Не, я понимаю, что это нужно как-то по-другому переписать, чтобы не было таких передач передач, но с другой стороны всё равно будет нюансы. Допустим, код задачи оперирует параметром Width, который принимает значения от 0 до 10. Сначала основная программа грузит настройки из реестра, валидирует этот параметр и записывает в свою переменную. Потом программа записывает эту переменную в свойство объекта библиотеки, а то снова валидирует это значение и сохраняет уже внутрях самой библиотеки. Ну а потом происходит вызов. Двойная валидация, плюс если условия в библиотеке изменятся (например, приниматься будет значение от 5 до 15), то основная программа потребует модификации. Какой-то программный МММ ^^' А может быть я просто сильно заморачиваюсь деталями.