Игорь Карпенко "Data, Context, Interaction – парадигма...

Preview:

Citation preview

Data, Context, InteractionИгорь КарпенкоVirus Music

Data, Context, Interaction

• Data, Context, Interaction – парадигма программирования от автора шаблона MVC, Тригве Реенскауга.

PHP Frameworks Day 2016Data, Context, Interaction

Data, Context, Interaction

• DCI делит систему на две части: то, чем система является, и то, что система делает.

PHP Frameworks Day 2016Data, Context, Interaction

Data, Context, Interaction

• DCI делит систему на две части: то, чем система является, и то, что система делает.

• То, чем система является, - отражает структуру данных, которыми оперирует система. Эта часть системы либо неизменна, либо меняется редко.

PHP Frameworks Day 2016Data, Context, Interaction

Data, Context, Interaction

• DCI делит систему на две части: то, чем система является, и то, что система делает.

• То, чем система является, - отражает структуру данных, которыми оперирует система. Эта часть системы либо неизменна, либо меняется редко.

• То, что система делает, - контекстно-зависимое, быстро изменяющееся поведение системы.

PHP Frameworks Day 2016Data, Context, Interaction

Data, Context, Interaction

• Context (контекст) – это конкретный сценарий (use case), в котором принимают участие данные.

PHP Frameworks Day 2016Data, Context, Interaction

Data, Context, Interaction

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

PHP Frameworks Day 2016Data, Context, Interaction

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Mixins

Объектно-ориентированные концепции, которые пересекаются с ключевыми идеями DCI:

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Mixins

Объектно-ориентированные концепции, которые пересекаются с ключевыми идеями DCI:

Traits

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Mixins

Объектно-ориентированные концепции, которые пересекаются с ключевыми идеями DCI:

Traits

Множественная диспетчеризация

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Mixins

Объектно-ориентированные концепции, которые пересекаются с ключевыми идеями DCI:

Traits

Множественная диспетчеризация

Dependency injection

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Mixins

Объектно-ориентированные концепции, которые пересекаются с ключевыми идеями DCI:

Traits

Множественная диспетчеризация

Dependency injection

AOP

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Mixins

Объектно-ориентированные концепции, которые пересекаются с ключевыми идеями DCI:

Traits

Множественная диспетчеризация

Dependency injection

AOP

Role-oriented programming

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Mixins

Объектно-ориентированные концепции, которые пересекаются с ключевыми идеями DCI:

Traits

Множественная диспетчеризация

Dependency injection

AOP

Role-oriented programming

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Role-oriented programming

SCROLLSCala ROLes Language

You are able to define compartments, roles and play-relationships. Invoking Role-methods is done via the Dynamic trait.

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Role-oriented programming

SCROLLSCala ROLes Language

You are able to define compartments, roles and play-relationships. Invoking Role-methods is done via the Dynamic trait.

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Traits

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Traits

class SomeClass {

// …

use SomeTrait;

// …

}

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Traits

class SomeClass {

// …

use $someTrait;

// …

}

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Object A

Object B

Object C

Object D

Message B1

Message C1

Message D1

Message D2

Use Case

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Object A

Object B

Object C

Object D

Message B1

Message C1

Message D1

Message D2

Use Case 1

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Object A

Object B

Object C

Object D

Message B2

Message D3

Use Case 2

Message B3

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Object A

Object B

Object C

Object D

Message B1

Message C1

Message D1

Message D2

Use Case 1

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Object A

Object B

Object C

Object D

Use Case 1 (Context)

Role X

Message B1

Role Y

Message C1

Role Z

Message A1

Role W

Message D1Message D2

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Fatty – библиотека для PHP, которая реализует DCI.

https://github.com/kirkbushell/fatty

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Reverse Wrapper – техника реализации DCI в PHP.

Пример реализации: https://github.com/mbrowne/dci-php

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

Data

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

Data

Context

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

Data

Context

Interaction

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

<?phpnamespace DataObjects;class Account implements \DCI\RolePlayerInterface{

use \DCI\RolePlayer;

private $balance = 0;

function __construct($initialBalance) {$this->balance = $initialBalance;

}function getBalance() {

return $this->balance;}function increaseBalance($amount) {

$this->balance += $amount;}function decreaseBalance($amount) {

$this->balance -= $amount;}

}

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

namespace UseCases{

class TransferMoney extends \DCI\Context{

public $sourceAccount;public $destinationAccount;public $amount;

function __construct($sourceAccount, $destinationAccount, $amount) {$this->sourceAccount = $sourceAccount->addRole('SourceAccount', $this);$this->destinationAccount = $destinationAccount->addRole('DestinationAccount', $this);$this->amount = $amount;

}

function transfer() {$this->sourceAccount->transferOut($this->amount);

}}

}

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

//…

$this->sourceAccount = $sourceAccount->addRole('SourceAccount', $this);

$this->destinationAccount = $destinationAccount->addRole('DestinationAccount', $this);

//…

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

//…

$this->sourceAccount = $sourceAccount->addRole('SourceAccount', $this);

$this->destinationAccount = $destinationAccount->addRole('DestinationAccount', $this);

//…trait SourceAccount{

function withdraw($amount) {$this->decreaseBalance($amount);

}

function transferOut($amount) {$this->context->destinationAccount->deposit($amount);$this->withdraw($amount);

}

}

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

//…

$this->sourceAccount = $sourceAccount->addRole('SourceAccount', $this);

$this->destinationAccount = $destinationAccount->addRole('DestinationAccount', $this);

//…

trait DestinationAccount{

function deposit($amount) {$this->increaseBalance($amount);

}

}

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

$acct1 = new \DataObjects\Account(20);$acct2 = new \DataObjects\Account(0);

$moneyTransfer = new \UseCases\TransferMoney($acct1, $acct2, 10);

$moneyTransfer->transfer();

var_dump($acct1->getBalance(), $acct2->getBalance());

https://github.com/mbrowne/dci-php

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Не стоит забывать о…

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Не стоит забывать о…

YAGNI

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Не стоит забывать о…

YAGNI KISS

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Не стоит забывать о…

YAGNI KISS DRY

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Не стоит забывать о…

YAGNI KISS try to DRY

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

S O L I D

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

S O L I Dinterface segregation principle

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

S O L I Dinterface segregation principle

HeaderInterface/RoleInterface

(M. Fowler)

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

S O L I Dinterface segregation principle

HeaderInterface/RoleInterface

(M. Fowler)

http://martinfowler.com/bliki/RoleInterface.html

Data, Context, Interaction

PHP Frameworks Day 2016Data, Context, Interaction

Ссылки для дальнейшего изучения:

http://www.artima.com/articles/dci_vision.html

http://fulloo.info/

Recommended