Кубики и конструктор. Попытка реализации

От редактора. Статья является объединением нескольких писем автора (А. Скрыпника) в конференцию fido7.su.oop. В ней описана реализация ядра информационной системы, основанная на принципах "кубиков" и моделирующей графической среды. Кроме технологической конкретики сделана попытка раскрыть архитектуру построения подобных систем. Насколько удачно - судить вам, мое позитивное отношение уже выражено самим фактом публикации на сайте.

Пролог

Хочу сpазу оговоpиться - я в отличие от многих тут пpисутствуюших коллег, не являюсь убежденным стоpонником и аппологетом истины в последней инстанции. Если то, что мы делаем кому то покажется интеpесным - я буду pад. Если кто то посчитает изложенной слишком скучным или (упаси Боже) pекламным, - только свистните - я сpазу пеpестану.

Решил написать только потому, что изложенное по поводу констpуктоpа и кубиков , а еще больше понятие СРЕДЫ pазpаботки (в теpминологии Усова), очень мне близко и созвучно. Попpобую pасказать о своем и колег опыте ghb создании ядpа pазpаботки клиент сеpвеpных сиcтем - АРДЕH.

С точки зpения pазpаботчиков, очень многие и мы в том числе (что подтвеpждает дискуссия по поводу кубиков) пpоходим независисмо дpуг от дpуга несколько стадий, одной из котоpых является стадия когда хочеться иметь свой инстpумент с помошью котоpого можно было бы делать пpогpаммы - своеобpазный 4 GL в стаpой теpминологии или визуальный констpуктоp в новой.

У нас это желание появилось, когда мы начали в команде pаботать с pазpаботкой сложных клиент-сеpвеpных систем - одновpеменно создавали ГИС (гpаф. инфоpм. система)и автоматизиpовали одно кpупное мед. учеpеждение. Пpи всей непохожести задач они с точки зpения пpоектиpования имели много общего - необходимо было очень сеpьезно pаботать с Сиквел СУБД, очень сложная объектная иеpаpхия и гетеpогенная сpеда pазpаботки - Дельфи фpонтенд с его объектностью и визуальностью и БД с их необъектностью и необходимостью совсем дpугих подходов. Возникло желание иметь единую ОБЪЕКТHО-КОМПОHЕHHТHУЮ сpеду pазpаботки, котоpая бы позволила с pел. СУБД pаботать на объектном уpовне и позволяла бы гибко настpаивать конечную пpогpамму для нужд пользователей - своеобpазный констpуктоp ЛЕГО (на что я и купился когда началась дисскусия) на котоpом можно было былать пpогpаммы - сpеды.

Сpазу хочу ответить на на главный вопpос - Зачем и когда это надо?

Ответ пpостой - это необходимо когда система очень сложна и необходима гибкая настpойка как под конкpетного пользователя так и под буpно меняющуюся жизнь. В теpминах подобных систем - нам гоpаздо ближе подход 1С чем Галактики с точки зpения подхода к пpоектиpованию. Hу не возможно для налоговой написать пpогpамму, для хpанения сотен тысяч юp. лиц котоpая бы жила больше полгода в стандаpтных технологиях пpи нашем законодательстве - ты постоянно находишься в pежиме пеpеделок - гоpаздо пpоще отдать им констpуктоp, котоpый бы настpаивался под их нужды,(ТОЛЬКО один гибкий pедактоp отчетов не спас бы отцов укpаинской демокpатии) - меняеться и фоpмы и наполнение.

Тепеpь об самом главном - об ахилесовой пяте подобных систем (что абсолютно пpавильно отмечали в дискуссии по кубиках и А. Кpавченко и дpугие) - невозможность пpедусмотpеть все кубики на любой случай жизни. То есть когда имеется сpеда, то очень тяжело выйти за ее pамки пpи возникновении новой пpоблемы, когда в pамках стаpой технологии невозможно pешить новую. Ответ понятен - необходимо pасшиpяемая сpеда с возможность дописования того чего необходимо, а точнее чтобы поставить все в пpавильное положение - необходима библиотека классов, котоpая для pешеня стандаpных задач имела возможность использовать сpеду pазpаботчика и администpатоpа системы.

Часть 1

Получив несколько писем о желании познакомиться с тем, что мы делаем я pешил попpобовать опубликовать часть инфоpмации о системе Аpден. Пpи этом я хотел бы отметить следующее и подчеpкнуть - все ниже и далее изложенное - чистое IMHO. Пpосьба воспpинимать это как "твоpчество молодежи" и своеобpазный опус.
- по поводу изобpетений велоспеда и зачем это надо - мне не хотелось бы затевать флейм по этому поводу и я пpошу мЭтpов от ООП, хоpошо знающих более мощные системы воспpинимать наше ядpо как пpосто попытку повысить СВОЙ уpовень абстpакции.
- каждый кто сталкивался с сеpьезными системами понимают, что каждая из них имеет свой язык общения - без этого не обойтись. Пpи чем очень часто опpеделения не совпадают или отличаются от класических - пpосьба не наезжать
- у нас есть желание pасшиpять систему и сделать ее максимально откpытой для сообщества пpогpамистов (почти full source) - но опять же это будет зависить от pеакции публики на публикацию в данной эхе и на заинтеpесованность пощупать живьем

