Сергей Тарасов - Дефрагментация мозга. Софтостроение изнутри
- Название:Дефрагментация мозга. Софтостроение изнутри
- Автор:
- Жанр:
- Издательство:Издательство «Питер»046ebc0b-b024-102a-94d5-07de47c81719
- Год:2013
- Город:Санкт-Петербург
- ISBN:978-5-496-00606-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Сергей Тарасов - Дефрагментация мозга. Софтостроение изнутри краткое содержание
Эта книга для тех, кто давно связан с разработкой программного обеспечения. Или для тех, кто еще думает выбрать программирование своей профессией. Или для тех, кто просто привык думать и размышлять о происходящем в мире информационных технологий.
Не секрет, что основная масса софтостроения сосредоточена в секторе так называемой корпоративной разработки: от комплексных информационных систем предприятия до отдельных приложений. Поэтому немалая часть сюжетов касается именно Enterprise Programming.
Из текста вы вряд ли узнаете, как правильно склеивать многоэтажные постройки из готовых компонентов в гетерогенной среде, проектировать интерфейсы, синхронизировать процессы или писать эффективные запросы к базам данных. Подобные темы будут лишь фоном для рассказа о софтостроительной «кухне». При определенной доле любопытства вы сможете убедиться, что новое – это хорошо забытое старое, узнать, как устроены некоторые сложные системы, когда следует применять разные технологии, почему специалистам в информатике надо особенно тщательно фильтровать поступающую из множества источников информацию, и многое другое, что вы, возможно, еще не знали или уже знаете, но с другой стороны.
В книге мне хотелось показать наш софтостроительный мир разработки корпоративных информационных систем не с парадного фасада описаний программных сред, подходов и технологий, а изнутри. Насколько это получилось – судить читателю.
Дефрагментация мозга. Софтостроение изнутри - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:

Все классы домена являются расширяемыми ( partial ), что позволяет разработчику вынести специфичные не поддерживаемые моделью реализации свойств и методов классов в отдельные файлы.
Перечисляемый тип создаётся вместе с классами, позволяющими локализовать пользовательские названия его элементов, описанные в модели. По умолчанию будет использован язык модели, перевод необходимо осуществлять в технологии gettext .

Рис. 22.Перечисляемый тип слоя домена и его локализация

Рис. 23.Класс «Финансовый год» слоя домена
Для определяемых моделью сущностей генерируются классы, содержащие кроме соответствующих объявленным атрибутам свойств ещё и группу служебных методов для управления объектами, например, для сохранения или выборки по запросу на HQL или даже SQL. Такие методы часто используют служебные классы, объявленные в DomainSupport.cs.
Для объявленных в модели операций генерируется соответствующий метод интерфейса. Реализовать их нужно программисту в рамках расширения partial -класса.

Рис. 24.Класс «Учётный период» слоя домена
Отображение классов на структуры РСУБД соответствует стратегии «одна таблица на подкласс без дублирования атрибутов предка», достаточно хорошей в большинстве случаев, но и она может быть изменена.
Фрагмент файла проекции для класса «Финансовый год»
name="Domain.Engine.FiscalYear" table="FISCAL_YEAR" schema="MYAPP">
name="Id" access="property" column="NIFISCAL_YEAR">
class="native">
name="sequence">MYAPP.SEQ_FISCAL_YEAR
name="Version" column="VERSION" type="int" access="property" />
name="Periods" table="MYAPP.PERIOD" inverse="true" lazy="true" cascade="none">
column="NI_FISCAL_YEAR" />
class="Domain.Engine.Period" />
name="EntityRegistry" class="Domain.Core.EntityRegistry" unique="true">
name="NI_ENTITY_REGISTRY" not-null="false" />
name="Name" access="property">
name="NAME" not-null="false" />
name="Granularity" access="property">
name="GRANULARITY" not-null="true" />
name="FromDate" access="property">
name="FROM_DATE" not-null="true" />
name="ToDate" access="property">
name="TO_DATE" not-null="true" />
name="Closed" access="property" type="YesNo">
name="CLOSED" not-null="true" />
name="CreatedBy" access="property">
name="CREATED_BY" not-null="false" />
name="CreatedDate" access="property" type="timestamp">
name="CREATED_DATE" not-null="false" />
name="LastModifiedBy" access="property">
name="LAST_MODIFIED_BY" not-null="false" />
name="LastModifiedDate" access="property" type="timestamp">
name="LAST_MODIFIED_DATE" not-null="false" />
Слой веб-служб и интерфейсов доступа (ServiceStack)
Генерируемые для слоя веб-служб C#-файлы предназначены для создания двух сборок: собственно служб и интерфейсов к ним, используемых клиентами.


Рис. 25.Классы, реализующие службы доступа к объектам домена

Рис. 26.Класс службы сохранения объектов
Интерфейсы доступа к службам также содержат описания перечислимых типов с локализацией, классы DTO для передачи состояния между программой-клиентом и доменом, классы для непосредственного доступа к вызовам служб.

Рис. 27.Перечисляемый тип слоя веб-служб

Рис. 28.Классы вызова специфицированных методов

Рис. 29.Классы вызова веб-служб, касающихся «финансового года»

Рис. 30.Класс адаптера для работы с объектом «Финансовый год»

Рис. 31.Класс адаптера для работы с коллекцией объектов «Финансовый год»
Работать с DTO и коллекциями не слишком комфортно, проявляется много ненужных деталей. Но если обернуть операции с DTO адаптерами, то код становится гораздо более читаемым и коротким.
Пример работы с DTO
CurrencyDTO curr1 = newCurrencyDTO();
curr1.Code = "RUR";
curr1.Name = "Currency 1";
UnitOfWorkDTO uow = newUnitOfWorkDTO();
uow.Save(curr1);
PersistenceRequest prq1 = newPersistenceRequest();
prq1.UnitOfWork = uow;
PersistenceResponse prr1 = client.Post("/Persistence", prq1);
Assert.IsFalse(prr1.CommitResult.HasError, prr1.CommitResult.Message);
Пример работы с адаптерами
Currency curr1 = newCurrency();
curr1.Code = "RUR";
curr1.Name = "Currency 1";
CommitResult cr1 = curr1.Save();
Assert.IsFalse(cr1.HasError, cr1.Message);
Программа-клиент
В рамках простейшего WinForms-приложения создадим форму, содержащую сетки отображения финансовых годов и их периодов. Не вдаваясь в технику разработки приложений этого типа, просто приведу фрагменты кода, запрашивающие у служб коллекции соответствующих типов.
Извлечение списка финансовых годов, отфильтрованного по названию
FiscalYearCollection years = FiscalYearCollection.GetByQuery(
"from FiscalYear where Name like: name order by Name",
newServicesQueryParams()
AddParam("name", txtYearName.Text)
);
dgvYears.DataSource = years;
Извлечение списка учётных периодов заданного года
PeriodCollection periods = PeriodCollection.GetByQuery(
"from Period where FiscalYear.Id =:yearId order by FromDate",
newServicesQueryParams()
AddParam("yearId", CurrentYear.Id),
0, 1000);
dgvPeriods.DataSource = periods;
Запускаем клиентское приложение, предварительно запустив сервер веб-служб, и видим на экране примерно такую картинку, как на рис. 32.

Рис. 32.Форма отображения финансовых годов и учётных периодов
Читать дальшеИнтервал:
Закладка: