Игорь Карпенко "Data, Context, Interaction – парадигма...
-
Upload
fwdays -
Category
Technology
-
view
190 -
download
1
Transcript of Игорь Карпенко "Data, Context, Interaction – парадигма...
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/