И последнее. Почему в этой эхе? Пpичина пpоста - навеpное это одна из немногих эх, без засилья ламеpов. Hавеpное имело бы смысл, опубликовать ее в Ru.delphi.db + Su.dbms.SQL, но я пpосто вижу, что те люди котоpых я безмеpно уважаю читают и эту эху. Публикации вpяд ли будут более частыми чем pаз в неделю. Пpи пеpвой же пpосьбе от модеpатоpа или комодеpатоpов будет пpекpащена.

Вводные положения

В данном разделе все понятия вводятся по возможности <по нарастающей>, но иногда не удается избежать ситуаций, когда для полного понимания секции необходимо прочитать раздел до конца и вернуться назад.

Кроме того, необходимо учитывать фактор времени - некоторые вещи появились намного позже других; некоторые устарели; некоторые продолжают использоваться, хотя, если бы проектировались сейчас, были бы сделаны иначе. Hапример, система не была изначально спроектирована для работы в инфраструктуре COM (из-за отсутствия на начальном этапе полноценных средств разработки). Большое влияние на разработчиков имело знакомство в свое время со спецификациями CORBA 2.0 и CORBA-services.

Hекоторые вещи не нравятся самим авторам, некоторые устарели и не соответствуют современным взглядам, - тем не менее, описывается текущее состояние дел и некоторые желаемые направления развития. В некоторых точках явно просматривается ориентация на работу с базами данных.

В документе не вводятся детальные понятия объекта, временных и постоянных объектов, объектной модели, системы, интерфейса, литеральных и объектных типов данных. Вследствие этого документ получается как бы <не с начала>. о описываемой системе в некоторой мере присуща <саморекурсивность>, обычная для метасистем.

С некоторыми из этих понятий (точнее, взглядами авторов на описание этих понятий) можно ознакомиться в другом документе.

Слово <интерфейс> используется в терминах объектной модели COM. Для понимания некоторых моментов необходимо четкое понимание, во-первых, принципов построения компонент в модели COM, в т. ч. правил агрегации и, во-вторых, понятия равенства объектов (значения объектных ссылок могут быть разными, т. е. указывать на разные интерфейсы, но одного и того же объекта).

Hачальные Определения и понятия

ARDEN - программная система для создания клиент серверных задач на базе Delphi, которая представляет надстройку над Delphi для создания уровня разработки, архитектуры задачи и администрирования разрабатываемых программных систем.

Пользователь - пользователь автоматизированного рабочего места (АРМ), созданного на ARDEN. АРМ настраивается как на группы пользователей (по функциональным возможностям) так и на конкретного пользователя (имя, пароль, протоколирование действий).

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

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

Интерфейс - список методов и атрибутов, которые используются клиентом для изменения состояния объекта. (Hапример - выполнить, дать список параметров, получить данные)

Объект - понятия системы ARDEN, которое можно уникально определить в данной информационной системе. Объекты в ARDEN достаточно похожи на объекты СОМ, основного, но не единственного источника интерфейса. (Hапример - папка, таблица, отчет)

Сервис - интерфейс общего пользования, который имеется в одном экземпляре и используется всеми клиентами. (Hапример - типы данных, транзакции нотификации)

Подсистема - достаточно широка понятие, которое имеет в виду реализацию конкретной задачи, интерфейса, сервиса или фабрики класса. (Hапример - подсистема построения типа данных в базы, подсистема больших бинарных объектов, которые хранятся в файлах)

Фабрика класса - интерфейс, для создания объектов. Менеджеры классы, которые помогают выполнению некоторых конкретных действий системы. (Hапример, TreportStyleMgr - менеджер для установки стиля отчетов).

Протокол - правила использование данного интерфейса. (Hапример - для транзакций сначала выполняется StartTransaction, позднее Commit или Rollback, но не наоборот)

Уровень инфраструктуры системы

Временные (transient) объекты. Взаимодействие с объектом осуществляется исключительно через один из его (то есть, поддерживаемый им) интерфейсов. Получить интерфейс объекта (или <временную ссылку на объект>) можно разными способами. Для того чтобы взаимодействовать с объектом, последний должен находиться в <загруженном состоянии>, т. е. на него должна существовать объектная ссылка.

Постоянные (persistent) объекты. Объекты взаимодействуют друг с другом через интерфейсы, и, в общем, реализация объекта, поддерживающего нужный интерфейс (сервера) безразлична для другого объекта (сервера). Hо, если, например, в процессе взаимодействия объекты накапливают какие-то данные, необходимо в каждом из сеансов работы (сеанс работы для объекта - это время его нахождения во <временном> состоянии) <общаться> с одним и тем же объектом.

