BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
УРОК 5 Теория объектов MetaBo, Задача: понять их суть и назначение
 
1. Введение.
Для создания решений в новых окнах разработчики БЭСТа создали класс MetaBO. Изначально при создании тем-уроков я планировал рассматривать создание решений двумя путями – с применением объектов и без них, чтобы попытаться показать путем сравнения удобство их применения. В процессе более тщательного изучения предмета моя точка зрения изменилась и поэтому целью данной темы является задача разъяснить суть объектов MetaBO и необходимость их применения. Иными словами все дальнейшие темы будут освещаться с применением возможностей MetaBO, а другие пути решения будут оставлены для самостоятельных экспериментов.
Попытаюсь ниже почему и зачем я предлагаю именно такой путь изучения программирования. Для начала отвечу на простые Вопросы.
- Можно ли при программировании в новых окнах добиться цели без применения объектов MetaBo ?
- Да, можно
- Существуют у объектов MetaBO недостатки ?
- Да, существуют
- Стиль создания решений с MetaBO обязателен для программ в БЭСТе ?
- Он не обязателен – он рекомендуем
 
2. Структурное программирование и объектная парадигма .

Рассмотрим задачу – изменить значение поля FIELD1 ( новое значение – “Привет”) таблицы TABLE1 у записи с № 10.

Решение (структурное программирование XBase++):

1 DbSelect(0)
2 DbUse(“TABLE1”)
3 DbGoTo(10)
4 DbRLock()
5 DbPutField(“FIELD1”,”Привет”)
6 DbRUnlock()
7 DbCloseArea()

Решение 2: (структурное программирование XBase++)

1 Local cAlias := Alias()
2 DbUse(“TABLE1” , cAlias)
3 (cAlias )->(DbGoTo(10))
4 (cAlias )->(DbRLock())
5 (cAlias )->(DbPutField(“FIELD1”,”Привет”))
6 (cAlias )->(DbRUnlock())
7 (cAlias )->(DbCloseArea())

Решение 3: ( классовый подход БЭСТ5)

1 Local x := new DbTable(“Table1”)
2 x:Goto(10)
3 x:PutField(“Field1”,”Привет”)
4 x:Close()

Объектная парадигма, а затем и целая плеяда ОО Языков, реализующих ее, возникли не случайно. “Все что существует – необходимо” (Гегель). Наследование, инкапсуляция, полиморфизм – вот основные идеи ООП. Какие задачи призваны решать эти идеи. Когда Ваш проект состоит из сотен строк кода, то я думаю принципиальной разницы между структурным программированием и ООП – нет. А вот когда проект разрабатывает бригада, состоящая из нескольких десятков разработчиков – проект “стремится” выйти из под контроля, структурные подходы значительно проигрывают.

Инкапсуляция.
Основное назначение инкапсуляции – сокращение числа ошибок и периода тестирования. Если не играться в дефиниции, то инкапсуляцию можно определить как способ объединения данных и методов, обрабатывающих эти данные в одном месте (классе). В нашем примере (3) метод PutField класса DbTable реализует блокировку таблицы, модификацию данных и снятие блокировки. Использование класса дает нам не столько сокращение числа строк в проекте, сколько избавляет нас от человеческой забывчивости (обычно – забывают не только блокировать, но и снимать блокировки). Думаю, вполне очевидно, что когда речь идет о сотнях тысяч строк кода выигрыш будет весьма ощутим. Инкапсуляция, как впрочем ООП в целом призвана скрыть от пользователя (программиста, использующего класс) тонкости реализации.
Пример из жизни. В процессе использование класса DbTable прикладные программисты (пользователи класса DbTable) предложили реализовать возможность использовать SQL SEL ECT предложения. Они хотели писать примерно так:

Local x := CreateDbTable( ;
“SEL ECT Code,Left(Name,20) AS NAME FR OM TABLE1 WHERE NAME LIKE “%ПРИВЕТ%”);

Сейчас так можно писать в БЭСТ5. Вся дальнейшая работа с экземплярами (объектами) класса DbTable не изменилась. x:PutField(“FIELD1”,”Привет”) .

Более того, можно писать и так x:Field1 := “Привет”. Но это уже нюансы.

Полиморфизм.
Рассматривать идею полиморфизма в не строго типизированных языках нет смысла, поэтому мы пропустим этот Вопрос. Если будет особая необходимость рассмотрим дополнительно.

Наследование.
Наиболее прозрачная Идея. Класс MetaBO наследуется от класса DbTable и инкапсулирует DbTable. Но если класс DbTable призван реализовать и скрыть реализацию всех правил работы с отдельной таблицей, или выборкой на основе SQL запроса, то класс MetaBO призван реализовать самые абстрактные идеи бизнес логики, а точнее правила работы с несколькими таблицами, которые хранят одну бизнес сущность.
Примером может выступать любой, более-менее сложный документ – накладная, карточка и т.д. Наследуясь от класса MetaBO, можно порождать конкретные бизнес сущности и использовать их в самых разных подсистемах БЭСТ5. Так к примеру подсистема Счета Фактуры использует классы подсистем Главная книга (типовые проводки), Общие справочники (классы Партнеры, Подразделения и т.д.). При этом разработчики подсистемы Счета Фактуры не должны знать тонкости реализации классов из других подсистем.

