470 likes | 681 Views
2. План. Поймай меня, если сможешь Погружение в Architect Полный .NET. Отлов ошибок. С новыми возможностями ABL сейчас вы можете поймать и обработать практически любую ошибку!. Как это было…. DEFINE TEMP-TABLE ttTable NO-UNDO FIELD intField AS INTEGER.
E N D
2 План • Поймай меня, если сможешь • Погружение в Architect • Полный .NET
Отлов ошибок С новыми возможностями ABL сейчас вы можете поймать и обработать практически любую ошибку!
Как это было… DEFINE TEMP-TABLE ttTable NO-UNDO FIELD intField AS INTEGER. DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. CREATE BUFFER hBuffer FOR TABLE TEMP-TABLE ttTable:HANDLE. /* Старый добрый NO-ERROR */ hBuffer:FIND-FIRST() NO-ERROR. IF ERROR-STATUS:ERROR THEN DO: DELETE OBJECT hBuffer. MESSAGE ERROR-STATUS:GET-MESSAGE (1) VIEW-AS ALERT-BOX. RETURN. END. /* Другие действия */ DELETE OBJECT hBuffer.
Недостатки • Ловятся не все возможные ошибки • Не все ошибки могут быть обработаны • Нет гарантии, что динамический буфер будет удален • Пользователь может увидеть системное сообщение об ошибке • Несколько DELETE OBJECT
Как это ДОЛЖНО БЫЛО БЫТЬ… DEFINE VARIABLE vNoError AS LOGICAL./* UNDO переменная*/ /* Наличие блока гарантирует удаление hBuffer */ DO ON ERROR UNDO, LEAVE: CREATE BUFFER hBuffer FOR TABLE TEMP-TABLE ttTable:HANDLE. /* NO-ERROR и последующий анализ все еще необходим, ** чтобы не допустить появления сообщения об ошибке */ hBuffer:FIND-FIRST() NO-ERROR. IF ERROR-STATUS:ERROR THEN DO: MESSAGE ERROR-STATUS:GET-MESSAGE (1) VIEW-AS ALERT-BOX. UNDO, LEAVE. END. /* Другие действия */ vNoError = YES. END. DELETE OBJECT hBuffer NO-ERROR.
Недостатки • Ловятся не все возможные ошибки • Не все ошибки могут быть обработаны • Нет гарантии, что динамический буфер будет удален • Пользователь может увидеть системное сообщение об ошибке • Несколько DELETE OBJECT
Как это ДОЛЖНО БЫЛО БЫТЬ (Экстрим)… /* Скрываем возможные сист. сообщения от пользователя */ OUTPUT TO nul./* /dev/null для UNIX */ DO ON ERROR UNDO, LEAVE: CREATE BUFFER hBuffer FOR TABLE TEMP-TABLE ttTable:HANDLE. hBuffer:FIND-FIRST() NO-ERROR. IF ERROR-STATUS:ERROR THEN DO: MESSAGE ERROR-STATUS:GET-MESSAGE (1) VIEW-AS ALERT-BOX. UNDO, LEAVE. END. /* Другие действия */ vNoError = YES. END. OUTPUT CLOSE. DELETE OBJECT hBuffer NO-ERROR.
Недостатки • Ловятся не все возможные ошибки • Не все ошибки могут быть обработаны • Нет гарантии, что динамический буфер будет удален • Пользователь может увидеть системное сообщение об ошибке • Несколько DELETE OBJECT
Как это ДОЛЖНО БЫТЬ СЕЙЧАС… CREATE BUFFER hBuffer FOR TABLE TEMP-TABLE ttTable:HANDLE. hBuffer:FIND-FIRST() /* NO-ERROR */. /* Другие действия */ /* Блок поймает все возможные ошибки */ CATCH err AS Progress.Lang.Error : MESSAGE err:getMessage(1) VIEW-AS ALERT-BOX. DELETE OBJECT err. RETURN. END. /* Этот блок гарантирует удаление буфера независимо ** от того была ли ошибка или нет */ FINALLY: DELETE OBJECT hBufferNO-ERROR. END FINALLY.
Недостатки • Ловятся не все возможные ошибки • Не все ошибки могут быть обработаны • Нет гарантии, что динамический буфер будет удален • Пользователь может увидеть системное сообщение об ошибке • Несколько DELETE OBJECT
Progress.Lang.Error • CallStack property (SESSION:ERROR-STACK-TRACE или -errorstack) • NumMessages property • Severity property • GetMessage ( MessageIndex ) method • GetMessageNum (MessageIndex ) method
Progress.Lang.Error Progress.Lang.Object Progress.Lang.Error Interface Progress.Lang.ProError Progress.Lang.AppError Пользовательский класс ошибок
Пользовательские классы ошибок /* Класс ошибок преобразования типов */ CLASS CastError INHERITS Progress.Lang.AppError: CONSTRUCTOR PUBLIC CastError(mymsg AS CHARACTER, mynum AS INTEGER): AddMessage(mymsg, mynum). END CONSTRUCTOR. CONSTRUCTOR PUBLIC CastError(mynum AS INTEGER): SUPER("Ошибка преобразования типов",mynum). END. END CLASS.
Пользовательские классы ошибок PROCEDURE TestCastError: DEFINE VARIABLE i AS INTEGER NO-UNDO. i = INTEGER("AAA"). CATCH err AS Progress.Lang.Error : DELETE OBJECT err. RETURN ERROR NEW CastError("Ошибка преобразование 'AAA' в целое число",1). END CATCH. END. /* Новый способ обработки ошибки*/ DO ON ERROR UNDO,LEAVE: RUN TestCastError. CATCH err AS CastError : MESSAGE err:getMessage(1) VIEW-AS ALERT-BOX. END CATCH. END. /* Старый способ по-прежнему работает! */ RUN TestCastError NO-ERROR. IF ERROR-STATUS:ERROR THEN MESSAGE ERROR-STATUS:GET-MESSAGE(1) VIEW-AS ALERT-BOX.
Неуловимые ошибки … /* Возможная ошибка внутри функции не приведет к прерыванию */ FUNCTION fStr2Int RETURNS INTEGER (iStr AS CHARACTER): RETURN INTEGER(iStr). END. /* Возможная ошибка внутри процедуры не приведет к прерыванию */ PROCEDURE pStr2Int: DEFINE INPUT PARAMETER iStr AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER oNum AS INTEGER NO-UNDO. oNum = INTEGER(iStr). END. fStr2Int("AAA") NO-ERROR. MESSAGE ERROR-STATUS:ERROR VIEW-AS ALERT-BOX. DEFINE VARIABLE vNum AS INTEGER NO-UNDO. RUN pStr2Int("AAA", OUTPUT vNum) NO-ERROR. MESSAGE ERROR-STATUS:ERROR VIEW-AS ALERT-BOX.
… становятся уловимыми /* Делаем ошибки во всех подпрограммах доступными ** для нашего обработчика ошибок */ ROUTINE-LEVEL ON ERROR UNDO , THROW. FUNCTION fStr2Int RETURNS INTEGER (iStr AS CHARACTER): RETURN INTEGER(iStr). END. fStr2Int("AAA") /* NO-ERROR */ . CATCH err AS Progress.Lang.Error : MESSAGE err:getMessage(1) VIEW-AS ALERT-BOX. DELETE OBJECT err. END CATCH.
Ошибки в функциях … /* Если преобразовать строку не удалось функция вернет ошибку */ FUNCTION fStr2Int RETURNS INTEGER (iStr AS CHARACTER): DEFINE VARIABLE i AS INTEGER NO-UNDO. i = INTEGER(iStr) NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN ERROR ?. RETURN i. END. /* Но сможем ли мы ее поймать?! */ fStr2Int("AAA") NO-ERROR. MESSAGE ERROR-STATUS:ERROR VIEW-AS ALERT-BOX.
… теперь могут и быть! ROUTINE-LEVEL ON ERROR UNDO , THROW. /* Если преобразовать строку не удалось функция вернет ошибку */ FUNCTION fStr2Int RETURNS INTEGER (iStr AS CHARACTER): DEFINE VARIABLE i AS INTEGER NO-UNDO. i = INTEGER(iStr) NO-ERROR. IF ERROR-STATUS:ERROR THEN UNDO, THROW NEW Progress.Lang.AppError("Function Error",1). RETURN i. END. /* которую мы сможем поймать! */ fStr2Int("AAA") NO-ERROR. MESSAGE ERROR-STATUS:GET-MESSAGE(1) VIEW-AS ALERT-BOX.
Заключение • Унифицированная модель управления исключениями • Возможность расширения системных исключений исключениями, специфичными для приложения • Интегрированная работа нового и старого механизмов обработки исключений
21 План • Поймай меня, если сможешь • Погружение в Architect • Полный .NET
Цикл разработки приложения Сбор требований Потребности бизнеса Повторяем для следующего релиза Анализ Кодирование/ Тестирование Проектиро- вание Итерация Поддержка Переисполь- зование Сборка, Сист. тестирование/ Производительность Профилирование Разверты- вание Эксплуатация, Мониторинг, Управление
Проектировщик Сбор требований Анализ Проектиро- вание • Работа с проектными документами внутри среды разработки • Плагин для систем управления изменениями (CVS, Subversion, VSS) • Моделирование и проектирование приложения с использованием UML • Плагин для Enterprise Architect • Инжиниринг • Модель в код • Код в модель
Разработчик Кодирование/ Тестирование • Назначение задачи • Mylin плагин • Работа внутри системы управления изменениями • Итерационное изменение кода и сравнение изменений • Связь изменений с аннотациями • Проверка кода на удовлетворение стандартам кодирование • ProRefactor / Prolint • Генерация и изменение юнит-тестов
Специалист по интеграции Кодирование/ Тестирование • Аннотация публичных сервисов • Использованием ProxyGen внутри IDE для развертывания сервисов • Публикация ABL кода в виде WebService из IDE • Добавление сервиса к Sonic ESB
Специалист по качеству Тестирование / Производительность Профилирование • Использование листа подсказок (Cheat Sheets) • Использование DB Navigator • Анализ изменений схемы данных • Валидация данных • Использование Mylin и системы управления измененийдля анализа изменений кода • Запуск тестовой конфигурации, выполнение юнит-тестов • Профилирование кода
Специалист поддержки Тестирование / Производительность Профилирование • Работа с заявками от пользователей внутри IDE • Плагин Bugzilla • Просмотр изменений кода по заявке • Система контроля изменений / Meta Catalog • Инструменты сравнения • Просмотр действий разработчика при решении заявки • Плагин Mylin • Отладка измененного кода с помощью отладчика
Специалист поддержки разработки Все • Создание представлений (perspectives) • Кастомизация шаблонов • Установка/определение правил Prolint • Определение макросов для аннотаций • Экспортирование настроек проекта • Интеграция ABL инструментов в IDE
30 План • Поймай меня, если сможешь • Погружение в Architect • Полный .NET
О Т Р Е Ч Е Н И Е О Т Р Е Ч Е Н И Е 31 В разработке • Презентация включает информацию о возможных будущих продуктах и(ли) их возможных улучшениях • Все, что я собираюсь поведать, отражает текущее видение PSC, которое является неокончательным и может меняться. Т.о. будущие продукты PSC могут разительно отличаться от того, что описано здесь
32 GUI компоненты • Графический клиент • Объектно-ориентированный доступ к элементам управления .NET • Связь между ABL источником данных и .NET элементами управления • Написание обработчиков событий для .NET элементов управления • OpenEdge Architect • Новый визуальный дизайнер форм • Базовый набор интерфейсных .NET элементов • Дополнительно: • Набор расширенных элементов управления от Infragistics
33 Основные преимущества • УсилениеABL • Один язык – нет нужды изучать языки C#, VB.NET • Прямой доступ к элементам управления .NET – не требуется никакого контейнера, как в случае с OCX • Связь между ABL источником данныхи .NET элементами управления • Единый инструмент: OpenEdge Architect • Нет необходимости в покупке, изучении или использовании других инструментов (Visual Studio)
34 Основные преимущества • Интегрируетсяс существующим GUI на уровне сессии (не формы) • Независимостьот архитектуры развертывания • Клиент/серверили n-звенная архитектура • Расширяемостьза счет элементов управления от сторонних разработчиков • Адаптируемостьк будущим улучшениям в области UI (Vista)
OpenEdge Клиент OpenEdge рантайм Microsoft CLR OpenEdge UI (Controller) .NET UI (View) Мост Мост 35 Новая GUI архитектура OpenEdge и .NET™ CLR внутри одного процесса • GUI отрисовка • События и взаимодействие с пользователем • GUI компоненты • Доступ к данным • Обработчики событий
36 Новый GUI в действии f = NEW Form( ). f:Closing:Subscribe( EventHdlr1 ). WAIT-FOR Application.Run( f:UIForm ). EventHdlr1( ) … EventHdlr2( ) … 4 3 5 OpenEdge Клиент 7 1 OpenEdge рантайм Microsoft CLR 2 OpenEdge UI (Controller) .NET UI (View) Мост Мост 6
37 GUI компоненты • СодержитProgress.Windows.Form • Создает все элементы управления на форме • Подписка на события • Связь источника данных и элемента управления • Содержит обработчики событий Form.cls Form / Data .p / .i’s • Альтернативное хранилище для обработчиков событий • Хранит объявления источников данных и запросов Startup.p • Точка входа в GUI • Создает Form.cls • Выполняет WAIT-FOR
38 Поддержка .NET объектов со стороны ABL • .NET классы используются также как «родные» ABL классы • Разделяют базовый класс Progress.Lang.Object • Имена классов становятся чувствительные к регистру DEFINE PROPERTY UIForm AS Progress.Windows.Form GET. SET. DEFINE VARIABLE helloBtn AS System.Windows.Forms.Button. UIForm = NEW Progress.Windows.Form ( ). helloBtn = NEW System.Windows.Forms.Button( ). helloBtn:Text = “Hello World”. MESSAGE helloBtn:Text VIEW-AS ALERT-BOX. …
39 Мапинг типов ABL и .NET • Типы .NET мапируются в ABL • Скалярные типы мапипуются в типы данных ABL • Ссылочные типы обрабатываются как ABL классы • DEFINE VARIABLE iCnt AS INTEGER INITIAL 20. • DEFINE VARIABLE lCount AS INT64 INITIAL 1000. • … • /* Call .NET method • Method( int32 iCnt, long lCount) */ • objRef:Method( INPUT iCnt, INPUT lCount ). • INTEGERINT64
40 Улучшения ABL • Улучшен WAIT-FOR для работы .NET формами • Подписка ABL кода к .NET событиям WAIT-FOR Application:Run( UIForm ). WAIT-FOR Application:Run( ). WAIT-FOR UIForm:ShowDialog( ). UIForm:Load:Subscribe( UIForm_Load ). METHOD UIForm_Load( sender AS System.Object, eArgs AS System.EventArgs ): …
41 Связь ABL данныхи .NET • Связь ABL данныхи .NET элементов управления (Databinding) • Новый объект Progress.Data.BindingSource • Используетисточники данных ABL построенные на запросах (TT, PDS, DB) DEFINE VARIABLE CustBsrc AS Progress.Data.BindingSource. CREATE QUERY hdlQry. /* Prepare and open query */ CustBsrc = NEW Progress.Data.BindingSource( hdlQry,"*", "" ). custGrid:DataSource = CustBsrc.
42 Архитектура нового IDE OpenEdge Architect OpenEdge клиент ABL Редактор Визуальный дизайнер Microsoft CLR Eclipse OpenEdge рантайм Визуальный дизайнер: • WYSIWYG дизайнер • Генератор ABL кода • Подписка на события • Методы обработчики
43 Визуальный дизайнер Построен как плагин Eclipse для OE Architect • WYSIWYG создание и изменение формы • Определение формы • Добавление .NET элементов управления • Установка свойств элементов управления • Объявление объектов data binding • Добавление подписок на события • Инспектор классов • Показывает информацию о .NET и ABL классах
44 Миграция • Сосуществованиесуществующих GUI форм и новых .NET форм • Миграциясуществующих GUI форм на .NET формы • Инструменты / стратегии • Возможен мапинг ADM2 / Dynamics -> .NET • Нет необходимости изменения архитектуры приложения( толстый клиент, клиент/сервер, n-tier )
45 Дальнейшие шаги • Переход наRelease 10 • Отделение бизнес-логики от UI • Перевод ON триггеровнаметоды • Ознакомится с объектно-ориентированными возможностями • Созданиеи доступ к UI объектам • Вызовметодов, доступ к свойствам • Подписка на события UI
46 Вопросы?