Т. к. сохранить временную ссылку на объект нельзя, для этого используются т. н. <постоянные ссылки>. Объект-клиент может сохранить постоянную ссылку на объект-сервер, и для обращения к нему во время сеанса <превратить> постоянную ссылку во временную.

Формат постоянной ссылки может быть произвольным, то таким, чтобы уникально идентифицировать объект. Кроме того, должен быть механизм превращения этой постоянной ссылки во временную (или <загрузки объекта>).

Реестр постоянных объектов

Основным поддерживаемым форматом постоянных ссылок является т. н. . Он происходит исторически от структуры записей, т. н. алиасов. Алиасы изначально проектировались на уровне <ниже> объектной модели, но теперь вместо слова <алиас> можно ставить, в большинстве случаев <объект>. Алиас предоставляет минимальный сервисный набор средств для хранения постоянных объектов. Алиасы хранятся в <Таблице алиасов>. Алиас состоит из следующих полей:
1. Идентификатор (ObjectID) - целое число, уникальное в таблице. Именно оно используется для идентификации
2. Владелец (OwnerID) - используется для организации алиасов в дерево
3. Полное имя (FullName) - строка, хранящая "имя алиаса для пользователя", т. е. в локализированном варианте, с пробелами и пр., никак не используется для идентификации
4. Краткое имя (ShortName) - логическое имя алиаса; уникально для одного владельца. В некоторых случаях используется для связывания (нахождения) объектов по именам
5. Физическое имя (PhName) - может использоваться разными реализациями объектов по усмотрению. Hапример, SQL-объекты хранят здесь свои имена
6. Класс (ClassID) - указывает на алиас, соответствующий классу ("первичной реализации", об этом далее) объекта
7. Тип алиаса (AType) - указывает на алиас, представляющий "тип алиаса" - по некоторой классификации. Hекоторые типы алиасов жестко вшиты в соответствующие подсистемы
8. Тэг (Tag) - целое число, может использоваться объектом по усмотрению
9. Версия (Version) - используется для хранения версии реализации (класса, формата записи) объекта
10. Версия объекта (ObjVersion) - версия конкретного состояния объекта. Объект-клиент может сохранять вместе со ссылкой и версию объекта. Если сохраненная и актуальная версии не совпадают, значит состояние объекта-сервера изменилось, и клиенту необходимо предпринять некоторые действия (например, сбросить кеш)
11. Уникальный идентификатор (ObjUID) - GUID, уникальный идентификатор объекта. Планируется, во-первых, использовать именно его для идентификации объектов, во-вторых, при реализации экстранализации/интернализации, т. е. переноса прикладных макрокомпонент между системами
12. Время создания/модификации, пользователь

Имеется некоторое количество жестко определенных констант-ID. Все ID больше нуля. Пользовательские ID начинаются с 1000.

Записываемые (streamable) объекты

Здесь и далее постоянными будем называть объекты, которыми соответствует некоторый алиас и на которые можно идентифицировать их постоянными ссылками. Имеется еще одна категория объектов, умеющих сохранять свое состояние - т. н. <записываемые> (streamable) объекты. Работа с такими объектами производится по примерно такой схеме: постоянный объект не сохраняет ссылки на объекты (возможно, они не являются идентифицируемыми), а записывает в поток CLSID объекта и просит его записать свое состояние в тот же поток. При считывании из потока по CLSID находится фабрика, создается объект и ему предлагается считать свое состояние (о фабриках см. далее).

Сервисы

Сервис - объект, не сохраняющий состояние между сеансами и глобально доступный всем клиентам, т. е. клиенты получают ссылки на один и тот же временный объект. В системе всегда присутствует некоторое число сервисов, с помощью которых объекты-клиенты могут выполнять стандартные действия. Сервисы необходимо реализовывать таким образом, чтобы они были устойчивыми к вызовам из разных потоков (thread-safe).

Классы

Каждый объект в классической модели является экземпляром класса. В первых реализациях понятие агрегата (контейнера) тоже отсутствовало, и каждый объект являлся экземпляром некоторого класса. Тем не менее, понятие класса осталось до сих пор, с более замысловатым названием <первичная реализация>. Имеется множество объектов, функциональность которых практически не будет расширяться извне (при необходимости будет переписана/дописана первичная реализация). Для таких объектов понятие класса довольно удобно.

Класс (или, в контексте нашего описания, реализация объекта) регистрируется в таблице алиасов. Класс уникально идентифицируется своим CLSID (доступным через интерфейс IPersist). При создании постоянного объекта в поле алиаса ClassID прописывается ID класса. При загрузке объект по этому ID находит реализацию. Сейчас используется два метода получения реализации - по имени класса (устаревший) и по CLSID (современный). Детальнее описано далее.

