SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
Четвертая конференция
разработчиков ПО«DevParty»
2 апреля 2016 года, Вологда
Валерий Чугреев
Архитектура MVC в контексте web-
разработки – проблемы и решения
vk.com/chugreev
План выступления
1. Вводная часть: фреймворки, MVC, ActiveRecord.
2. Имеющиеся проблемы и сложности,
порождаемые MVC-фреймворками.
3. Пути решения проблем. Демонстрационный
проект.
4. Плюсы и минусы предлагаемого подхода.
Примеры на PHP, Yii2
1. Вводная часть: фреймворки,
MVC, ActiveRecord
Фреймворк – это «каркас»,
программная инфраструктура,
позволяющая достаточно быстро
разработать программное решение.
Аналогия со строительством дома…
«Фреймворк – набор программных сущностей
(таких как классы, объекты и компоненты), которые
помогают строить реюзабельную архитектуру для
схожих приложений. Ожидается, что для создания
приложения разработчик расширит и настроит
фреймворк путем добавления своей логики».
Источник: «Принципы, которые формируют успешные
фреймворки» (перевод статьи Qiang Xue – создателя
фреймворка Yii) http://haru-atari.com/blog/4/philosophies-
that-shaped-successful-frameworks
MVC
«Active Record обеспечивает объектно-
ориентированный интерфейс для доступа и
манипулирования данными, хранящимися в базах
данных.
Класс Active Record соответствует таблице в базе
данных, объект Active Record соответствует строке
этой таблицы, а атрибут объекта Active Record
представляет собой значение отдельного столбца
строки».
Из документации Yii.
Active Record
id title content
1 Проект №1 Содержимое 1
2 Проект №2 Содержимое 2
Project
$id
$title
$content
find()
insert()
save()
update()
save()
2. Имеющиеся проблемы и
сложности, порождаемые
MVC-фреймворками
• Нарушение принципа единичной
ответственности.
• Высокая связность.
Степень связанности— это мера, определяющая,
насколько жестко один элемент связан с другими
элементами, либо каким количеством данных о других
элементах он обладает. Объект с низкой степенью
связанности зависит от не очень большого числа других
объектов и имеет следующие свойства:
• Малое число зависимостей между классами
(подсистемами).
• Слабая зависимость одного класса (подсистемы) от
изменений в другом классе (подсистеме).
• Высокая степень повторного использования подсистем.
Крэг Ларман, «Применение UML 2.0 и шаблонов проектирования».
<?php
foreach ($model->find()->all() as $project) {
echo $project->title . '<br>';
}
?>
public function actionAll()
{
return $this->render('all', ['model' => new Project()]);
}
Controller
View
<?php
foreach (Project::find()->all() as $project) {
echo $project->title . '<br>';
}
?>
View
public function actionHistory($id)
{
$task = $this->findTask($id);
$project = $task->project;
$this->currentUserCanManage($project);
$query = Modification::find()->confirmed()
->andWhere(['latest_id' => $task->id])
->orderBy(['created_at' => SORT_DESC]);
$params = ArrayHelper::merge(
['query' => $query], Yii::$app->request->queryParams
);
…
return $this->render('history', …
}
1 2 3 4
1 2 3 4
На одном уровне абстракции
На разных уровнях абстракции
/**
* @property integer $id
* @property string $title
* @property string $content
*/
class Project extends yiidbActiveRecord
{
public static function tableName()
{
return 'project';
}
public function rules()
{
return [
[['title', 'content'], 'required'],
[['content'], 'string'],
[['title'], 'string', 'max' => 255]
];
}
}
Model
Model
rules()
attributeLabels()
BaseActiveRecord
ActiveRecord
use appmodelsProject;
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
protected function findModel($id)
{
if (($model = Project::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page
does not exist.');
}
}
Controller
<h1><?= $model->title ?></h1>
<div class="content">
<?= $model->content ?>
</div>
View
Project ProjectController
View
3. Пути решения проблем
• Выделение слоя логики (Domain Layer).
• Разграничение ответственности.
• Внедрение зависимостей (Dependency Injection).
Демонстрационный проект…
<<Интерфейс>>
appmodelsdomainProjectRepository
get(int $id)
appmodelsarProjectRepository
get(int $id)
appmodelsarProject
appmodelsdomainProject
ProjectController
View
Расслоение модели Project
/**
* @property integer $id
* @property string $title
* @property string $content
*/
class Project extends yiidbActiveRecord
{
public static function tableName()
{
return 'project';
}
}
modelsstorageProject.php
namespace appmodelsdomain;
trait _Project {
public $id;
public $title;
public $content;
}
modelsdomain_Project.php
namespace appmodelsdomain;
use yiibaseModel;
class Project extends Model
{
use _Project;
use apputilityReplicate;
public function rules()
{
return [
[['title', 'content'], 'required'],
[['content'], 'string'],
[['id'], 'integer'],
[['title'], 'string', 'max' => 255]
];
}
modelsdomainProject.php
use appmodelsdomainProjectRepository;
class ProjectController extends Controller
{
private $repository;
public function __construct($id, $module,
ProjectRepository $repository, $config = [])
{
parent::__construct($id, $module, $config = []);
$this->repository = $repository;
}
…
}
ProjectController.php
…
Yii::$container->set('appmodelsdomainProjectRepository',
'appmodelsstorageProjectRepository');
(new yiiwebApplication($config))->run();
Index.php
public function actionView($id)
{
return $this->render('view', ['model' => $this->findModel($id)]);
}
protected function findModel($id) : Project
{
$model = $this->repository->get($id);
if ($model !== null) {
return Project::createObject($model);
} else {
throw new NotFoundHttpException(
'The requested page does not exist.');
}
}
ProjectController.phpuse appmodelsdomainProject;
namespace appmodelsdomain;
interface ProjectRepository
{
function get(int $id);
function create(Project $project) : int;
function save(Project $project) : bool;
function delete(int $id) : bool;
}
modelsdomainProjectRepository.php
modelsstorageProjectRepository.php
namespace appmodelsstorage;
use appmodelsdomain as domain;
class ProjectRepository implements domainProjectRepository
{
public function get(int $id)
{
$project = Project::findOne($id);
return !is_null($project)
? domainProject::createObject($project) : null;
}
…
}
Project
$id
$title
$content
modelsstorageProject.php
Project
$id
$title
$content
modelsdomainProject.php
Replicate
trait Replicate
{
static private $domainTrait = '';
static private $domainNamespace = 'appmodelsdomain';
static function createObject($copiedObject)
{
$currentClass = get_called_class();
$newObject = new $currentClass;
self::copyObject($newObject, $copiedObject);
return $newObject;
}
static function copyObject($toObject, $fromObject)
{
$properties = get_class_vars(self::pattern());
foreach ($properties as $name => $value) {
$toObject->$name = $fromObject->$name;
}
}
utilityReplicate.php
static private function pattern()
{
if (!empty(static::$domainTrait)) {
return static::$domainTrait;
}
self::setDomainTraitDefault();
return static::$domainTrait;
}
static private function setDomainTraitDefault()
{
$reflection = new ReflectionClass(get_called_class());
$name = $reflection->getShortName();
static::$domainTrait = '' . self::$domainNamespace
. '_' . $name;
}
}
utilityReplicate.php
public function get(int $id)
{
$project = Project::findOne($id);
return !is_null($project)
? domainProject::createObject($project) : null;
}
public function save(domainProject $project) : bool
{
$projectStorage = Project::findOne($project->id);
domainProject::copyObject($projectStorage, $project);
return $projectStorage->save();
}
modelsstorageProjectRepository.php
4. Плюсы и минусы подхода
Спасибо за внимание!
Валерий Чугреев
vk.com/chugreev

Weitere ähnliche Inhalte

Was ist angesagt?

Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософияPaul Klimov
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7Technopark
 
создание живых сайтов
создание живых сайтовсоздание живых сайтов
создание живых сайтовmetaform
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Fedor Lavrentyev
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхKirill Zotin
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переигралEugene Zharkov
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.Igor Shkulipa
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderАлександр Брич
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.Igor Shkulipa
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020OdessaJS Conf
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersГлеб Тарасов
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Ontico
 
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшeQA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшeQAFest
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverИлья Кожухов
 
Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Noveo
 

Was ist angesagt? (20)

Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7
 
создание живых сайтов
создание живых сайтовсоздание живых сайтов
создание живых сайтов
 
Yii development
Yii developmentYii development
Yii development
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталях
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переиграл
 
Laravel 4 fwdays
Laravel 4 fwdaysLaravel 4 fwdays
Laravel 4 fwdays
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшeQA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)
 

Andere mochten auch

Александр Тарасов, Playrix — Продвижение мобильных приложений (user acquisition)
Александр Тарасов, Playrix — Продвижение мобильных приложений (user acquisition)Александр Тарасов, Playrix — Продвижение мобильных приложений (user acquisition)
Александр Тарасов, Playrix — Продвижение мобильных приложений (user acquisition)Dev_Party
 
Удалённое управление бизнесом - история Квестории
Удалённое управление бизнесом - история КвесторииУдалённое управление бизнесом - история Квестории
Удалённое управление бизнесом - история КвесторииAlexey Korsun
 
Pavel Baburov - User acquisition problems in Zeptolab
Pavel Baburov - User acquisition problems in ZeptolabPavel Baburov - User acquisition problems in Zeptolab
Pavel Baburov - User acquisition problems in ZeptolabTargetSummit
 
Маркетинг - это физика XXI века
Маркетинг - это физика XXI векаМаркетинг - это физика XXI века
Маркетинг - это физика XXI векаArtemy Malkov, PhD
 
Мобильный маркетинг: типы трафика, аналитика. Часть материалов тренинга 2-3 а...
Мобильный маркетинг: типы трафика, аналитика. Часть материалов тренинга 2-3 а...Мобильный маркетинг: типы трафика, аналитика. Часть материалов тренинга 2-3 а...
Мобильный маркетинг: типы трафика, аналитика. Часть материалов тренинга 2-3 а...Eugene Lisovskiy
 
User Acquisition
User AcquisitionUser Acquisition
User AcquisitionZENNA
 
Секреты Успешного Арбитража Мобильных Игр - Юра Яшунин, CPAConf 2015
Секреты Успешного Арбитража Мобильных Игр - Юра Яшунин, CPAConf 2015Секреты Успешного Арбитража Мобильных Игр - Юра Яшунин, CPAConf 2015
Секреты Успешного Арбитража Мобильных Игр - Юра Яшунин, CPAConf 2015ZENNA
 
Mobio Media Kit
Mobio Media KitMobio Media Kit
Mobio Media KitAppTractor
 
Грамотный User Acquisition
Грамотный User AcquisitionГрамотный User Acquisition
Грамотный User AcquisitionZENNA
 
Imperio bizantino II
Imperio bizantino IIImperio bizantino II
Imperio bizantino IIaandres
 
Imperio bizantino I
Imperio  bizantino IImperio  bizantino I
Imperio bizantino Iaandres
 

Andere mochten auch (13)

Александр Тарасов, Playrix — Продвижение мобильных приложений (user acquisition)
Александр Тарасов, Playrix — Продвижение мобильных приложений (user acquisition)Александр Тарасов, Playrix — Продвижение мобильных приложений (user acquisition)
Александр Тарасов, Playrix — Продвижение мобильных приложений (user acquisition)
 
Удалённое управление бизнесом - история Квестории
Удалённое управление бизнесом - история КвесторииУдалённое управление бизнесом - история Квестории
Удалённое управление бизнесом - история Квестории
 
Pavel Baburov - User acquisition problems in Zeptolab
Pavel Baburov - User acquisition problems in ZeptolabPavel Baburov - User acquisition problems in Zeptolab
Pavel Baburov - User acquisition problems in Zeptolab
 
Igor Elovikov, Playrix
Igor Elovikov, PlayrixIgor Elovikov, Playrix
Igor Elovikov, Playrix
 
Маркетинг - это физика XXI века
Маркетинг - это физика XXI векаМаркетинг - это физика XXI века
Маркетинг - это физика XXI века
 
Мобильный маркетинг: типы трафика, аналитика. Часть материалов тренинга 2-3 а...
Мобильный маркетинг: типы трафика, аналитика. Часть материалов тренинга 2-3 а...Мобильный маркетинг: типы трафика, аналитика. Часть материалов тренинга 2-3 а...
Мобильный маркетинг: типы трафика, аналитика. Часть материалов тренинга 2-3 а...
 
User Acquisition
User AcquisitionUser Acquisition
User Acquisition
 
Секреты Успешного Арбитража Мобильных Игр - Юра Яшунин, CPAConf 2015
Секреты Успешного Арбитража Мобильных Игр - Юра Яшунин, CPAConf 2015Секреты Успешного Арбитража Мобильных Игр - Юра Яшунин, CPAConf 2015
Секреты Успешного Арбитража Мобильных Игр - Юра Яшунин, CPAConf 2015
 
Mobio Media Kit
Mobio Media KitMobio Media Kit
Mobio Media Kit
 
Грамотный User Acquisition
Грамотный User AcquisitionГрамотный User Acquisition
Грамотный User Acquisition
 
Imperio bizantino
Imperio bizantinoImperio bizantino
Imperio bizantino
 
Imperio bizantino II
Imperio bizantino IIImperio bizantino II
Imperio bizantino II
 
Imperio bizantino I
Imperio  bizantino IImperio  bizantino I
Imperio bizantino I
 

Ähnlich wie Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — проблемы и решения

#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...JSib
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NETVitaly Baum
 
Yii2
Yii2Yii2
Yii2Noveo
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЯковенко Кирилл
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.Igor Shkulipa
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворкиRoman Brovko
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1dima_kuzovlev
 
Backbone.js Профилактика сколиоза
Backbone.js Профилактика сколиоза Backbone.js Профилактика сколиоза
Backbone.js Профилактика сколиоза MitinPavel
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.Igor Shkulipa
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.Igor Shkulipa
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidDataArt
 

Ähnlich wie Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — проблемы и решения (20)

#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
 
Yii2
Yii2Yii2
Yii2
 
Tdd php
Tdd phpTdd php
Tdd php
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-framework
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
 
Backbone.js Профилактика сколиоза
Backbone.js Профилактика сколиоза Backbone.js Профилактика сколиоза
Backbone.js Профилактика сколиоза
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Grails & Groovy
Grails & GroovyGrails & Groovy
Grails & Groovy
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
 
Backbone lesson 1
Backbone lesson 1Backbone lesson 1
Backbone lesson 1
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в android
 

Mehr von Dev_Party

Сергей Яркин, Тензор — RabbitMQ. Насколько ценен мех и вкусно мясо?
Сергей Яркин, Тензор — RabbitMQ. Насколько ценен мех и вкусно мясо?Сергей Яркин, Тензор — RabbitMQ. Насколько ценен мех и вкусно мясо?
Сергей Яркин, Тензор — RabbitMQ. Насколько ценен мех и вкусно мясо?Dev_Party
 
Александр Чистяков, Git in Sky — Современные тенденции в разработке программн...
Александр Чистяков, Git in Sky — Современные тенденции в разработке программн...Александр Чистяков, Git in Sky — Современные тенденции в разработке программн...
Александр Чистяков, Git in Sky — Современные тенденции в разработке программн...Dev_Party
 
Игорь Цупко, Notamedia — Документация? Не слышал
Игорь Цупко, Notamedia — Документация? Не слышалИгорь Цупко, Notamedia — Документация? Не слышал
Игорь Цупко, Notamedia — Документация? Не слышалDev_Party
 
Александр Сербул, 1С-Битрикс — Облачный сервис персональных рекомендаций для ...
Александр Сербул, 1С-Битрикс — Облачный сервис персональных рекомендаций для ...Александр Сербул, 1С-Битрикс — Облачный сервис персональных рекомендаций для ...
Александр Сербул, 1С-Битрикс — Облачный сервис персональных рекомендаций для ...Dev_Party
 
Анастасия Распопина, Percona — Feel at Home в на 90% распределённой компании:...
Анастасия Распопина, Percona — Feel at Home в на 90% распределённой компании:...Анастасия Распопина, Percona — Feel at Home в на 90% распределённой компании:...
Анастасия Распопина, Percona — Feel at Home в на 90% распределённой компании:...Dev_Party
 
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностейДенис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностейDev_Party
 
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...Dev_Party
 
Елена Никитина, Аналитический центр при Правительстве РФ — Путь питониста, ил...
Елена Никитина, Аналитический центр при Правительстве РФ — Путь питониста, ил...Елена Никитина, Аналитический центр при Правительстве РФ — Путь питониста, ил...
Елена Никитина, Аналитический центр при Правительстве РФ — Путь питониста, ил...Dev_Party
 
Анна Крижановская, Playrix — Продвижение мобильных приложений: Deep Dive
Анна Крижановская, Playrix — Продвижение мобильных приложений: Deep DiveАнна Крижановская, Playrix — Продвижение мобильных приложений: Deep Dive
Анна Крижановская, Playrix — Продвижение мобильных приложений: Deep DiveDev_Party
 
Денис Каленбет, АО «Эр-Стайл Софтлаб» — Самокапитализация программиста. Как п...
Денис Каленбет, АО «Эр-Стайл Софтлаб» — Самокапитализация программиста. Как п...Денис Каленбет, АО «Эр-Стайл Софтлаб» — Самокапитализация программиста. Как п...
Денис Каленбет, АО «Эр-Стайл Софтлаб» — Самокапитализация программиста. Как п...Dev_Party
 
Игорь Иванов, Playrix — Статистические предсказания игровой активности
Игорь Иванов, Playrix — Статистические предсказания игровой активностиИгорь Иванов, Playrix — Статистические предсказания игровой активности
Игорь Иванов, Playrix — Статистические предсказания игровой активностиDev_Party
 
Владимир Варнавский, интернет-студия «33 Кита» — Идеальный программист
Владимир Варнавский, интернет-студия «33 Кита» — Идеальный программистВладимир Варнавский, интернет-студия «33 Кита» — Идеальный программист
Владимир Варнавский, интернет-студия «33 Кита» — Идеальный программистDev_Party
 
Андрей Валдуев, Playrix — Основы тестирования и примеры использования базовых...
Андрей Валдуев, Playrix — Основы тестирования и примеры использования базовых...Андрей Валдуев, Playrix — Основы тестирования и примеры использования базовых...
Андрей Валдуев, Playrix — Основы тестирования и примеры использования базовых...Dev_Party
 
Роман Приходько, Владимир Беспрозванных, «Сбербанк-Технологии» — Платформа ЕФС
Роман Приходько, Владимир Беспрозванных, «Сбербанк-Технологии» — Платформа ЕФСРоман Приходько, Владимир Беспрозванных, «Сбербанк-Технологии» — Платформа ЕФС
Роман Приходько, Владимир Беспрозванных, «Сбербанк-Технологии» — Платформа ЕФСDev_Party
 
Владимир Варнавский, 33 Кита — Как запускать проекты вовремя
Владимир Варнавский, 33 Кита — Как запускать проекты вовремяВладимир Варнавский, 33 Кита — Как запускать проекты вовремя
Владимир Варнавский, 33 Кита — Как запускать проекты вовремяDev_Party
 
Николай Мамадаев — Процесс создания дизайна мобильного приложения
Николай Мамадаев — Процесс создания дизайна мобильного приложения Николай Мамадаев — Процесс создания дизайна мобильного приложения
Николай Мамадаев — Процесс создания дизайна мобильного приложения Dev_Party
 
20% задач, которые дают 80% результата — главное при разработке коммерческих ...
20% задач, которые дают 80% результата — главное при разработке коммерческих ...20% задач, которые дают 80% результата — главное при разработке коммерческих ...
20% задач, которые дают 80% результата — главное при разработке коммерческих ...Dev_Party
 
Дмитрий Ивакин, ООО «Пайлабс» — Node.js: realtime приложение на примере систе...
Дмитрий Ивакин, ООО «Пайлабс» — Node.js: realtime приложение на примере систе...Дмитрий Ивакин, ООО «Пайлабс» — Node.js: realtime приложение на примере систе...
Дмитрий Ивакин, ООО «Пайлабс» — Node.js: realtime приложение на примере систе...Dev_Party
 

Mehr von Dev_Party (18)

Сергей Яркин, Тензор — RabbitMQ. Насколько ценен мех и вкусно мясо?
Сергей Яркин, Тензор — RabbitMQ. Насколько ценен мех и вкусно мясо?Сергей Яркин, Тензор — RabbitMQ. Насколько ценен мех и вкусно мясо?
Сергей Яркин, Тензор — RabbitMQ. Насколько ценен мех и вкусно мясо?
 
Александр Чистяков, Git in Sky — Современные тенденции в разработке программн...
Александр Чистяков, Git in Sky — Современные тенденции в разработке программн...Александр Чистяков, Git in Sky — Современные тенденции в разработке программн...
Александр Чистяков, Git in Sky — Современные тенденции в разработке программн...
 
Игорь Цупко, Notamedia — Документация? Не слышал
Игорь Цупко, Notamedia — Документация? Не слышалИгорь Цупко, Notamedia — Документация? Не слышал
Игорь Цупко, Notamedia — Документация? Не слышал
 
Александр Сербул, 1С-Битрикс — Облачный сервис персональных рекомендаций для ...
Александр Сербул, 1С-Битрикс — Облачный сервис персональных рекомендаций для ...Александр Сербул, 1С-Битрикс — Облачный сервис персональных рекомендаций для ...
Александр Сербул, 1С-Битрикс — Облачный сервис персональных рекомендаций для ...
 
Анастасия Распопина, Percona — Feel at Home в на 90% распределённой компании:...
Анастасия Распопина, Percona — Feel at Home в на 90% распределённой компании:...Анастасия Распопина, Percona — Feel at Home в на 90% распределённой компании:...
Анастасия Распопина, Percona — Feel at Home в на 90% распределённой компании:...
 
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностейДенис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
 
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
 
Елена Никитина, Аналитический центр при Правительстве РФ — Путь питониста, ил...
Елена Никитина, Аналитический центр при Правительстве РФ — Путь питониста, ил...Елена Никитина, Аналитический центр при Правительстве РФ — Путь питониста, ил...
Елена Никитина, Аналитический центр при Правительстве РФ — Путь питониста, ил...
 
Анна Крижановская, Playrix — Продвижение мобильных приложений: Deep Dive
Анна Крижановская, Playrix — Продвижение мобильных приложений: Deep DiveАнна Крижановская, Playrix — Продвижение мобильных приложений: Deep Dive
Анна Крижановская, Playrix — Продвижение мобильных приложений: Deep Dive
 
Денис Каленбет, АО «Эр-Стайл Софтлаб» — Самокапитализация программиста. Как п...
Денис Каленбет, АО «Эр-Стайл Софтлаб» — Самокапитализация программиста. Как п...Денис Каленбет, АО «Эр-Стайл Софтлаб» — Самокапитализация программиста. Как п...
Денис Каленбет, АО «Эр-Стайл Софтлаб» — Самокапитализация программиста. Как п...
 
Игорь Иванов, Playrix — Статистические предсказания игровой активности
Игорь Иванов, Playrix — Статистические предсказания игровой активностиИгорь Иванов, Playrix — Статистические предсказания игровой активности
Игорь Иванов, Playrix — Статистические предсказания игровой активности
 
Владимир Варнавский, интернет-студия «33 Кита» — Идеальный программист
Владимир Варнавский, интернет-студия «33 Кита» — Идеальный программистВладимир Варнавский, интернет-студия «33 Кита» — Идеальный программист
Владимир Варнавский, интернет-студия «33 Кита» — Идеальный программист
 
Андрей Валдуев, Playrix — Основы тестирования и примеры использования базовых...
Андрей Валдуев, Playrix — Основы тестирования и примеры использования базовых...Андрей Валдуев, Playrix — Основы тестирования и примеры использования базовых...
Андрей Валдуев, Playrix — Основы тестирования и примеры использования базовых...
 
Роман Приходько, Владимир Беспрозванных, «Сбербанк-Технологии» — Платформа ЕФС
Роман Приходько, Владимир Беспрозванных, «Сбербанк-Технологии» — Платформа ЕФСРоман Приходько, Владимир Беспрозванных, «Сбербанк-Технологии» — Платформа ЕФС
Роман Приходько, Владимир Беспрозванных, «Сбербанк-Технологии» — Платформа ЕФС
 
Владимир Варнавский, 33 Кита — Как запускать проекты вовремя
Владимир Варнавский, 33 Кита — Как запускать проекты вовремяВладимир Варнавский, 33 Кита — Как запускать проекты вовремя
Владимир Варнавский, 33 Кита — Как запускать проекты вовремя
 
Николай Мамадаев — Процесс создания дизайна мобильного приложения
Николай Мамадаев — Процесс создания дизайна мобильного приложения Николай Мамадаев — Процесс создания дизайна мобильного приложения
Николай Мамадаев — Процесс создания дизайна мобильного приложения
 
20% задач, которые дают 80% результата — главное при разработке коммерческих ...
20% задач, которые дают 80% результата — главное при разработке коммерческих ...20% задач, которые дают 80% результата — главное при разработке коммерческих ...
20% задач, которые дают 80% результата — главное при разработке коммерческих ...
 
Дмитрий Ивакин, ООО «Пайлабс» — Node.js: realtime приложение на примере систе...
Дмитрий Ивакин, ООО «Пайлабс» — Node.js: realtime приложение на примере систе...Дмитрий Ивакин, ООО «Пайлабс» — Node.js: realtime приложение на примере систе...
Дмитрий Ивакин, ООО «Пайлабс» — Node.js: realtime приложение на примере систе...
 

Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — проблемы и решения

  • 1. Четвертая конференция разработчиков ПО«DevParty» 2 апреля 2016 года, Вологда Валерий Чугреев Архитектура MVC в контексте web- разработки – проблемы и решения vk.com/chugreev
  • 2. План выступления 1. Вводная часть: фреймворки, MVC, ActiveRecord. 2. Имеющиеся проблемы и сложности, порождаемые MVC-фреймворками. 3. Пути решения проблем. Демонстрационный проект. 4. Плюсы и минусы предлагаемого подхода. Примеры на PHP, Yii2
  • 3. 1. Вводная часть: фреймворки, MVC, ActiveRecord
  • 4. Фреймворк – это «каркас», программная инфраструктура, позволяющая достаточно быстро разработать программное решение. Аналогия со строительством дома…
  • 5. «Фреймворк – набор программных сущностей (таких как классы, объекты и компоненты), которые помогают строить реюзабельную архитектуру для схожих приложений. Ожидается, что для создания приложения разработчик расширит и настроит фреймворк путем добавления своей логики». Источник: «Принципы, которые формируют успешные фреймворки» (перевод статьи Qiang Xue – создателя фреймворка Yii) http://haru-atari.com/blog/4/philosophies- that-shaped-successful-frameworks
  • 6. MVC
  • 7.
  • 8. «Active Record обеспечивает объектно- ориентированный интерфейс для доступа и манипулирования данными, хранящимися в базах данных. Класс Active Record соответствует таблице в базе данных, объект Active Record соответствует строке этой таблицы, а атрибут объекта Active Record представляет собой значение отдельного столбца строки». Из документации Yii. Active Record
  • 9. id title content 1 Проект №1 Содержимое 1 2 Проект №2 Содержимое 2 Project $id $title $content find() insert() save() update() save()
  • 10. 2. Имеющиеся проблемы и сложности, порождаемые MVC-фреймворками • Нарушение принципа единичной ответственности. • Высокая связность.
  • 11. Степень связанности— это мера, определяющая, насколько жестко один элемент связан с другими элементами, либо каким количеством данных о других элементах он обладает. Объект с низкой степенью связанности зависит от не очень большого числа других объектов и имеет следующие свойства: • Малое число зависимостей между классами (подсистемами). • Слабая зависимость одного класса (подсистемы) от изменений в другом классе (подсистеме). • Высокая степень повторного использования подсистем. Крэг Ларман, «Применение UML 2.0 и шаблонов проектирования».
  • 12. <?php foreach ($model->find()->all() as $project) { echo $project->title . '<br>'; } ?> public function actionAll() { return $this->render('all', ['model' => new Project()]); } Controller View
  • 13. <?php foreach (Project::find()->all() as $project) { echo $project->title . '<br>'; } ?> View
  • 14. public function actionHistory($id) { $task = $this->findTask($id); $project = $task->project; $this->currentUserCanManage($project); $query = Modification::find()->confirmed() ->andWhere(['latest_id' => $task->id]) ->orderBy(['created_at' => SORT_DESC]); $params = ArrayHelper::merge( ['query' => $query], Yii::$app->request->queryParams ); … return $this->render('history', … }
  • 15. 1 2 3 4 1 2 3 4 На одном уровне абстракции На разных уровнях абстракции
  • 16. /** * @property integer $id * @property string $title * @property string $content */ class Project extends yiidbActiveRecord { public static function tableName() { return 'project'; } public function rules() { return [ [['title', 'content'], 'required'], [['content'], 'string'], [['title'], 'string', 'max' => 255] ]; } } Model
  • 18. use appmodelsProject; public function actionView($id) { return $this->render('view', [ 'model' => $this->findModel($id), ]); } protected function findModel($id) { if (($model = Project::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } } Controller
  • 19. <h1><?= $model->title ?></h1> <div class="content"> <?= $model->content ?> </div> View
  • 21. 3. Пути решения проблем • Выделение слоя логики (Domain Layer). • Разграничение ответственности. • Внедрение зависимостей (Dependency Injection). Демонстрационный проект…
  • 23.
  • 24. /** * @property integer $id * @property string $title * @property string $content */ class Project extends yiidbActiveRecord { public static function tableName() { return 'project'; } } modelsstorageProject.php
  • 25. namespace appmodelsdomain; trait _Project { public $id; public $title; public $content; } modelsdomain_Project.php
  • 26. namespace appmodelsdomain; use yiibaseModel; class Project extends Model { use _Project; use apputilityReplicate; public function rules() { return [ [['title', 'content'], 'required'], [['content'], 'string'], [['id'], 'integer'], [['title'], 'string', 'max' => 255] ]; } modelsdomainProject.php
  • 27. use appmodelsdomainProjectRepository; class ProjectController extends Controller { private $repository; public function __construct($id, $module, ProjectRepository $repository, $config = []) { parent::__construct($id, $module, $config = []); $this->repository = $repository; } … } ProjectController.php
  • 29. public function actionView($id) { return $this->render('view', ['model' => $this->findModel($id)]); } protected function findModel($id) : Project { $model = $this->repository->get($id); if ($model !== null) { return Project::createObject($model); } else { throw new NotFoundHttpException( 'The requested page does not exist.'); } } ProjectController.phpuse appmodelsdomainProject;
  • 30. namespace appmodelsdomain; interface ProjectRepository { function get(int $id); function create(Project $project) : int; function save(Project $project) : bool; function delete(int $id) : bool; } modelsdomainProjectRepository.php
  • 31. modelsstorageProjectRepository.php namespace appmodelsstorage; use appmodelsdomain as domain; class ProjectRepository implements domainProjectRepository { public function get(int $id) { $project = Project::findOne($id); return !is_null($project) ? domainProject::createObject($project) : null; } … }
  • 33. trait Replicate { static private $domainTrait = ''; static private $domainNamespace = 'appmodelsdomain'; static function createObject($copiedObject) { $currentClass = get_called_class(); $newObject = new $currentClass; self::copyObject($newObject, $copiedObject); return $newObject; } static function copyObject($toObject, $fromObject) { $properties = get_class_vars(self::pattern()); foreach ($properties as $name => $value) { $toObject->$name = $fromObject->$name; } } utilityReplicate.php
  • 34. static private function pattern() { if (!empty(static::$domainTrait)) { return static::$domainTrait; } self::setDomainTraitDefault(); return static::$domainTrait; } static private function setDomainTraitDefault() { $reflection = new ReflectionClass(get_called_class()); $name = $reflection->getShortName(); static::$domainTrait = '' . self::$domainNamespace . '_' . $name; } } utilityReplicate.php
  • 35. public function get(int $id) { $project = Project::findOne($id); return !is_null($project) ? domainProject::createObject($project) : null; } public function save(domainProject $project) : bool { $projectStorage = Project::findOne($project->id); domainProject::copyObject($projectStorage, $project); return $projectStorage->save(); } modelsstorageProjectRepository.php
  • 36. 4. Плюсы и минусы подхода