1 / 47

План

2. План. Поймай меня, если сможешь Погружение в Architect Полный .NET. Отлов ошибок. С новыми возможностями ABL сейчас вы можете поймать и обработать практически любую ошибку!. Как это было…. DEFINE TEMP-TABLE ttTable NO-UNDO FIELD intField AS INTEGER.

kalani
Download Presentation

План

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 2 План • Поймай меня, если сможешь • Погружение в Architect • Полный .NET

  2. Отлов ошибок С новыми возможностями ABL сейчас вы можете поймать и обработать практически любую ошибку!

  3. Как это было… 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.

  4. Недостатки • Ловятся не все возможные ошибки • Не все ошибки могут быть обработаны • Нет гарантии, что динамический буфер будет удален • Пользователь может увидеть системное сообщение об ошибке • Несколько DELETE OBJECT

  5. Как это ДОЛЖНО БЫЛО БЫТЬ… 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.

  6. Недостатки • Ловятся не все возможные ошибки • Не все ошибки могут быть обработаны • Нет гарантии, что динамический буфер будет удален • Пользователь может увидеть системное сообщение об ошибке • Несколько DELETE OBJECT

  7. Как это ДОЛЖНО БЫЛО БЫТЬ (Экстрим)… /* Скрываем возможные сист. сообщения от пользователя */ 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.

  8. Недостатки • Ловятся не все возможные ошибки • Не все ошибки могут быть обработаны • Нет гарантии, что динамический буфер будет удален • Пользователь может увидеть системное сообщение об ошибке • Несколько DELETE OBJECT

  9. Как это ДОЛЖНО БЫТЬ СЕЙЧАС… 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.

  10. Недостатки • Ловятся не все возможные ошибки • Не все ошибки могут быть обработаны • Нет гарантии, что динамический буфер будет удален • Пользователь может увидеть системное сообщение об ошибке • Несколько DELETE OBJECT

  11. Progress.Lang.Error • CallStack property (SESSION:ERROR-STACK-TRACE или -errorstack) • NumMessages property • Severity property • GetMessage ( MessageIndex ) method • GetMessageNum (MessageIndex ) method

  12. Progress.Lang.Error Progress.Lang.Object Progress.Lang.Error Interface Progress.Lang.ProError Progress.Lang.AppError Пользовательский класс ошибок

  13. Пользовательские классы ошибок /* Класс ошибок преобразования типов */ 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.

  14. Пользовательские классы ошибок 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.

  15. Неуловимые ошибки … /* Возможная ошибка внутри функции не приведет к прерыванию */ 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.

  16. … становятся уловимыми /* Делаем ошибки во всех подпрограммах доступными ** для нашего обработчика ошибок */ 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.

  17. Ошибки в функциях … /* Если преобразовать строку не удалось функция вернет ошибку */ 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.

  18. … теперь могут и быть! 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.

  19. Заключение • Унифицированная модель управления исключениями • Возможность расширения системных исключений исключениями, специфичными для приложения • Интегрированная работа нового и старого механизмов обработки исключений

  20. 21 План • Поймай меня, если сможешь • Погружение в Architect • Полный .NET

  21. Цикл разработки приложения Сбор требований Потребности бизнеса Повторяем для следующего релиза Анализ Кодирование/ Тестирование Проектиро- вание Итерация Поддержка Переисполь- зование Сборка, Сист. тестирование/ Производительность Профилирование Разверты- вание Эксплуатация, Мониторинг, Управление

  22. Набор инструментов разработчика

  23. Проектировщик Сбор требований Анализ Проектиро- вание • Работа с проектными документами внутри среды разработки • Плагин для систем управления изменениями (CVS, Subversion, VSS) • Моделирование и проектирование приложения с использованием UML • Плагин для Enterprise Architect • Инжиниринг • Модель в код • Код в модель

  24. Разработчик Кодирование/ Тестирование • Назначение задачи • Mylin плагин • Работа внутри системы управления изменениями • Итерационное изменение кода и сравнение изменений • Связь изменений с аннотациями • Проверка кода на удовлетворение стандартам кодирование • ProRefactor / Prolint • Генерация и изменение юнит-тестов

  25. Специалист по интеграции Кодирование/ Тестирование • Аннотация публичных сервисов • Использованием ProxyGen внутри IDE для развертывания сервисов • Публикация ABL кода в виде WebService из IDE • Добавление сервиса к Sonic ESB

  26. Специалист по качеству Тестирование / Производительность Профилирование • Использование листа подсказок (Cheat Sheets) • Использование DB Navigator • Анализ изменений схемы данных • Валидация данных • Использование Mylin и системы управления измененийдля анализа изменений кода • Запуск тестовой конфигурации, выполнение юнит-тестов • Профилирование кода

  27. Специалист поддержки Тестирование / Производительность Профилирование • Работа с заявками от пользователей внутри IDE • Плагин Bugzilla • Просмотр изменений кода по заявке • Система контроля изменений / Meta Catalog • Инструменты сравнения • Просмотр действий разработчика при решении заявки • Плагин Mylin • Отладка измененного кода с помощью отладчика

  28. Специалист поддержки разработки Все • Создание представлений (perspectives) • Кастомизация шаблонов • Установка/определение правил Prolint • Определение макросов для аннотаций • Экспортирование настроек проекта • Интеграция ABL инструментов в IDE

  29. 30 План • Поймай меня, если сможешь • Погружение в Architect • Полный .NET

  30. О Т Р Е Ч Е Н И Е О Т Р Е Ч Е Н И Е 31 В разработке • Презентация включает информацию о возможных будущих продуктах и(ли) их возможных улучшениях • Все, что я собираюсь поведать, отражает текущее видение PSC, которое является неокончательным и может меняться. Т.о. будущие продукты PSC могут разительно отличаться от того, что описано здесь

  31. 32 GUI компоненты • Графический клиент • Объектно-ориентированный доступ к элементам управления .NET • Связь между ABL источником данных и .NET элементами управления • Написание обработчиков событий для .NET элементов управления • OpenEdge Architect • Новый визуальный дизайнер форм • Базовый набор интерфейсных .NET элементов • Дополнительно: • Набор расширенных элементов управления от Infragistics

  32. 33 Основные преимущества • УсилениеABL • Один язык – нет нужды изучать языки C#, VB.NET • Прямой доступ к элементам управления .NET – не требуется никакого контейнера, как в случае с OCX • Связь между ABL источником данныхи .NET элементами управления • Единый инструмент: OpenEdge Architect • Нет необходимости в покупке, изучении или использовании других инструментов (Visual Studio)

  33. 34 Основные преимущества • Интегрируетсяс существующим GUI на уровне сессии (не формы) • Независимостьот архитектуры развертывания • Клиент/серверили n-звенная архитектура • Расширяемостьза счет элементов управления от сторонних разработчиков • Адаптируемостьк будущим улучшениям в области UI (Vista)

  34. OpenEdge Клиент OpenEdge рантайм Microsoft CLR OpenEdge UI (Controller) .NET UI (View) Мост Мост 35 Новая GUI архитектура OpenEdge и .NET™ CLR внутри одного процесса • GUI отрисовка • События и взаимодействие с пользователем • GUI компоненты • Доступ к данным • Обработчики событий

  35. 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

  36. 37 GUI компоненты • СодержитProgress.Windows.Form • Создает все элементы управления на форме • Подписка на события • Связь источника данных и элемента управления • Содержит обработчики событий Form.cls Form / Data .p / .i’s • Альтернативное хранилище для обработчиков событий • Хранит объявления источников данных и запросов Startup.p • Точка входа в GUI • Создает Form.cls • Выполняет WAIT-FOR

  37. 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. …

  38. 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

  39. 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 ): …

  40. 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.

  41. 42 Архитектура нового IDE OpenEdge Architect OpenEdge клиент ABL Редактор Визуальный дизайнер Microsoft CLR Eclipse OpenEdge рантайм Визуальный дизайнер: • WYSIWYG дизайнер • Генератор ABL кода • Подписка на события • Методы обработчики

  42. 43 Визуальный дизайнер Построен как плагин Eclipse для OE Architect • WYSIWYG создание и изменение формы • Определение формы • Добавление .NET элементов управления • Установка свойств элементов управления • Объявление объектов data binding • Добавление подписок на события • Инспектор классов • Показывает информацию о .NET и ABL классах

  43. 44 Миграция • Сосуществованиесуществующих GUI форм и новых .NET форм • Миграциясуществующих GUI форм на .NET формы • Инструменты / стратегии • Возможен мапинг ADM2 / Dynamics -> .NET • Нет необходимости изменения архитектуры приложения( толстый клиент, клиент/сервер, n-tier )

  44. 45 Дальнейшие шаги • Переход наRelease 10 • Отделение бизнес-логики от UI • Перевод ON триггеровнаметоды • Ознакомится с объектно-ориентированными возможностями • Созданиеи доступ к UI объектам • Вызовметодов, доступ к свойствам • Подписка на события UI

  45. 46 Вопросы?

More Related