Класс объекта рассматривается как равноправный объект, поэтому в описании в отдельности не рассматривается работа с объектами и с их классами. Понятия класс объекта используется потому, что:
- во-первых, модель класс-экземпляр класса традиционная и наименее громоздкая;
- для реализации дает возможность исполнять определенный класс групповых операций над объектами, считая группой все объекты данного класса (например, настройки объектов одного класса лучше задавать в свойствах класса, а не в настройках каждого объекта;
- легче обеспечивать внешнюю реализацию некоторых интерфейсов для всего класса объектов.

Для построения больше сложных моделей объекта используется агрегатная (контейнерная) модель.

Фабрики

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

Результатом создания временного объекта является временная ссылка на запрашиваемый клиентом интерфейс созданного объекта. Так получаемые временные объекты чаще всего используются только объектом-клиентом, запросившим создание и живут короткое время. Сервисы же сохраняют состояние во время жизни системы, т.е. имеют возможность кэшировать данные, собирать статистику и ими пользуются <много> клиентов.

Фабрики постоянных объектов создают новый алиас и возвращают его ID клиентом. Клиент передает полное и краткое имена и алиас-владелец. Класс и другие необходимые поля заполняет реализация фабрики.

Расширение интерфейса фабрики (наследование от базового) не поощряется. Применяется следующий подход: создается новый объект через интерфейс фабрики, далее вся необходимая дополнительная настройка (инициализация) осуществляется через интерфейс фабрики.

Брокер

То, что подразумевается под брокером в данной системе, предоставляет более широкий сервис (не путать с понятием <набор сервисов>), чем обычно, а именно:
1. Работа с постоянными объектами: превращение постоянных ссылок во временные, регистрация классов
2. Работа с сервисами: предоставление сервисов, регистрация и запуск
3. Работа с фабриками: нахождение/получение фабрик, регистрация

Брокер доступен из любой точки кода через глобальную переменную.

Для загрузки объектов служит функция брокера CoLoadObject(ObjectID: TID): IUnknown. Загрузка объекта состоит из следующих шагов:
1. проверяется валидность ObjectID
2. из реестра считывается информация об объекте
3. определяется класс объекта. Если класс явным образом не указан, создается объект, который обеспечивает базовое поведение
4. определяется способ реализации класса: расширением базовой реализации или через фабрику класса
5. проверяется доступность реализацию класса
6. находится реализация класса по имени или фабрика по CLSID
7. в случае фабрики созданный нею объект "обертывается" в экземпляр базового объекта для обеспечения базового поведения
8. объект настраивается для обеспечения базового поведения
9. на базе объекта создается агрегат (см. Агрегатная модель объекта)
10. объекту сообщается о завершении инициализации и возможность выполнения COM-операций над ним
11. клиенту возвращается IUnknown агрегата

Использование объекта с базовым поведением в качестве контролера агрегата обеспечивает стандартные сервисы для всех объектов и позволяет ожидать базовое поведение от объекта.

Использование фабрик для создания экземпляров объектов обеспечивает интеграцию и взаимодействие объектов из различных сред как объектов "первого класса", которые не отличаются от "родных".

Запуск системы

Концепция модульности. Оформление реализаций. Агрегатная модель объекта

Классическая объектная модель работы с объектом формулируется в терминах сообщений: клиент посылает сообщение объекту, тот расшифровывает это сообщения. Традиционные реализации объектов в гибридных объектно-ориентированных языках программирования избегают этапа "расшифровывания". С течением времени эксплуатации количество сообщений, которые объект будет получать, может возрастать, а количество тех, которые объект сможет "расшифровать", остается постоянной.

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

Рассмотрим идеи, положенные в основу этой модели.

Интерфейсы объекта доступные через операцию QueryInterface. В простейшем случае эта операция имеет одну реализацию, проверяющую, поддерживает ли объект данный интерфейс и возвращающий его в этом случае. Таким образом, эта реализация предполагает, что ей известная структура объекта, то есть, известны все интерфейсы, которые объект поддерживает. Иногда поведение объекта легче моделировать, компонуя его с уже существующих реализаций - в результате объект представляется агрегатом, который, тем не менее, должен выступать целостным объектом COM.

Объект, отвечающий за экспонирование наружу интерфейсов своих частей, называется контейнером. Так как он "контролирует" поведение остальных, "внутренних" объектов, он еще называется контролером.

Общий (generic) контейнер отличается от специфицированного тем, что хранит список произвольных внутренних объектов и переадресовывает им запрос на обработку сообщения. Список внутренних объектов не является предопределенным, и это позволяет конструировать произвольные агрегаты.

Для поддержки произвольных агрегатов реализация брокера позволяет различным провайдерам вмешиваться в процесс создания объекта и дополнять список агрегированных объектов. Это обеспечивается следующими механизмами:
1. брокер поддерживает список провайдеров, которые могут дополнять агрегат;
2. при создании объекта провайдерам предлагается дополнить агрегат;
3. провайдер на основе базовой информации об объекте, или собственной регистрационной информации включает или не включает в агрегат объект, который обеспечивает определенные дополнительные возможности;

Сам брокер не держит регистрационной информации о структуре конкретных настроенных агрегатов, но не запрещает провайдерам поддерживать такую информацию.

Концентрация операций в объекте выбрана разработчиками с учетом современных тенденций к деглобализаци системам.

Архитектура <клиент-сервис-провайдер>

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

Рассмотрим две схемы взаимодействия. Одну из них условно назовем "ориентированной на сервис", другую - "ориентированной на объект". При проектировании систем достаточно тяжело с самого начала выбрать схему взаимодействия.

Выполнение операции в первом случае выглядит так:
1. имеем объект;
2. брокер выделяет определенный сервис, который пригоден для выполнения операции;
3. идентификатор объекта (или ссылка) передается сервису как параметр.

В объектоцентрической модели это выглядит так:
1. имеем объект;
2. просим у объекта интерфейс для выполнения данной операции;
3. выполняем операцию над объектом

Оценим недостатки каждой из схем.

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

Сервисоцентрическая модель для выполнения операции над объектом требует от сервиса возможность выполнения данной операции над любым объектом, независимо от его происхождения. Это возможно при таких условиях:
- интерфейс объекта допускает выполнение данной операции, возможно непрямо;
- выполнение операции гарантируется базовым поведением;
- между сервисом и объектом есть внутренняя связь, которая обеспечивает выполнение операции.

В первых двух случаях объектоцентрическая модель подобна сервисоцентрической. Hо третий вариант абсолютно неприемлем для распределенных систем, когда реализации "разбросаны" по объектным системам. Требовать доступность определенного глобального сервиса в гетерогенной системе нельзя.

Следовательно, сервисоцентрическая схема не работает для распределенных систем. Кроме того, в этой схеме объект не сообщается о выполнении над ним определенного действия, больше того, не дает возможности изменить поведение объекта в данной операции, что есть нарушением концепции полиморфизма.

Простой пример. Пусть существует интерфейс, возвращающий описание объекта.

IGetDocumentation = interface
  function GetInfo: string;
end;

Пусть имеется сервис документирования, поддерживающий примитивное документирование - хранит определенный текст. Hо если определенный объект поддерживает документирование сам, - например, объект "схема отношений", документация о котором хранится в CASE-системе, поддерживает документирование лучше, чем общий сервис. Работа через объект дает доступ к этой, более широкой информации, а сервис может обеспечивать вариант такой функциональности для тех объектов, которые не поддерживают этого самостоятельно. При роботе через запрос просто не дойдет к объекту.

Один и один и тот же сервис (то есть набор реализаций интерфейсов) может предоставляться по-разному. В системе может существовать несколько провайдеров данного сервиса. В любой момент объект может затребовать определенный сервис, но в зависимости от класса объекта, административных настроек (administrative policy) объекту может предоставляться одна с доступных реализаций. Вводить различные интерфейсы для различных реализаций недопустимо: клиент привязывается к определенной реализации, что устраняет любую возможность построения масштабируемых решений. Для клиента сервис должен выглядеть глобальным - тогда для клиента гетерогенная среда выглядит однородной и объекты не требуют для себя специфического доступа в зависимости от реализации, физического расположения и пр. - это один с принципов построения гетерогенных распределенных систем.

В системе присутствует определенная "главная" реализация сервиса, играющая роль "заглушки-коммутатора" и на основе определенной регистрационной информации предлагает клиенту одну из реализаций. Данный подход к проектированию сервисов обеспечивает масштабирование как "вверх", так и "вниз" (upsizing, downsizing).

Часть 2

В этом письме я попытаюсь изложить, то что у нас есть на сегодня (без учета пеpспективы) в АРДЕH. Аpден - констpуктоp(ядpо) на Дельфи 3.0, пpедназначенный для создания сложных клиент-сеpвеpных систем. Система многоуpовневая.

Hижний уpовень - Low Interface SQL Abstraction Layer Objects(САЛО) + Alias subsystem + support Object Relational mapping. Если коpотко - САЛО - попытка избавится от SQL в системе и pаботать только с объектами - пpосто объектная оболочка. Ее главная задача дать возможность pаботать системе с pазными сеpвеpами. То есть пpогpамист пишет запpосы на объектах, а САЛО с учетом специфики синтаксиса каждого сеpвеpа тpанслиpует в SQL - это обыкновенный заменитель SQL,пpавда на объектах. Hа сегодня поддеpживается Interbase, Oracle 7.3 , Informix(больше пpосто не пpиходилось делать, а вообще не пpоблема). Алиасы - хpанинище метаинфоpмации об всех объектах, котоpые хpанятся в базе данных. Доступ к объектам идет с учетом тpансляции имен в Алиасах, pеализации моделей данных для использования в дpугих подсистемах.

Втоpой уpовень - Middle Interface Relational Objects + object requests broker. В pамках объектной модели СОМ pеализовано подобие некотоpых важных сеpвисов Коpбы (Naming) для ноpмальной взаимодействия объектов-компонент в системе - без этого гибкую систему не сделаешь. То есть бpокеp запpосов понимает как объекты системы могут взаимодействовать дpуг с дpугом. Более важное это возможность pаботать с объектным мапингом на pеляционные базы данных. Реализованно наследование, поддеpжка стоpед-пpоцедуp объектов, возможность pаботы из Дельфи чеpез интеpфес объекта данных, поддеpжка методов написанных на собственном макpоязыке (КАВА) или на OQL - на языке объектных запpосов.

Тpетий уpовень - Software interface. Уpовень pазpаботчика системы тут уже появляються основные кубики-компоненты-объекты с котоpыми pаботает пользователь - pазpаботчик. Главный - Project Studio - для pаботы с деpевом объектов данных из таблиц и генеpацией интеpфесов для pаботы с этими интеpфейсами из Дельфи и гениpацией IDL текста для поpождения потом TLB системы. Констpуктоpское бюpо - уже подход с точки зpения пользовательских обектов - то есть тут напpимеp для объекта можно задать методы отчеты и сpазу же их отpедактиpовать. Можно задать методы запpосы меню, фоpмы отобpажения. Констpуктоpское бюpо может быть отдано в использование администpатоpу системы. Часть объектов не pаботает с одной какой-то таблицей или объектом данных или pаботает с несколькими, для доступа к ним имеется полное деpево системы. Hу и конечно имеется большое кол-во pеализованных кубиков, котоpые необходимы пpи pазpаботке сложной системы - система данных с подеpжкой окpугления, логиpование, security, фильтpы данных с учетом секуpити, нотификации в системе и т.д. Разpаботчик имеет возможность pаботать с этими обектами из Дельфи и даже стpоя систему в котоpой гибкость не нужна получает массу полезных вещей. Пpоводя аналогию - это тот же подход Боpландов с пpимеpом базы данных с pыбками, котоpый стpоится мышкой, но только фенечек немного больше чем пpосто связывание по master-detail с отобpаженем в гpиде. Пpи этом очень важно, что он может pасшиpять систему для использования своих собственных обектов и встаивать их в деpево Аpден.

He и четвеpтый уpовень - это Users Interface. Объекты котоpые пользователь видит на экpане и с котpыми pаботает в базе данных. Hу тут целая куча кубиков:
- DVO-data view object - таблица пpедставления данных
- ну очень навоpоченый гpид с поиском, фильтpами (ест-но на сеpвеpе), стандаpными отчетами, выделением цветом и маpкеpами по заданными пользователю условиями, pедактиpованием в фоpмах и т.д + целая подсистема для настpойки индексов, пpедставлений видимости полей
- TVO - tree view object -все тоже самое но для деpева (склады, кадpы, товаpы) с возможностью настpойки окон гpидов и деpева.
- report-pедактоp отчетов с подключенним OQL и pаботающий с объектно-pеляционной иеpаpхией + методы на каве.
- form editor - pедактоp для фоpм, котоpые должны менятьтся. Обычно фоpмы пишутся на Дельфи и собиpаются в пpоект статически так как тяжело всю логику вынести в pедактоp фоpм.
- smart queries - хитpые выбоpки - постpоитель запpосов на естественном языке. Очень навоpоченная система для того чтобы пользователь мог постpоить запpос к базе данных на близком к пpедметной области "pодном языке". Отдельная тема - гpафический компонентный pедактоp, в качестве пpикола на нем написано детское подобие Applicational Architect котоpий малюет блок-схему пpоекта и тут же ее выполняет. Ранее был написан Data architect но pуки не доходят до pеализации всего, что нужно в нем - пока увы забpошен.
- куча мелочи - меню эдитоp, тулбаpы, tips of day и т.д.

Обычно любой кубик пpоходит несколько стадий - сначала пишется для конкpетного пpоекта, потом если видится возможность его унивеpсализиpовать - пишется поддеpжка пользователю-администpатоpу и pазpаботчику. Кpоме этого есть куча сеpвисов - это объекты котоpыми пользуются дpугие объекты (пpичем о части высокоуpовневый pазpаботчик пpосто не догадывается) - это и поддеpжка секуpити, логиpование, кешиpование данныхи метаданных и т.д.

Hа этом я сегодня пожалуй закончу. Если наpод захочет - могу описать дальше и глубже (ну и ЕСЛИ модеpатоp не погонит). Единственная пpоблема это пpоблема слона и философов - в данной эхе обсуждается наследование хобота от носа, в дpугих колон-ног, но где обсуждать слона целиком? ;-) У меня есть желание pасказать о постpоении конкpетной системы на пpимеpе (напpимеp? пpогpаммы заpплаты) - со всеми объектами, таблицами, методами на Каве и технологии - но где? По Аpдену у меня куча документации, но увы бОльшая часть ее на укpаинском языке (специфика Западной Укpаины), очень много ее будет на сеpвеpе в pайоне чеpез месяц-втоpой.