Любая задача программирования может быть решена и с использованием ОПП и структурным методом. Любая! Программирование - было, есть и будет еще очень долго искусством. Если мы сели писать программу – значит у нас есть новая проблема. Новая – не решавшаяся ранее. Способ решения всегда несколько. Единственные наручники, которые можно надеть на разработчика – это единство концепции проекта. Если уж мы используем DbUse ( или x:Use ) то лучше это делать всюду и всеми.

Вот примет: (реализация С++)
EXPORT VMAPI DBUSE()
{
// работа с таблицами DBF
DBFWorkArea *rs = new DBFWorkArea();

}
Или

EXPORT VMAPI DBUSE()
{
// работа с базой MSQ SQL Server
MSSQLRecordSet *rs = new MSSQLRecordSet();
Rs->Open(“SEL ECT * FROM MAIN” , “SQLSERVER:MyServer;DataBase=master;”)

}
 
3. Теория применения MetaBo в БЭСТ-5
Для начала рассмотрим простую задачу.
Допустим мы создаем решение по работе с документами, которые состоят из шапки, строк и дополнительной таблицы к каждой строке. Назовем ее аналитикой строк.
Рассмотрим задачу удаления документа:
- Стиль БЭСТ-4+
Мы по индексному ключу обращаемся к таблицам, делаем поиски интересующих строк и их удаляем
- Объект MetaBO
Мы удаляем документ и вместе с ним удаляются все нужные строки.
Итак, что получается нам дает объект.
Получается, что мы работаем со всеми таблицами документа одновременно, как с неразрывным целым. Т.е. мы можем рассматривать все строки текущего реестра (В дальнейшем буду писать «Грида») и их дочерние строки (в дальнейшем буду писать «чайлды») как одно единое целое и при работе со строкой конкретного документа я на самом деле работаю не только с его заголовочной частью, а со всем документом.
Итак, если говорить коротко объекты MetaBO нам позволяют:
- при работе в форме грида одной таблицы обеспечивать одновременную работу в этом же гриде с другими таблицами
- объект позволяет при выполнении событий (например, создание, редактирование, удаление) осуществлять контроль их выполнения сразу в нескольких таблицах
- с помощью объекта в гриде легко организовывать столбцы, значения в которых являются результатом расчета из других столбцов
Применение в форме объектов MetaBO предоставляет нам механизм одновременного использования событий к нескольким таблицам или полям, отображаемым в шапке или подвале грида.
Исходя из сказанного выше, становится понятно, что сами события, такие как ввод, удаление, сортировка являются свойствами объекта. Таким образом, в случае использования MetaBO ,например, при удалении строки – событие выполняется в соответствии с тем как оно описано в классе, а стало быть во всех гридах БЭСТа будет выполняться именно по правилам, установленным разработчиком. Изменения в штатном механизме событий разработчиком будут унаследованы во всех созданных плагинах пользователем.
Отсюда основным минусом объектов является отсутствие многообразия свойств, если сравнивать с гридом в общеизвестных системах программирования. Т.е. разработчик сделал основные возможности, которые имеют применение в БЭСТе. Дополнительные возможности предстоит дорабатывать по мере появления такой необходимости
 
4. Принцип организации чайлдов.
Рассмотрим 2 таблицы: грид документов и грид строк конкретного документа. Второй грид является расширением информации применительно к строкам первого. Таким образом по отношению к первому гриду он является дочерним или другими словами чайлдом.
В каждом гриде создается объект MetaBO. Между ними устанавливается связь и таким образом образуется чайлд. В решении может быть созадана многоуровневая цепочка чайлдов. Но наиболее распространена на практике двухуровневая схема. Поэтому именно такая схема является наиболее оттестированной. Тем не менее, в своих собственных плагинах есть практика применения многоуровневых цепочек. Решения рабочие. Но в процессе их создания была обнаружена ошибка, которая была передана на исправление.
В случае выхода на какие-либо ошибки в подобных решениях мы будем очень благодарны за подробное описание выхода на ошибку и она будет устранена.
 
На самом деле можно много говорить и рассуждать на эту тему.
Но дальнейшее изучение и понимание MetaBo будем оусществлять посредством решения практических примеров.
Предлагаю немного ознакомиться с материалом, задать Вопросы, если они есть и перейдем к продолжению работы с задачей из урока 4 с применением объектов MetaBO
Страницы: 1
Читают тему (гостей: 1)