Архитектура ИС. Структурирование слоя бизнес-логики

Содержание

Слайд 2

Основные определения

Предметная область — часть реального мира, рассматриваемая в пределах данного контекста.

Основные определения Предметная область — часть реального мира, рассматриваемая в пределах данного
Под контекстом здесь может пониматься, например, область исследования или область, которая является объектом некоторой деятельности.

Слайд 3

Основные определения

Бизнес-процесс (Business process) – это совокупность взаимосвязанных мероприятий или задач, направленных

Основные определения Бизнес-процесс (Business process) – это совокупность взаимосвязанных мероприятий или задач,
на создание определенного продукта или услуги для потребителей. Для наглядности бизнес-процессы визуализируют при помощи блок-схемы бизнес-процессов.
Учёт успеваемости, Согласование договора, Формирование бюджета, и т.п., Учёт нематериальных активов, Подготовка специалиста в вузе.

Слайд 4

Основные определения

Бизнес-правило (БП) (Business rule) – правило, принятое в компании (бизнесе). Правило,

Основные определения Бизнес-правило (БП) (Business rule) – правило, принятое в компании (бизнесе).
которое определяет или ограничивает некоторый аспект бизнеса и при применении принимает значения Ложь или Истина. БП могут быть применены к людям, процессам, поведению компьютерных систем.
БП: Операция списания средств по кредитной карте не может быть проведена, если будет превышен допустимый овердрафт.
Дополнительные сведения здесь

Слайд 5

Основные определения

Бизнес-логика (Business logic, Domain logic) – Совокупность бизнес-правил, принципов, зависимостей поведения

Основные определения Бизнес-логика (Business logic, Domain logic) – Совокупность бизнес-правил, принципов, зависимостей
объектов предметной области (области человеческой деятельности, которую система поддерживает).

Слайд 6

Основные определения

Бизнес-транзакция (Business transaction) –
Определение 1. Это взаимодействие между бизнесом (компанией)

Основные определения Бизнес-транзакция (Business transaction) – Определение 1. Это взаимодействие между бизнесом
и его клиентами, вендорами и другими партнёрами.
Определение 2. Событие в экономике компании, в результате которого инициируется процесс учёта и производится запись данных о событии в информационной системе компании.
Регистрация ? Выбор счетов ? Указание суммы перевода ? Ввод подтверждающего кода (пришёл по SMS)

Слайд 7

Слои информационной системы

Источник картинки

Слои информационной системы Источник картинки

Слайд 8

Структурирование слоя БЛ по М. Фаулеру

Сценарий транзакции
Модуль таблицы
Модель предметной области

Структурирование слоя БЛ по М. Фаулеру Сценарий транзакции Модуль таблицы Модель предметной области

Слайд 9

Предметная область для примера

Предметная область для примера

Слайд 10

Сценарий транзакций

Способ организации бизнес-логики по процедурам, каждая из которых обслуживает один запрос,

Сценарий транзакций Способ организации бизнес-логики по процедурам, каждая из которых обслуживает один запрос, инициируемый споем представления
инициируемый споем представления

Слайд 11

Пример сценария транзакций

Вычисление зачётного дохода

Пример сценария транзакций Вычисление зачётного дохода

Слайд 12

Пример