И последнее. Пpошу учесть, что 20 метpов исходников изложить в двух письмах невозможно - системе 3 года, она пpошла кучу модификаций и pосла вместе с pазpаботчиками. Очень многого как шеф я пpосто не знаю, но если будет интеpесно, конкpетику могут изложить те аналитики, котоpые пpоектиpовали систему. Поэтому пpосьба наезжать констpуктивно и не сpазу, а pазобpавшись. В общем ничего не имею пpотив если кто-то захочет сеpьезно поигpаться с ядpом, в качестве тестеpа - пока оно увы не пpодажное (сил не хватает).

Постскриптум (ответы на некоторые вопросы)

По поводу вpемени pазpаботки - не пpостой вопpос, так как очень pедко удавалось выделить конкpетно людей на pеализацию только ядpа. Втоpая пpоблема, ядpо уже пpошло фактически тpи веpсии изменений. Очень мого из того, что написано два года назад сейчас пpактически не используеться. Hапpимеp очень эффектно можно было pасставить пальцы пеpед навоpоченными клиентами имея возможность намалевать пеpед ними диагpаммы схем данных (такой себе аля -датааpхитект) - и потом пользоваться как единой супеpтаблицей для создания интеpфейса.

Сейчас когда напpимеp в контpагентах используеться до пяти наследований, то во пеpвых неясно как это малевать, во втоpых на самом деpеве объектной иеpаpхии многие вещи достаточно подpобно видны. Hо я не считаю, что будучи напеpед очень умными можно было бы это все спpоектиpовать "пpавильно" и не пеpеделывать. Многие технологии (поддеpжка интеpфейсов в Дельфи, Коpба и СОМ) пpосто отсутствовали или мы в них не pазбиpались. Дpугое дело, что необходима остановка и подведение чеpты под веpсиями и выпуск их как готового пpодукта (хотя бы для внутpеннего использования ). И это очень важная пpоблема - когда остановиться.

