Лекция 4. Базовые типовые решения. Объект-значение (Value Object). Небольшие простые объекты, равенство которых не основано на равенстве идентификаторов. Принцип действия: Ключевое отличие объекта-значения от ссылочного (обычного) объекта принцип проверки на равенство. Способ обработки. Передача в виде значения, а не в виде ссылки. Объект-значение неизменяем после его создания. Объекты значения не стоит хранить в виде отдельных записей БД. Для их хранения применяют либо внедренные значения (Embedded Value), либо крупные сериализованные объекты (Serialized LOB). Деньги (Money). Представляет денежное значение. Проблемы: 1. Использование различных валют. 2. Проблема округления и потери центов, копеек или еще чего 3. Актуальность валют на определенную дату. 4. Странно, что такого типа нет. Money amount currency date +,-,*() allocate() <,>,<=,>=,=() Деньги (Money).. Принцип действия. Некоторые моменты: Создаем класс, поля которого содержат величину денежной суммы, валюту, в которой указана эта сумма и дату, для фиксации точки расчета курса этой валюты. Величина суммы представляется либо целочисленным значением, либо действительным значением с фиксированным числом десятичных знаков. Применять числовые типы с плавающей точкой не стоит, так как они приводят к проблемам с округлением – а мы их хотели избежать. Большую часть времени денежная величины будут округляться до наименьшей единицы текущей валюты (например, центов или копеек). Но для выполнения некоторых вычислений могут потребоваться дробные денежные величины. Этот вопрос: с какими денежными величинами дробными или целочисленными вы работаете нужно четко обозначить в момент проектирования приложения. Это особенно важно, если в приложении могут быть и те и другие деньги. Денежные величины - это объекты-значения, следовательно все методы сравнения переопределяются так, чтобы их результат основывался на значении, виде валют и даты курса. Деньги (Money). Принцип действия. Некоторые моменты. Выполнение арифметических вычислений: Сложение. Проблема разных валют. Умножение и деление. Проблема округления. Пример: Пусть имеется бизнес-правило согласно которому я должен разделить некоторую сумму на два счета: 70% на первый и 30% на второй. Сумма = 5 копеек. 70% = 3.5 коп. 30%= 1.5 коп. Стратегии: 1. «Ну и фиг с ней». 2. Последнему – то что осталось 3. Схема метода округления. 4. Распределять лишние псевдослучайным образом. Частный случай (Special Case). Производный класс, описывающий поведение объекта в особых ситуациях. Проблема NULL. Обработка бесконечности. Обработка чего-то неизвестного или не полностью известного. Частный случай (Special Case). Принцип действия. Основная идея: создаем производный класс для обработки частных, особых случаев. Например, NullCustomer. Если в приложении не требуется проводить различия между экземплярами этого класса, то можно использовать для его создания приспособленец. Значения NULL могут иметь разную природу. Тогда описываем отдельные частные случаи. Очень часто, вызов операции в одном частном случае может привести к возврату другого частного случая. Стандарт IEEE 754 определение операций над числами с плавающей точкой – пример частных случаев, которые касаются обработки бесконечных величин и значений типа (NaN not-a-number). Дополнительный модуль (Plugin). Связывает классы во время настройки, а не компиляции приложения. По сути интерфейс ? Реализация интерфейса Основная проблема: Запуск в различных исполняющих средах Тестирование Гибкость настройки Варианты использования удаленного компонента Дополнительный модуль (Plugin). Принцип действия. Некоторые моменты: 1. Определяется отделенный интерфейс для каждого поведения, которое требует различных реализаций в зависимости от чего-то 2. Несколько видоизменяется типовое решение Фабрика (Factory), чтобы соответствовать текущей задача. 3. Наша реализация требует, чтобы все правила связывания находились в единственной внешней точке. 4. Связывание интерфейса с реализацией происходит не во время компиляции, а динамически. Дополнительный модуль (Plugin). Принцип действия. Метод некоторого Метод-фабрика объекта дополнительного предметной модуля области, которому требуется услуга , определяемая GetPlugin динамически Нечто, в чем хранятся настройки. Метод фабрика обращается к этому нечто, ищет параметр (строку) , LookupPluginByType задающую текущий вариант реализации запрошенного интерфейса. new Фабрика производит реализацию интерфейса. Теперь его можно вернуть объекту предметной области, который его запрашивал. Дополнительный модуль (Plugin). Пример. DomainObject IdGenerator +nextID() Plugins +loadInstance() if (isTesting) return new MemoryCounter if (isProduction) return new OracleIdGenerator OracleIDGenerator MemoryCounter +NextID() +nextID() Фиктивная служба (Service Stub). Устраняет зависимость приложения от труднодоступных или проблемных частей во время тестирования. + Внешняя служба. Труднодоступная или чужая … () Интерфейс + () Времянка. Заглушка этой внешней службы. + () Проблемы: Создается класс, который является суперклассом для всех объектов слоя Зависимость от ресурсов, которые контролируются кем-то другим. Разнокомандная разработка Простои. Тестирование. Порядок сборки приложения. Фиктивная служба (Service Stub). Принцип действия. 1. 2. 3. 4. Доступ к внешней службе устанавливается в виде Шлюза. Шлюз реализуется в виде отдаленного интерфейса, который имеет одну реализацию для обращения к реальной службе, и, как минимум еще одну, которая и является фиктивной службой. Нужная реализация загружается с помощью дополнительного модуля. Главный принцип – фиктивная служба делается насколько простой насколько это возможно; лишняя сложность замедляет процесс. Множество записи (Record Set). Представление табличных данных в оперативной памяти. * 1 1 * 1 * Факты: 1. 20 последних лет основным способом долгосрочного хранения являются реляционные базы данных. 2. Наличие средств поддержки сложной «бизнес-логики» на уровне баз данных не предусмотрено. Множество записи (Record Set). Принцип действия. 1. 2. 3. 4. 5. 6. Обычно, множество записей не приходится реализовывать самостоятельно. Такого рода классы являются приятным приложением к современным программным платформам. Первая ключевая особенность – структура множества записей в точности копирует результат выполнения запроса к БД. Следовательно можно использовать все двухуровневые средства для манипуляции с этим результатом. Вторая ключевая особенность – можно работать со множеством записей не только при помощи двухуровневых средств. Что делать, если реализация этого типового решения не предусмотрена? Можно создать самому, но тогда нужно создавать и элементы интерфейса пользователя заточенные под использование множества данных. При работе с множеством записей важно, чтобы его можно было легко отсоединить от источника данных. Это дает ряд преимуществ, связанных с передачей данных. С другой стороны, это приводит к ряду проблем, связанных с обновлением данных. Реестр (Registry). «Глобальный» объект, который используется другими объектами для поиска общих объектов или служб.