Слайд 2Classes
Объектно-ориентированное программирование
Объектно-ориентированная парадигма – это метод создания и поддержки приложений.
Класс-это
описание структуры хранения данных, включащий методы манипуляции данными.
Объект-единица хранения данных класса.
Классам присуща иерархическая структура. При этом говорят о наследовании классов.
Если имеется два одинаковых класса, необходимо наследовать их от класса с общей для обоих классов структурой.
Основным преимуществом такого подхода является локализация общего кода и структуры данных.
Слайд 3Classes
Объектно-ориентированное проектирование
Для проектирования приложения используя объектную парадигму:
Опишите рассматриваемую предметную область в
виде глаголов и существительных.
Каждое существительное является претендентом на новый класс. Уточните свойства выбранных классов.
Каждый глагол может быть либо методом либо запросом некоторого класса. Методы и запросы определяют «бизнес-логику» класса.
Создайте внешний интерфейс, использующий и манипулирующий свойствами и методами объектов.
Слайд 5Classes
Инкапсуляция
Класс описывает структуру хранения данных, а также методы манипуляции данными объектов
класса.
Для приложения «Виртуальная закусочная»:
Разработчики программируют различные части приложения, использующих класс Order, не зная особенностей реализации класса.
Для изменения реализации класса Order, редактируйте и откомпилируйте его.
Нет необходимости искать и модифицировать места использования класса Order.
Слайд 6Classes
Наследование
Наследуемый класс приобретает свойства, методы, параметры и запросы класса-предка.
Класс-потомок может иметь
свои методы, свойства и др.
Возможно также переопределение наследуемых методов.
Следующие фразы являются синонимами:
Класс B – это класс-потомок класса А
Класс B наследуется от класса A
Класс B является производным от класса А
Класс B расширяет класс A
Класс А – класс-предок класса В
Невозможно наследовать класс от класса типа Final.
Слайд 7Classes
Объектная модель
Диаграмма справа отображает структуру Caché классов.
Хранимые и встраиваемые классы наследуют
свое поведение и состояние от зарегистрированного класса.
Datatype
Embedded
Persistent
Registered
CSP Page
Non-registered
SwizzleObject
Слайд 8Classes
Зарегистрированные классы
Зарегистрированные классы наследуются от класса %Library.RegisteredObject.
Зарегистрированный класс предоставляет ряд
методов для создания новых объектов и доступа к их свойствам.
Объекты зарегистрированного класса не могут быть сохранены.
Зарегистрированный класс не имеет метода %Save().
Используйте объекты зарегистрированного класса в качестве временных объектов.
Класс Print со свойствами Document, Printer и Copies, и методом PrintIt() является примером зарегистрированного класса.
Слайд 9Classes
Хранимые классы
Хранимый класс наследуется от %Library.Persistent.
%Library.Persistent наследуется от %Library.RegisteredObject.
Создайте объект хранимого
класса, обратитесь к его свойствам и вызовите его методы.
Хранимый класс предоставляет методы для открытия и сохранения объектов.
Для сохранения объекта используйте метод %Save(), для открытия - %OpenId().
Хранимый класс характеризуется флажком Persistent.
Откройте Инспектор класса, вкладка Storage.
Слайд 10Classes
Хранимый класс
Класс MenuItem хранит информацию о каждом доступном элементе в меню.
Name
Price
Quantity
MenuItem
Слайд 11Classes
Встраиваемые классы
Встраиваемые классы хранятся внутри хранимых классов.
Несколько хранимых классов могут хранить
один и тот же встраиваемый класс.
Caché сохраняет данные объекта встраиваемого класса тогда, когда сохраняется соответствующий хранимый объект.
Слайд 12Classes
Встраиваемые классы
Встраиваемый класс наследуется от %Library.SerialObject
%Library.SerialObject наследуется от %Library.RegisteredObject.
Создайте новый объект
встраиваемого класса, выполните его методы и выведите значения свойств.
Встраиваемый объект не имеет метода %Save().
Встраиваемый объект может быть сохранен только будучи встроенным в хранимый объект.
Встраиваемый объект характеризуется флажком Embedded.
Убедитесь в этом во вкладке Storage окна характеристик класса.
Слайд 13Classes
Встраиваемый объект
Встраиваемый объект хранится как часть хранимого объекта.
Каждый объект Customer имеет
свойства Name, Phone и Address.
Встраиваемый объект Address существует только в контексте класса Customer и сохраняется только когда сохраняется объект Customer.
Address
Customer
Name
Phone
Street
City
State
Zip
Слайд 14Classes
Абстрактные классы
Нельзя создать объект абстрактного класса
Любой класс может быть абстрактным.
Откройте описание
класса двойным нажатием мыши на имени класса. Выберите опцию Abstract.
Или при создании класса укажите тип «Абстрактный»
Пример: класс Автомобиль, как абстракция свойств и поведения всех реально существующих автомобилей.
Данный класс будет классом-предком для классов Легковой и Грузовой.
Нет необходимости создавать объект класса Автомобиль, работаем только с объектами классов Грузовой и Легковой.
Абстрактный класс может и не иметь описание структуры хранения данных.
Нет описания: данные о легковых автомобилях хранятся отдельно от данных о грузовых.
Есть описание: данные о грузовых и легковых автомобилях хранятся совместно.
Слайд 15Classes
Классы типов данных
Caché предоставляет множество предопределенных классов типов данных.
Методы классов типов
данных предназначены для:
Проверки правильности введенного значения свойства.
Конвертирования значения свойства в разные форматы представления.
Список предоставляемых классов типов данных включают классы строк, дат, чисел и др.
Caché предоставляет разработчику возможность создания собственных классов типов данных (ADT).
Классы типов данных подробно рассматриваются в Модуле 9.
Слайд 16Classes
Класс CSP
Класс CSP наследуется от класса %CSP.Page.
Для каждой страницы CSP создается
отдельный класс.
Создать класс CSP можно либо используя Cache Studio, либо путем создания CSP страницы в HTML-редакторе.
Технология CSP рассмотрена в Модуле 12.
Слайд 17Classes
Незарегистрированные классы
Незарегистрированный класс не имеет классов-предков
Незарегистрированный класс – это хранилище для
методов
(часто)
и параметров (иногда).
Невозможно создать объект такого класса.
Незарегистрированный класс используется другими классами.
Другие классы могут вызывать его методы.
Другие классы могут наследоваться от него.
Для создания незарегистрированного класса:
Создайте новый производный (Derived) класс и не указывайте имя класса-предка.
Слайд 19Classes
Типы связей
Для определения отношений между классами используются свойства специального типа –
Relationship
Слайд 20Classes
Использование связей
Наше приложение должно хранить несколько заказов от одного клиента.
В
классе Order определено свойство Customer.
Каждый объект класса Order хранит указатель на объект класса Customer.
Для доступа к свойствам объекта Customer через объект Order используйте каскадный точечный синтаксис:
write ord.Customer.Name
Слайд 21Classes
Связываем классы
Тип данных свойства Customer ссылается на класс Customer.
Customer
Time
Items
Order
Status
Address
Customer
Name
Phone
Street
City
State
Zip
Слайд 22Classes
Синтаксис для связанных объектов
Связывание объектов Order и Customer:
USER>set ord = ##class(User.Order).%New()
USER>set
cust = ##class(User.Customer).%OpenId(4)
USER>set ord.Customer = cust
Связывание объектов Customer и Address:
USER>set cust = ##class(User.Customer).%New()
USER>set cust.Name = "Smith,John"
USER>set cust.Address.Street = "10 High St."
И т.к. Address – встраиваемый класс:
USER>set cust = ##class(User.Customer).%New()
USER>set add = ##class(User.Address).%New()
USER>set cust.Name = "Smith,John"
USER>set add.Street = "10 High St."
USER>set cust.Address = add
Слайд 23Classes
SQL-проекция
Хранимые классы проецируются как таблицы SQL
Включите опцию Delimited Identifiers (Поддерживать идентификаторы
в ограничителях), если список имен классов или свойств содержит зарегистрированные слова SQL
Зарегистрированные слова SQL заключаются в двойные кавычки
Портал управления-> Конфигурация -> Настройки SQL
Поддержка SQL в Caché рассмотрена в Модуле 11
Слайд 24Classes
Класс %SYSTEM.OBJ
Caché предоставляет полезные методы для работы с пользовательскими объектами
Класс %SYSTEM.OBJ
Например,
метод DisplayError()
Отдельные методы предназначены для работы с объектами, другие с классами
Описание методов приведено в документации класса %SYSTEM.OBJ
do $system.OBJ.Help()
Синтаксис вызова методов
Стандартный: do ##class(%SYSTEM.OBJ).DisplayError()
Сокращенный: do $system.OBJ.DisplayError()
Слайд 25Classes
Методы %SYSTEM.OBJ
CloseObjects(): Вызывает метод %Close() всех открытых объектов
Используется, когда требуется принудительное
закрытие объектов в памяти
Можно также использовать команду kill без аргументов
Dump(): выводит детали указанного объекта
ShowObjects(): показывает список ссылок (OREF) открытых объектов
Аргумент "d" дополнительно выводит детали каждого объекта
Запрос ObjectList используется для перебора открытых объектов
Синтаксис работы с запросами рассмотрен в Модуле 11
Слайд 26Classes
Объектное моделирование
Система Rational Rose (Rational Software Corporation) – это один из
лучших инструментариев для проектирования систем на базе UML (Unified Modeling Language)
Rose используется для создания объектной, динамической и функциональной моделей системы
Rose поддерживает синхронизацию программного кода и объектной модели
Rose предоставляет возможности по созданию классов для многих объектно-ориентированных языков программирования (C++, Java)
Rose может импортировать определения классов и обновлять объектную модель
Слайд 27Classes
RoseLink
Caché предоставляет интерфейс RoseLink, предназначенный для загрузки объектной модели Rose в
Caché и импорта структуры классов Caché в Rose
Интерфейс RoseLink настраивается автоматически при установке Caché
Слайд 28Classes
АО. ЛИПА
Предлагаем Вам разработать приложение для компании АО. ЛИПА
Компания занимается продажей
деревянных изделий, в том числе через Интернет
Необходимо разработать приложение, автоматизирующее процесс обработки заказов
Слайд 29Classes
Объектная модель Липа
Person
Store
Address
Order
Employee
Item
Customer
Embedded Work Address and Home Address
One
One
One
One
Embedded Store Address
Embedded ShipTo
Address
Many
Many
Many
Many
Children
Parent
Слайд 30Classes
ObjectScript: Функции для работы с датой
Вывести дату во внутреннем формате:
USER>write $zdateh("1/1/2000")
58074
Вывести
дату в различных форматах:
USER>write $zdate(58074)
01/01/2000
USER>write $zdate(58074,2)
01 Jan 2000
USER>write $zdate(58074,5)
Jan 1, 2000
Вывести текущую дату:
USER>write $zdate($horolog)
USER>write $zdate($horolog,5)
USER>write $zd($h)