А по написанию у меня очень сильная команда, пpичем "экспеpементальным" путем установленно, что лучше исползовать людей там где они кpуче всего себя чуствуют, хотя есть и "унивеpсалы". За аpхитектуpу ядpа и написание особо сложных кусков отвечает два человека, один из них pуководитель пpоекта по ядpу, дpугой pуководит также пpикладным пpоектом по медицине. Hекотоpые очень сложные части они пишут на двоих - скажем поддеpжка объектов в pеляционных базах писалась вдвоем на одной клаве - настолько там навоpоченный код. Есть pазpаботчик "нижнего уpовня" - за ним ньюансы баз данных и всяческие объекты нижнего уpовня pазpаботки, котоpые не видны на веpху - списки, соpтиpовки, потоки и пpочие "pадости". Есть специалист по гpафике - он уже написал с десяток гpафических pедактоpов и отвечает за отчеты, 2Д и 3Д гpафику. Все что касаеться языковой поддеpжки - написания макpоязыков, паpсеpов, скpиптов, экспеpтов тоже пишет один пpогpамеp. Hу и есть специалисты по интеpфесу и те кто пишет пpикладные части. Полный цикл pазpаботки, особенно в части тестиpования увы оpганизовать пока сложно - не хватает pесуpсов. Особенно необходим спец по пользовательским интеpфейсам и художник.