class RecognitionService
{
private IDataGateway _dataGateway;
public SystemController(IDataGateway dataGateway)
{_dataGateway = dataGateway;}
public void CalculateRecognitions(int contractID)
{

Пример class RecognitionService { private IDataGateway _dataGateway; public SystemController(IDataGateway dataGateway) {_dataGateway =
var contract = _dataGateway.findContract(contractID);
var newRecognition = Calculate(contract);
_dataGateway.InsertRecognition(contractID, newRecognition);
}
}

Слайд 13

Варианты реализации сценария транзакции

Источник картинки здесь

Варианты реализации сценария транзакции Источник картинки здесь

Слайд 14

Сценарий транзакции. «За и против»

Преимущества:
представляет собой удобную процедурную модель, легко воспринимаемую всеми

Сценарий транзакции. «За и против» Преимущества: представляет собой удобную процедурную модель, легко
разработчиками;
удачно сочетается с простыми схемами организации слоя источника данных на основе типовых решений
определяет четкие границы транзакции.
Недостатки:
При возрастании сложности системы существенно повышается дублирование кода в различных сценариях выполнения
Поддержка состояний на уровне слоя БЛ затруднена.
Низкая тестопригодность

Слайд 15

Модуль таблицы

Объект, охватывающий логику обработки всех записей хранимой или виртуальной таблицы базы

Модуль таблицы Объект, охватывающий логику обработки всех записей хранимой или виртуальной таблицы базы данных
данных

Слайд 16

Модуль таблицы

Источник картинки здесь

Модуль таблицы Источник картинки здесь

Слайд 17

Пример

class Contracts : DataTable
{
public void Insert( int ContractId, string contractor, …){…}

Пример class Contracts : DataTable { public void Insert( int ContractId, string

public void Update( int ContractId, string newContractor, …) {…}
public void Delete( int ContractId) {…}
public bool Find( int ContractId) {…}
public object GetValue( string columnName){…}
public void SetValue( string columnName, object value){…}
void CalculateRecognitions( int ContractId)
}

Слайд 18

Пример

class Contract...
public void CalculateRecognitions( int contractID)
{
DataRow contractRow =

Пример class Contract... public void CalculateRecognitions( int contractID) { DataRow contractRow =
this[contractID]; Decimal amount = (Decimal)contractRow["amount"]; RevenueRecognition rr = new RevenueRecognition( table.DataSet);
Product prod = new Product(table.DataSet);
int prodID = GetProductld(contractID);
if (prod.GetProductType(prodID) == ProductType.WP) {
rr.Insert(contractID, amount, (DateTime)GetWhenSigned( contractlD) ) ;
} else if (prod.GetProductType(prodID) == ProductType.SS)
{
Decimal!] allocation = allocate (amount, 3); rr.Insert(contractID, allocation[0],(DateTime)GetWhenSigned(contractID));
rr.Insert(contractID, allocation[1], (DateTime)
GetWhenSigned(contractID).AddDays(60)); rr.Insert(contractID, allocation [2], (DateTime)
GetWhenSigned(contractID) .AddDays(90) ) ; } else if (prod.GetProductType(prodID) == ProductType.DB) {

Слайд 19

Пример

Decimal!] allocation = allocate(amount, 3); rr.Insert (contractID, allocation[0],
(DateTime)GetWhenSigned(contractID) )

Пример Decimal!] allocation = allocate(amount, 3); rr.Insert (contractID, allocation[0], (DateTime)GetWhenSigned(contractID) ) ;
;
rr.Insert (contractID, allocation[1], (DateTime)
GetWhenSigned(contractID).AddDays(30)); rr.Insert (contractID, allocation[2],
(DateTime)
GetWhenSigned(contractID).AddDays(60));
}
else throw new Exception("invalid product id");
}

Слайд 20

Модуль таблицы. «За и против»

Преимущества:
Представляет понятное решение – компромиссный вариант между сценарием

Модуль таблицы. «За и против» Преимущества: Представляет понятное решение – компромиссный вариант
транзакции и моделью предметной области
Представляет удобную абстракцию реляционного (или другой модели) хранилища на уровне слоя
Позволяет использовать некоторые объектно-ориентированные решения для декомпозиции системы в соответствие с моделью базы данных
Поддерживается многими средами разработки для создания приложений, ориентированных на взаимодействие с базами данных.
Тестопригодность – средняя.
Недостатки:
Невозможно задействовать многие из техник объектного подхода (типовых шаблонов проектирования), таких как наследование, стратегия, состояние, прокси и другие при разработке
Сильная привязка к модели хранения данных
Оперирование наборами данных не позволяет проводить объектную декомпозицию до уровня отдельных сущностей, ограничиваясь назначением обязанностей на уровне таблицы в целом.

Слайд 21

DataSet (.NET Framework)

Представляет т.н. отсоединённый набор данных в табличном виде
Не зависит от

DataSet (.NET Framework) Представляет т.н. отсоединённый набор данных в табличном виде Не
используемой СУБД.
Для управления данными (выборка, обновление, вставка, удаление) в наборе используются адаптеры таблиц

Слайд 22

public partial class OrderWindow : Form
{
public OrderWindow()
{
InitializeComponent();
}

public partial class OrderWindow : Form { public OrderWindow() { InitializeComponent(); }
private void OrderWindow_Load(object sender, EventArgs e)
{
orderItemTableAdapter.Fill(sampleData.OrderItem);
orderTableAdapter.Fill(sampleData.Order);
}
private void SaveBtn_Click(object sender, EventArgs e)
{
orderTableAdapter.Update(sampleData.Order);
orderItemTableAdapter.Update(sampleData.OrderItem);
}
}

Слайд 23

Данные привязки

Данные привязки

Слайд 24

Модель предметной области

Объектная модель домена, охватывающая поведение (функции) и свойства (данные)

Модель предметной области Объектная модель домена, охватывающая поведение (функции) и свойства (данные)

Слайд 25

Пример модели предметно й области

Вычисление зачётного дохода

Пример модели предметно й области Вычисление зачётного дохода

Слайд 26

Пример

class Contract : Entity
{
Product _product;
public Recognition CalculateRecognitions()
{
return _product.CalculateRecognitions(

Пример class Contract : Entity { Product _product; public Recognition CalculateRecognitions() {
this );
}
}

Слайд 27

Пример

class Product : Entity
{
public Product(IRecognitionStrategy recStrategy)
{ _recStrategy = recStrategy; }

Пример class Product : Entity { public Product(IRecognitionStrategy recStrategy) { _recStrategy =
private IRecognitionStrategy _recStrategy;
public Recognition CalculateRecognitions(Contract contract)
{
return _recStrategy.CalculateRecognition(contract, this);
}
}

Слайд 28

Модель предметной области. «За и против»

Преимущества:
Высокая эффективность борьбы со сложностью предметной области

Модель предметной области. «За и против» Преимущества: Высокая эффективность борьбы со сложностью
за счёт возможности использования всего арсенала средств моделирования (ОО, DSL,…)
Высокое приближение модели к моделируемой предметной области.
Поддержка со стороны современных средств разработки.
Тестопригодность – высокая.
Недостатки:
Более высокие требования к квалификации разработчиков
При отсутствии поддержки со стороны средств разработки требуются значительные ресурсы на выстраивание архитектуры решения
Усложнённая схема отображения между объектной моделью и реляционной.

Слайд 29

Зависимость стоимости реализации различных схем организации БЛ от её сложности

Источник картинки здесь

Зависимость стоимости реализации различных схем организации БЛ от её сложности Источник картинки здесь

Слайд 30

Уровень служб (сервисов)

Источник картинки

Уровень служб (сервисов) Источник картинки

Слайд 31

Расщепление слоя БЛ

Слой бизнес-логики

Слой служб (фасад приложения)

модель бизнес-логики

Расщепление слоя БЛ Слой бизнес-логики Слой служб (фасад приложения) модель бизнес-логики

Слайд 32

Назначение слоя служб

Определяет границы приложения и множество операций, предостав­ляемых им для интерфейсных

Назначение слоя служб Определяет границы приложения и множество операций, предостав­ляемых им для
клиентских слоев кода.
Инкапсулирует бизнес-логику приложения, управляет транзакциями и координирует реакции на действия.
Может служить для реализации аспектов (безопасность, кэширование, логирование, и т.д.)

Слайд 33

Варианты реализации слоя служб

Интерфейс доступа к домену (domain facade)
Сценарий операции (operation

Варианты реализации слоя служб Интерфейс доступа к домену (domain facade) Сценарий операции (operation script).
script).

Слайд 34

Интерфейс доступа к домену

Реализуется как набор "тонких" интерфейсов, размещенных "поверх" модели предметной

Интерфейс доступа к домену Реализуется как набор "тонких" интерфейсов, размещенных "поверх" модели
области.
В классах, реализующих интерфейсы, никакая бизнес-логика отражения не на­ходит — она сосредоточена исключительно в контексте модели предметной области.
Тон­кие интерфейсы устанавливают границы и определяют множество операций, посредст­вом которых клиентские слои взаимодействуют с приложением.

Слайд 35

Сценарий операции

Реализуется слой служб как множество более "толстых" классов, которые непосредственно воплощают

Сценарий операции Реализуется слой служб как множество более "толстых" классов, которые непосредственно
в себе логику приложения, но за бизнес-логикой обращаются к классам домена.
Операции, предоставляемые клиентам слоя служб, реализуются в виде сценариев, создаваемых группами в контексте классов, каж­дый из которых определяет некоторый фрагмент соответствующей логики.

Слайд 36

Варианты взаимодействия слоя служб и слоя БЛ

Варианты взаимодействия слоя служб и слоя БЛ

Слайд 37

1-1 (Сценарий операции – сценарий транзакции)

1-1 (Сценарий операции – сценарий транзакции)

Слайд 38

1-1 (Модуль таблицы – сценарий операции)

1-1 (Модуль таблицы – сценарий операции)

Слайд 39

3-1 (Модель предметной области– сценарий операции)

3-1 (Модель предметной области– сценарий операции)

Слайд 40

Типовые конфигурации слоя служб и слоя БЛ (На базе интерфейса доступа к домену)

Типовые конфигурации слоя служб и слоя БЛ (На базе интерфейса доступа к домену)

Слайд 41

Граница-Контроллер – Сущность

Граница-Контроллер – Сущность

Слайд 42

Граница-Контроллер – Сущность

Граница-Контроллер – Сущность

Слайд 43

Супертип слоя

Тип, выполняющий роль суперкласса для всех классов своего слоя
Может быть определён

Супертип слоя Тип, выполняющий роль суперкласса для всех классов своего слоя Может
для любого слоя
Упрощает задачи интеграции компонентов системы, тестируемость, поощряет изменчивость.
Используется для задания (спецификации) общего поведения типов некоторого слоя.
Например, можно определить для слоя БЛ тип IDomainObject, задающий спецификацию всех типов МПО.

Слайд 44

Пример супертипа слоя служб

Интерфейс IATMService задаёт спецификацию операция, выполняемых системой (банкоматом)
Позволяет развивать

Пример супертипа слоя служб Интерфейс IATMService задаёт спецификацию операция, выполняемых системой (банкоматом)
систему независимо от наличия всех аппаратных компонентов
Обеспечивает «безболезненную» интеграцию системы в рабочую среду.

Слайд 45

Пример. АТМ

Пример. АТМ

Слайд 46

static class Program
{
///


/// The main entry point

static class Program { /// /// The main entry point for the
for the application.
///
[STAThread]
static void Main()
{
const int PIN = 1234;
const string CardNum = "6578-3456-2345-6678";
const int DefMaxPinLen = 4;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new PINWIndow(
new PinController(DefMaxPinLen,
new StubCreditCardDevice(CardNum),
new StubDataGateway(CardNum, PIN))));
}
}

Слайд 47

public partial class PINWIndow : Form
{
private readonly PinController _pinController;
public PINWIndow(PinController

public partial class PINWIndow : Form { private readonly PinController _pinController; public
pinController)
{
_pinController = pinController;
InitializeComponent();
}
private void SubmitButtonClick(object sender, EventArgs e)
{
var pin = Convert.ToInt32(pinTextBox.Text);
var result = _pinController.EnterPin(pin);
MessageBox.Show("Enter PIN result is:" + result);
}
private void EnterDigitClick(object sender, EventArgs e)
{
var maxPinLen = _pinController.MaxPinLength;
if (pinTextBox.Text.Length >= maxPinLen)
return;
pinTextBox.Text += (sender as Button).Text;
}
private void ClearPressed(object sender, EventArgs e)
{
pinTextBox.Clear();
}
}

Слайд 48

public class PinController
{
private readonly ICreditCardDevice _creditCardDevice;
private readonly IDataGateway

public class PinController { private readonly ICreditCardDevice _creditCardDevice; private readonly IDataGateway _dataGateway;
_dataGateway;
public PinController(int maxPinLen, ICreditCardDevice creditCardDevice, IDataGateway dataGateway)
{
_creditCardDevice = creditCardDevice;
_dataGateway = dataGateway;
MaxPinLength = maxPinLen;
}
public int MaxPinLength { get; private set; }
public bool EnterPin(int pin)
{
var creditCard = _dataGateway.GetCreditCardByNumber(_creditCardDevice.CreditCardNum);
return (creditCard != null) && (creditCard.Pin == pin);
}
}

Слайд 49

public interface ICreditCardDevice
{
string CreditCardNum { get; }
}

class

public interface ICreditCardDevice { string CreditCardNum { get; } } class StubCreditCardDevice
StubCreditCardDevice : ICreditCardDevice
{
public StubCreditCardDevice(string ccNum)
{
CreditCardNum = ccNum;
}
public string CreditCardNum { get; private set; }
}

Слайд 50

public interface IDataGateway
{
CreditCard GetCreditCardByNumber(string ccNum);
}

class StubDataGateway : IDataGateway
{

public interface IDataGateway { CreditCard GetCreditCardByNumber(string ccNum); } class StubDataGateway : IDataGateway
private readonly string _ccNum;
private readonly int _pin;
public StubDataGateway(string ccNum, int pin)
{
_ccNum = ccNum;
_pin = pin;
}
public CreditCard GetCreditCardByNumber(string ccNum)
{
if (ccNum==_ccNum)
return new CreditCard(){Number = _ccNum, Account = new Account(){Amount = 1000}, Pin = _pin};
return null;
}
}

Слайд 51

public class CreditCard
{
public string Number { get; set; }

public class CreditCard { public string Number { get; set; } public
public Account Account { get; set; }
public int Pin { get; set; }
}

public class Account
{
public decimal Amount { get; set; }
}

Слайд 52

Application Controller

Позволяет инкапсулировать логику навигации по приложению

Application Controller Позволяет инкапсулировать логику навигации по приложению

Слайд 53

Model-View-Controller

Model-View-Controller

Слайд 54

Observer (наблюдатель)

Observer (наблюдатель)
Имя файла: Архитектура-ИС.-Структурирование-слоя-бизнес-логики.pptx
Количество просмотров: 28
Количество скачиваний: 0