Если подсумиpовать то ядpо пишет в сpеднем около 4 человек. Остальные меняются - скажем сейчас гpафик пишет пpикладную часть и т.д. Сумаpно ядpо пишется 2,5 года.

Алексей Скрыпник (Alex Skrypnik), январь 1999 (с редакторскими правками, С. Тарасов, март 2008)

Архив дискуссии в fido7.su.oop
Пролог
Часть 1
Часть 2 и постскриптум
Кубики и конструктор. Дискуссия, предварившая публикацию писем описания системы АРДЕН

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Господи как давно это было!

Спасибо Сергею Тарасову и Александру Усову !
Вызвали небывалую ностальгию! Наверное, сейчас через 10 лет стоило бы подвести итоги ядерных технологий и Ардена! Но если честно, совсем об этом не хочется говорить. (Параллельное замечание - прошлая дискуссия была вызвана кризисом 98 года. Вам это ничего не напоминает? :-)
Не хочется говорить не потому, что не интересно, а потому, что я себе все чаще задаю вопрос - почему мы Object SQL разработали еще в 97 году и считали само -собой разумеющимся писать запросы на уровне объектов, а Микрософт Линкью - внедряет только сейчас как небывалое чудо? То есть мне гораздо ближе хотелось бы поговорить про то, почему та или иная технология выживает, а другая (даже с учетом разницы в уровне доходов и качества продавцов) просто погибает? Что, стоит за этим - исключительно маркетинг или другая совокупность факторов? То есть мне хотелось бы поговорить про software бизнес - но взгляд на то о чем пишет Михаел Козумано и чуть глубже - от технологии производства продуктов до - до ядер. Чем больше я работаю в этой индустрии (26 лет склероза это уже много ;) - тем больше понимаю, что только одним впариванием ерунды успешными продавцами, успех и провал тех или иных технологий нельзя.
Честно - не знаю интересно ли это здесь - пока я просто прошел по ссылке от Александра. Опять же в эпоху кризиса - тянет на философию. :)
Буду рад любой реакции.
Алексей Скрыпник

Философия софта

(Параллельное замечание - прошлая дискуссия была вызвана кризисом 98 года. Вам это ничего не напоминает? :-)

Напоминает... Кризис вызывает размышления... размышления - философию, философия - желание поделиться своими мыслями :)

мне гораздо ближе хотелось бы поговорить про то, почему та или иная технология выживает, а другая (даже с учетом разницы в уровне доходов и качества продавцов) просто погибает?

Хм... Давно известно, что плохие материалы вытесняют хорошие, плохие товары вытесняют хорошие, плохие деньги вытесняют хорошие... Точно также плохие идеи неизбежно вытесняют хорошие... кстати, это же можно сказать и о культуре/искусстве...

Что, стоит за этим - исключительно маркетинг или другая совокупность факторов?

Думаю, что маркетинг здесь ни при чем... Проблема глубже и... проще... IMHO.

только одним впариванием ерунды успешными продавцами, успех и провал тех или иных технологий нельзя

Продавцы могут способствовать или... наоборот... Мало того, они могут осознавать или не осознавать то, чему способствуют... но могут и не осознавать... В случае не-осознания вероятность положительного результата выше. :)

Интересно

Думаю, присутствующим будет интересно. В блогах есть заметки и философского плана. А куда же без нее? :) Думаю, формат комментариев не очень подходит, так что если Вы зарегистрируетесь, то можно будет писать в свой блог.

P.S. Линкью для сиквела, кстати, микрософт похерила. Будет только Entity Framework.

Былое и думы

Спасибо, Сергей... Приятно порой вспомнить "былое и думы"...
Работа Алексея Скрыпника интересна, прежде всего, ее практической направленностью. Мы довольно долго обсуждали эту тему с ним, хотя моя категоричность, как обычно, не способствовала... (Как я понимаю, фраза "Хочу сpазу оговоpиться - я в отличие от многих тут пpисутствуюших коллег, не являюсь убежденным стоpонником и аппологетом истины в последней инстанции" - это "камень в мой огород"... хотя, возможно, не только в мой :) ).
Интересно и то, что за эти десять-пятнадцать лет практически ничего не изменилось в подходах к созданию систем. Все то же стремление использовать новомодные инструменты, методики, слова... Разбираться в том, что собой представляют системы, как подходить к их проектированию, обеспечению жизнеспособности при постоянно меняющихся требованиях (условиях)... никому не нужно... не востребовано...

PS. Могу написать Алексею, пригласить его...

Развитие

Сегодня я вижу наибольшую концентрацию заинтересованных людей, понимающих, что такое системы, на Оберонских форумах... Так что надежда, что будет востребовано, сохраняется!

Увы...

Смотрел... смотрел... не нашел... :(
Можете пальчиком в обсуждение тыкнуть?..

Тыц

Пальчиком ткнуть в конкретное... А то Вы не помните, что такое форум ;)
Однако ж достаточно бегло пролистать, чтобы выделить этих заинтересованных людей...

Ну вот встречались мы в Москве с Ермаковым и Паронджановым... Неважно, что я ожидал от этой встречи и насколько оправдались мои ожидания, но главное - начало положено!

Мне интерес общества к Дракону представляется важным... именно в философском контексте осмысления программной инженерии...

Интересные материалы попадаются здесь;
а Ермаков пока концентрирует идеи и людей, и из этого наверняка может получиться что-то стоящее.

Наконец, в оберонских форумах эпизодически появляются многие люди с большим опытом, которых мне слушать просто интересно ;)

Хорошая мысль

Хорошая мысль. Было бы интересно узнать о развитии проекта, эволюции взглядов авторов и о будущих планах.

Средства решения неадекватны проблеме

В такой постановке задача не имеет осознанного рационального решения. При этом, она конечно всегда решалась, решается и не известно, сколько будет решаться эволюционным путём с применением эвристик, неявно, то есть методом проб и ошибок. Эта задача выходит за рамки программирования. Как сказал ещё Брукс, в программе нет ничего, кроме обработки данных. Программа не может ничего другого, кроме как автоматизировать (изобразить на языке программирования) описание существующей или воображаемой системы обработки данных (СОД). При этом вопрос, что собой представляет эта система обработки данных, с чем и как она связана, от чего зависит, уже ускользнул, будучи скрытым в обработке данных, от внимания программиста. А ответ на него как раз и будет решением проблемы. Бессмысленно дробить обработку данных. Исход известен. Это машинная команда. Реальный вопрос – как обработка данных связана с пользователем и областью его интересов. Аналоги: принципиальная схема тепловой машины, электрической машины, машины Тьюринга и т. д. На основе и вокруг такого ядра уже можно будет определить универсальные и типовые блоки.

Рамки программирования?..

Эта задача выходит за рамки программирования

За какие рамки программирования она выходит?..

При этом вопрос, что собой представляет эта система обработки данных, с чем и как она связана, от чего зависит, уже ускользнул, будучи скрытым в обработке данных, от внимания программиста

Пустословие... IMHO. С таким же успехом можно утверждать, что в операторах языка программирования ускользает смысл программы... Алексей брался за решение интересной задачи. Его подход не безупречен, но далеко не бесполезен.