SlideShare a Scribd company logo
1 of 55
Download to read offline
Агрегация
и осведомленность
или как сократить объем
кода вашего FrontEnd на 7%
Непомнящих Егор,
ИСС Арт
О себе 2005-2010 - ОмГУ ИМИТ
с 2008 - ИСС Арт
Специализация: JavaScript
Умения: TypeScript, Java, Scala, Unity 3D, PHP, Ruby, ...
Собственный MV-фреймворк (jWidget)
Тимлид и эксперт
Фанат ООП и Iron Maiden
Что такое агрегация и
осведомленность
Что такое агрегация и
осведомленность
Что такое агрегация и
осведомленность
Параграф 1.6 - Сравнение структур времени
выполнения и времени компиляции.
Использующий
объект
Использованный
объект
Агрегирующий
объект
Агрегируемый
объект
Агрегация
"У машины есть корпус, колеса и двигатель"
Осведомленность
"Каждый человек знает, какие книги он прочитал"
Агрегация в C++
class Department;
class University {
private:
Department faculty[20];
};
Агрегация по значению
Агрегация в C++
class Engine;
class Car {
private:
Engine* engine;
public:
Car() {
engine = new Engine();
}
virtual ~Car() {
delete engine;
}
};
Агрегация по ссылке
Осведомленность в C++
class Book;
class Person {
private:
Book** booksRead;
};
Агрегация в jWidget
● JW.Class имеет деструктор
● object.destroy() - вызов деструктора
● destroyObject - реализация деструктора
● own - агрегация объекта
Агрегация в jWidget
class Car extends JW.Class {
engine = this.own(new Engine());
}
var car = new Car();
car.destroy(); // Двигатель уничтожен
Реальный пример
class MyView extends JW.Class {
constructor() {
super();
this._layout();
$(window).resize(() => this._layout());
}
_layout() {
// ...
}
}
var myView = new MyView();
myView.destroy(); // чего-то не хватает?
Реальный пример
class MyView extends JW.Class {
constructor() {
super();
this._layout();
$(window).bind("resize", () => this._layout());
}
destroyObject() {
$(window).unbind("resize", () => this._layout());
super.destroyObject();
}
_layout() {
// ...
}
}
Реальный пример
class MyView extends JW.Class {
constructor() {
super();
this._layout();
this._onLayout = () => this._layout();
$(window).bind("resize", this._onLayout);
}
destroyObject() {
$(window).unbind("resize", this._onLayout);
super.destroyObject();
}
_layout() {
// ...
}
}
Реальный пример
class MyView extends JW.Class {
constructor() {
super();
this._layout();
this.own($(window).jwon(
"resize", this._layout, this));
}
_layout() {
// ...
}
}
Агрегирующие свойства и коллекции
Агрегирующие свойства и коллекции
Агрегирующие свойства
var property = new JW.Property().ownValue();
property.set(new SampleValue(1));
property.set(new SampleValue(2));
// SampleValue(1) неявно уничтожается
property.destroy();
// SampleValue(2) неявно уничтожается
Агрегирующие коллекции
var array = new JW.Array().ownItems();
array.add(new SampleValue(1));
array.add(new SampleValue(2));
array.set(new SampleValue(3), 0);
// SampleValue(1) неявно уничтожается
array.remove(1);
// SampleValue(2) неявно уничтожается
array.destroy();
// SampleValue(3) неявно уничтожается
Паттерн 1
Простое обновление объекта
1. Простое обновление объекта
1. Простое обновление объекта
class MyView extends JW.Class {
private content;
constructor(event)
super();
this.initContent();
this.own(event.bind(() => this.refreshContent()));
}
destroyObject() {
this.doneContent();
super.destroyObject();
}
initContent() {
this.content = new Content();
}
doneContent() {
this.content.destroy();
}
refreshContent() {
this.doneContent();
this.initContent();
}
}
1. Простое обновление объекта
Если подобъект, который хочется
заагрегировать в объекте, с ходом времени
пересоздается, поместите его в агрегирующее
свойство.
1. Простое обновление объекта
1. Простое обновление объекта
1. Простое обновление объекта
class MyView extends JW.Class {
private content = this.own(new JW.Property()).ownValue();
constructor(event)
super();
this.refreshContent();
this.own(event.bind(() => this.refreshContent()));
}
refreshContent() {
this.content.set(new Content());
}
}
1. Простое обновление объекта
class MyView extends JW.Class {
private content = this.own(new JW.Property()).ownValue();
constructor(event)
super();
this.refreshContent();
this.own(event.bind(() => this.refreshContent()));
}
refreshContent() {
this.content.set(null); // опционально
this.content.set(new Content());
}
}
Паттерн 2
Простая отмена операции
2. Простая отмена операции
2. Простая отмена операции
Если в момент уничтожения или смены
состояния объекта может выполняться
некоторая операция, но вы не знаете этого
наверняка, то для ее отмены следует
воспользоваться агрегирующим свойством.
2. Простая отмена операции
Класс
Класс
Класс
2. Простая отмена операции
class MyPage extends JW.UI.Component {
private currentOperation = this.own(new JW.Property()).ownValue();
afterRender() {
super.afterRender();
this.currentOperation.set(new Request(
"/api/data", (result) => this._onDataLoad(result)));
}
_onDataLoad(result) {
this.currentOperation.set(new Animation(
"fade in", () => this._onAnimationFinish()));
}
_onAnimationFinish() {
this.currentOperation.set(null);
}
}
Паттерн 3
Массовое уничтожение объектов
3. Массовое уничтожение объектов
3. Массовое уничтожение объектов
3. Массовое уничтожение объектов
3. Массовое уничтожение объектов
initContent() {
this.objects = this.factory.createObjects();
}
doneContent() {
this.objects.forEach((obj) => obj.destroy());
}
class Factory {
createObjects() {
return [ new Object1(), new Object2(), new Object3() ];
}
}
3. Массовое уничтожение объектов
Если объект вызовом некоторой функции
провоцирует создание множества объектов, то
функции следует возвращать один объект,
агрегирующий в себе все эти объекты.
3. Массовое уничтожение объектов
refreshContent() {
this.objects.set(this.factory.createObjects());
}
class Factory {
createObjects() {
var objects = new JW.Class();
objects.own(new Object1());
objects.own(new Object2());
objects.own(new Object3());
return objects;
}
}
Паттерн 4
Уничтожение драйвера объекта
4. Уничтожение драйвера объекта
Драйвер объекта - это объект, обеспечивающий
его актуальность.
4. Уничтожение драйвера объекта
Пример: динамическая смена цветовой схемы приложения
Основная схема Шоколадная схема
Цвет "normal"
Цвет "marginal"
Цвет "critical"
currentScheme
4. Уничтожение драйвера объекта
Пример: динамическая смена цветовой схемы приложения
Основная схема Шоколадная схема
Цвет "normal"
Цвет "marginal"
Цвет "critical"
currentScheme
4. Уничтожение драйвера объекта
Пример: динамическая смена цветовой схемы приложения
Основная схема Шоколадная схема
Цвет "normal"
Цвет "marginal"
Цвет "critical"
currentScheme
4. Уничтожение драйвера объекта
Пример: динамическая смена цветовой схемы приложения
Основная схема Шоколадная схема
Цвет "normal"
Цвет "marginal"
Цвет "critical"
currentScheme
4. Уничтожение драйвера объекта
class ColorScheme {
colors: {[key: string]: Color};
}
class ColorSchemeManager {
currentScheme: ColorScheme;
getCurrentColor(key: string): Color {
return this.currentScheme.colors[key];
}
}
4. Уничтожение драйвера объекта
class ColorSchemeManager {
currentScheme = new JW.Property<ColorScheme>();
getCurrentColor(key: string): JW.Property<Color> {
var color = new JW.Property<Color>();
color.set(this.currentScheme.get().colors[key]);
this.currentScheme.changeEvent.bind(() => {
color.set(this.currentScheme.get().colors[key]);
});
return color;
}
}
// Где-то в клиенте
var color = manager.getCurrentColor('marginal');
this.own($('.color-box').jwcss('background-color', color));
4. Уничтожение драйвера объекта
class ColorSchemeManager {
currentScheme = new JW.Property<ColorScheme>();
getCurrentColor(key: string): JW.Property<Color> {
var color = new JW.Property<Color>();
color.set(this.currentScheme.get().colors[key]);
this.own(this.currentScheme.changeEvent.bind(() => {
color.set(this.currentScheme.get().colors[key]);
}));
return color;
}
}
// Где-то в клиенте
var color = manager.getCurrentColor('marginal');
this.own($('.color-box').jwcss('background-color', color));
4. Уничтожение драйвера объекта
class ColorSchemeManager {
currentScheme = new JW.Property<ColorScheme>();
getCurrentColor(key: string, owner): JW.Property<Color> {
var color = new JW.Property<Color>();
color.set(this.currentScheme.get().colors[key]);
owner.own(this.currentScheme.changeEvent.bind(() => {
color.set(this.currentScheme.get().colors[key]);
}));
return color;
}
}
// Где-то в клиенте
var color = manager.getCurrentColor('marginal', this);
this.own($('.color-box').jwcss('background-color', color));
4. Уничтожение драйвера объекта
Если функция возвращает объект, который
имеет свой драйвер, заагрегируйте этот
драйвер в самом объекте.
4. Уничтожение драйвера объекта
class ColorSchemeManager {
currentScheme = new JW.Property<ColorScheme>();
getCurrentColor(key: string): JW.Property<Color> {
var color = new JW.Property<Color>();
color.set(this.currentScheme.get().colors[key]);
this.currentScheme.changeEvent.bind(() => {
color.set(this.currentScheme.get().colors[key]);
});
return color;
}
}
// Где-то в клиенте
var color = manager.getCurrentColor('marginal');
this.own($('.color-box').jwcss('background-color', color));
4. Уничтожение драйвера объекта
class ColorSchemeManager {
currentScheme = new JW.Property<ColorScheme>();
getCurrentColor(key: string): JW.Property<Color> {
var color = new JW.Property<Color>();
color.set(this.currentScheme.get().colors[key]);
color.own(this.currentScheme.changeEvent.bind(() => {
color.set(this.currentScheme.get().colors[key]);
}));
return color;
}
}
// Где-то в клиенте
var color = this.own(manager.getCurrentColor('marginal'));
this.own($('.color-box').jwcss('background-color', color));
4. Уничтожение драйвера объекта
class ColorSchemeManager {
currentScheme = new JW.Property<ColorScheme>();
getCurrentColor(key: string) {
return this.currentScheme.$$mapValue(
(scheme) => scheme.colors[key]);
}
}
Заключение
https://habrahabr.ru/post/270879/

More Related Content

What's hot

C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переигралEugene Zharkov
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Ontico
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
Andrew Borisenko "Magic of Vue.js""
Andrew Borisenko  "Magic of Vue.js""Andrew Borisenko  "Magic of Vue.js""
Andrew Borisenko "Magic of Vue.js""OdessaJS Conf
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelperDataArt
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAndrey Rebrov
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Ontico
 

What's hot (14)

C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переиграл
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Andrew Borisenko "Magic of Vue.js""
Andrew Borisenko  "Magic of Vue.js""Andrew Borisenko  "Magic of Vue.js""
Andrew Borisenko "Magic of Vue.js""
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelper
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 

Viewers also liked

2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...Омские ИТ-субботники
 
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIPОмские ИТ-субботники
 
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикерОмские ИТ-субботники
 
NEW ADMINISTRATIVE AGENCY FOR THE SIX JUDICIAL DISTRICT OF PENNSYLVANIA COMMI...
NEW ADMINISTRATIVE AGENCY FOR THE SIX JUDICIAL DISTRICT OF PENNSYLVANIA COMMI...NEW ADMINISTRATIVE AGENCY FOR THE SIX JUDICIAL DISTRICT OF PENNSYLVANIA COMMI...
NEW ADMINISTRATIVE AGENCY FOR THE SIX JUDICIAL DISTRICT OF PENNSYLVANIA COMMI...Corey L. Harris Sr.
 
Actividad 6, gestores de bibliografia
Actividad 6, gestores de bibliografiaActividad 6, gestores de bibliografia
Actividad 6, gestores de bibliografiaWilliam A De Jimenez
 
Всемирная неделя предпринимательства
Всемирная неделя предпринимательстваВсемирная неделя предпринимательства
Всемирная неделя предпринимательстваpavelvk
 
Referencia 3. LA GRAMÁTICA DEL AYER Y LA GRAMÁTICA DE HOY
Referencia 3. LA GRAMÁTICA DEL AYER Y LA GRAMÁTICA DE HOY Referencia 3. LA GRAMÁTICA DEL AYER Y LA GRAMÁTICA DE HOY
Referencia 3. LA GRAMÁTICA DEL AYER Y LA GRAMÁTICA DE HOY Diana Catherine Castro Jiménez
 
What is your tao 1213
What is your tao 1213What is your tao 1213
What is your tao 1213mloret
 
Fontainebleau Article
Fontainebleau ArticleFontainebleau Article
Fontainebleau ArticleRobert Meller
 
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...Омские ИТ-субботники
 
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
2016-10-01 01 Звиад Кардава. Welcome to Internet of ThingsОмские ИТ-субботники
 
2016-12-03 03 Евгений Тюменцев. DSL на коленке
2016-12-03 03 Евгений Тюменцев. DSL на коленке2016-12-03 03 Евгений Тюменцев. DSL на коленке
2016-12-03 03 Евгений Тюменцев. DSL на коленкеОмские ИТ-субботники
 
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...Омские ИТ-субботники
 
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...Омские ИТ-субботники
 

Viewers also liked (20)

2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
 
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
 
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
 
2017-02-04 02 Яков Лило. Решение задач
2017-02-04 02 Яков Лило. Решение задач2017-02-04 02 Яков Лило. Решение задач
2017-02-04 02 Яков Лило. Решение задач
 
NEW ADMINISTRATIVE AGENCY FOR THE SIX JUDICIAL DISTRICT OF PENNSYLVANIA COMMI...
NEW ADMINISTRATIVE AGENCY FOR THE SIX JUDICIAL DISTRICT OF PENNSYLVANIA COMMI...NEW ADMINISTRATIVE AGENCY FOR THE SIX JUDICIAL DISTRICT OF PENNSYLVANIA COMMI...
NEW ADMINISTRATIVE AGENCY FOR THE SIX JUDICIAL DISTRICT OF PENNSYLVANIA COMMI...
 
3874
38743874
3874
 
Actividad 6, gestores de bibliografia
Actividad 6, gestores de bibliografiaActividad 6, gestores de bibliografia
Actividad 6, gestores de bibliografia
 
6093
60936093
6093
 
Всемирная неделя предпринимательства
Всемирная неделя предпринимательстваВсемирная неделя предпринимательства
Всемирная неделя предпринимательства
 
Referencia 3. LA GRAMÁTICA DEL AYER Y LA GRAMÁTICA DE HOY
Referencia 3. LA GRAMÁTICA DEL AYER Y LA GRAMÁTICA DE HOY Referencia 3. LA GRAMÁTICA DEL AYER Y LA GRAMÁTICA DE HOY
Referencia 3. LA GRAMÁTICA DEL AYER Y LA GRAMÁTICA DE HOY
 
What is your tao 1213
What is your tao 1213What is your tao 1213
What is your tao 1213
 
Actividades Asociación Vecinos Arroyoculebro
Actividades Asociación Vecinos ArroyoculebroActividades Asociación Vecinos Arroyoculebro
Actividades Asociación Vecinos Arroyoculebro
 
Fontainebleau Article
Fontainebleau ArticleFontainebleau Article
Fontainebleau Article
 
Campamentos urbanos 2016
Campamentos urbanos 2016Campamentos urbanos 2016
Campamentos urbanos 2016
 
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
 
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
 
2016-12-03 03 Евгений Тюменцев. DSL на коленке
2016-12-03 03 Евгений Тюменцев. DSL на коленке2016-12-03 03 Евгений Тюменцев. DSL на коленке
2016-12-03 03 Евгений Тюменцев. DSL на коленке
 
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
 
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
 
voltmobi-2016-About
voltmobi-2016-Aboutvoltmobi-2016-About
voltmobi-2016-About
 

Similar to 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность

View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agencyit-people
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийGoSharp
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
“AlternativaPhysics: физическая симуляция на Flash – это просто” (Дмитрий Сер...
“AlternativaPhysics: физическая симуляция на Flash – это просто” (Дмитрий Сер...“AlternativaPhysics: физическая симуляция на Flash – это просто” (Дмитрий Сер...
“AlternativaPhysics: физическая симуляция на Flash – это просто” (Дмитрий Сер...DevGAMM Conference
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Вебинар "Оптимизация производительности мобильных веб-приложений"
Вебинар "Оптимизация производительности мобильных веб-приложений"Вебинар "Оптимизация производительности мобильных веб-приложений"
Вебинар "Оптимизация производительности мобильных веб-приложений"MobiDev
 
Apex OOP Patterns (Valery Dvornichenko)
Apex OOP Patterns (Valery Dvornichenko)Apex OOP Patterns (Valery Dvornichenko)
Apex OOP Patterns (Valery Dvornichenko)Yury Bondarau
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDDAleksei Alekseev
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...Yandex
 
Веселая ферма. Соседи.
Веселая ферма. Соседи.Веселая ферма. Соседи.
Веселая ферма. Соседи.Doomer Samoiloff
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловGeeksLab Odessa
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Ontico
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NETVitaly Baum
 

Similar to 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность (20)

View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
 
Java threads - part 2
Java threads - part 2Java threads - part 2
Java threads - part 2
 
JavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программированияJavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программирования
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
“AlternativaPhysics: физическая симуляция на Flash – это просто” (Дмитрий Сер...
“AlternativaPhysics: физическая симуляция на Flash – это просто” (Дмитрий Сер...“AlternativaPhysics: физическая симуляция на Flash – это просто” (Дмитрий Сер...
“AlternativaPhysics: физическая симуляция на Flash – это просто” (Дмитрий Сер...
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Вебинар "Оптимизация производительности мобильных веб-приложений"
Вебинар "Оптимизация производительности мобильных веб-приложений"Вебинар "Оптимизация производительности мобильных веб-приложений"
Вебинар "Оптимизация производительности мобильных веб-приложений"
 
Apex OOP Patterns (Valery Dvornichenko)
Apex OOP Patterns (Valery Dvornichenko)Apex OOP Patterns (Valery Dvornichenko)
Apex OOP Patterns (Valery Dvornichenko)
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
 
Веселая ферма. Соседи.
Веселая ферма. Соседи.Веселая ферма. Соседи.
Веселая ферма. Соседи.
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
 

More from Омские ИТ-субботники

2017-08-12 01 Алексей Коровянский. Привет, ARKit!
2017-08-12 01 Алексей Коровянский. Привет, ARKit!2017-08-12 01 Алексей Коровянский. Привет, ARKit!
2017-08-12 01 Алексей Коровянский. Привет, ARKit!Омские ИТ-субботники
 
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKitОмские ИТ-субботники
 
2017-05-06 02 Илья Сиганов. Зачем учить машины?
2017-05-06 02 Илья Сиганов. Зачем учить машины?2017-05-06 02 Илья Сиганов. Зачем учить машины?
2017-05-06 02 Илья Сиганов. Зачем учить машины?Омские ИТ-субботники
 
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальноеОмские ИТ-субботники
 
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системыОмские ИТ-субботники
 
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOpsОмские ИТ-субботники
 
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидацииОмские ИТ-субботники
 
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторыОмские ИТ-субботники
 
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборотОмские ИТ-субботники
 
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?Омские ИТ-субботники
 
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIPОмские ИТ-субботники
 
2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS
2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS
2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOSОмские ИТ-субботники
 
2016-08-20 03 Сергей Горбачев. Planning poker в Scrum
2016-08-20 03 Сергей Горбачев. Planning poker в Scrum2016-08-20 03 Сергей Горбачев. Planning poker в Scrum
2016-08-20 03 Сергей Горбачев. Planning poker в ScrumОмские ИТ-субботники
 
2016 06-11 Елена Гальцина. Дизайнер и разработчик. От неловких встреч к долго...
2016 06-11 Елена Гальцина. Дизайнер и разработчик. От неловких встреч к долго...2016 06-11 Елена Гальцина. Дизайнер и разработчик. От неловких встреч к долго...
2016 06-11 Елена Гальцина. Дизайнер и разработчик. От неловких встреч к долго...Омские ИТ-субботники
 
2016 06-11 Ирина Мещрякова. Выяснять задачу, формулировать задачу, доносить з...
2016 06-11 Ирина Мещрякова. Выяснять задачу, формулировать задачу, доносить з...2016 06-11 Ирина Мещрякова. Выяснять задачу, формулировать задачу, доносить з...
2016 06-11 Ирина Мещрякова. Выяснять задачу, формулировать задачу, доносить з...Омские ИТ-субботники
 
2016 06-11 Дмитрий Алексеенков. Android Data Binding
2016 06-11 Дмитрий Алексеенков. Android Data Binding2016 06-11 Дмитрий Алексеенков. Android Data Binding
2016 06-11 Дмитрий Алексеенков. Android Data BindingОмские ИТ-субботники
 
2016 06-11 Данил Перевалов. Создание простых анимаций на андроид
2016 06-11 Данил Перевалов. Создание простых анимаций на андроид2016 06-11 Данил Перевалов. Создание простых анимаций на андроид
2016 06-11 Данил Перевалов. Создание простых анимаций на андроидОмские ИТ-субботники
 
2016-04-30 05 Даниил Валов. Apiary - где-то между фронтендом и бэкэндом
2016-04-30 05 Даниил Валов. Apiary - где-то между фронтендом и бэкэндом2016-04-30 05 Даниил Валов. Apiary - где-то между фронтендом и бэкэндом
2016-04-30 05 Даниил Валов. Apiary - где-то между фронтендом и бэкэндомОмские ИТ-субботники
 

More from Омские ИТ-субботники (20)

2017-08-12 01 Алексей Коровянский. Привет, ARKit!
2017-08-12 01 Алексей Коровянский. Привет, ARKit!2017-08-12 01 Алексей Коровянский. Привет, ARKit!
2017-08-12 01 Алексей Коровянский. Привет, ARKit!
 
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
 
2017-05-06 02 Илья Сиганов. Зачем учить машины?
2017-05-06 02 Илья Сиганов. Зачем учить машины?2017-05-06 02 Илья Сиганов. Зачем учить машины?
2017-05-06 02 Илья Сиганов. Зачем учить машины?
 
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
 
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
 
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
 
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
 
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
 
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
 
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
 
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
 
2016-09-17 03 Василий Полозов. WebRTC
2016-09-17 03 Василий Полозов. WebRTC2016-09-17 03 Василий Полозов. WebRTC
2016-09-17 03 Василий Полозов. WebRTC
 
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
 
2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS
2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS
2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS
 
2016-08-20 03 Сергей Горбачев. Planning poker в Scrum
2016-08-20 03 Сергей Горбачев. Planning poker в Scrum2016-08-20 03 Сергей Горбачев. Planning poker в Scrum
2016-08-20 03 Сергей Горбачев. Planning poker в Scrum
 
2016 06-11 Елена Гальцина. Дизайнер и разработчик. От неловких встреч к долго...
2016 06-11 Елена Гальцина. Дизайнер и разработчик. От неловких встреч к долго...2016 06-11 Елена Гальцина. Дизайнер и разработчик. От неловких встреч к долго...
2016 06-11 Елена Гальцина. Дизайнер и разработчик. От неловких встреч к долго...
 
2016 06-11 Ирина Мещрякова. Выяснять задачу, формулировать задачу, доносить з...
2016 06-11 Ирина Мещрякова. Выяснять задачу, формулировать задачу, доносить з...2016 06-11 Ирина Мещрякова. Выяснять задачу, формулировать задачу, доносить з...
2016 06-11 Ирина Мещрякова. Выяснять задачу, формулировать задачу, доносить з...
 
2016 06-11 Дмитрий Алексеенков. Android Data Binding
2016 06-11 Дмитрий Алексеенков. Android Data Binding2016 06-11 Дмитрий Алексеенков. Android Data Binding
2016 06-11 Дмитрий Алексеенков. Android Data Binding
 
2016 06-11 Данил Перевалов. Создание простых анимаций на андроид
2016 06-11 Данил Перевалов. Создание простых анимаций на андроид2016 06-11 Данил Перевалов. Создание простых анимаций на андроид
2016 06-11 Данил Перевалов. Создание простых анимаций на андроид
 
2016-04-30 05 Даниил Валов. Apiary - где-то между фронтендом и бэкэндом
2016-04-30 05 Даниил Валов. Apiary - где-то между фронтендом и бэкэндом2016-04-30 05 Даниил Валов. Apiary - где-то между фронтендом и бэкэндом
2016-04-30 05 Даниил Валов. Apiary - где-то между фронтендом и бэкэндом
 

2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность

  • 1. Агрегация и осведомленность или как сократить объем кода вашего FrontEnd на 7% Непомнящих Егор, ИСС Арт
  • 2. О себе 2005-2010 - ОмГУ ИМИТ с 2008 - ИСС Арт Специализация: JavaScript Умения: TypeScript, Java, Scala, Unity 3D, PHP, Ruby, ... Собственный MV-фреймворк (jWidget) Тимлид и эксперт Фанат ООП и Iron Maiden
  • 3. Что такое агрегация и осведомленность
  • 4. Что такое агрегация и осведомленность
  • 5. Что такое агрегация и осведомленность Параграф 1.6 - Сравнение структур времени выполнения и времени компиляции. Использующий объект Использованный объект Агрегирующий объект Агрегируемый объект
  • 6. Агрегация "У машины есть корпус, колеса и двигатель"
  • 7. Осведомленность "Каждый человек знает, какие книги он прочитал"
  • 8. Агрегация в C++ class Department; class University { private: Department faculty[20]; }; Агрегация по значению
  • 9. Агрегация в C++ class Engine; class Car { private: Engine* engine; public: Car() { engine = new Engine(); } virtual ~Car() { delete engine; } }; Агрегация по ссылке
  • 10. Осведомленность в C++ class Book; class Person { private: Book** booksRead; };
  • 11. Агрегация в jWidget ● JW.Class имеет деструктор ● object.destroy() - вызов деструктора ● destroyObject - реализация деструктора ● own - агрегация объекта
  • 12. Агрегация в jWidget class Car extends JW.Class { engine = this.own(new Engine()); } var car = new Car(); car.destroy(); // Двигатель уничтожен
  • 13. Реальный пример class MyView extends JW.Class { constructor() { super(); this._layout(); $(window).resize(() => this._layout()); } _layout() { // ... } } var myView = new MyView(); myView.destroy(); // чего-то не хватает?
  • 14. Реальный пример class MyView extends JW.Class { constructor() { super(); this._layout(); $(window).bind("resize", () => this._layout()); } destroyObject() { $(window).unbind("resize", () => this._layout()); super.destroyObject(); } _layout() { // ... } }
  • 15. Реальный пример class MyView extends JW.Class { constructor() { super(); this._layout(); this._onLayout = () => this._layout(); $(window).bind("resize", this._onLayout); } destroyObject() { $(window).unbind("resize", this._onLayout); super.destroyObject(); } _layout() { // ... } }
  • 16. Реальный пример class MyView extends JW.Class { constructor() { super(); this._layout(); this.own($(window).jwon( "resize", this._layout, this)); } _layout() { // ... } }
  • 19. Агрегирующие свойства var property = new JW.Property().ownValue(); property.set(new SampleValue(1)); property.set(new SampleValue(2)); // SampleValue(1) неявно уничтожается property.destroy(); // SampleValue(2) неявно уничтожается
  • 20. Агрегирующие коллекции var array = new JW.Array().ownItems(); array.add(new SampleValue(1)); array.add(new SampleValue(2)); array.set(new SampleValue(3), 0); // SampleValue(1) неявно уничтожается array.remove(1); // SampleValue(2) неявно уничтожается array.destroy(); // SampleValue(3) неявно уничтожается
  • 23. 1. Простое обновление объекта class MyView extends JW.Class { private content; constructor(event) super(); this.initContent(); this.own(event.bind(() => this.refreshContent())); } destroyObject() { this.doneContent(); super.destroyObject(); } initContent() { this.content = new Content(); } doneContent() { this.content.destroy(); } refreshContent() { this.doneContent(); this.initContent(); } }
  • 24. 1. Простое обновление объекта Если подобъект, который хочется заагрегировать в объекте, с ходом времени пересоздается, поместите его в агрегирующее свойство.
  • 27. 1. Простое обновление объекта class MyView extends JW.Class { private content = this.own(new JW.Property()).ownValue(); constructor(event) super(); this.refreshContent(); this.own(event.bind(() => this.refreshContent())); } refreshContent() { this.content.set(new Content()); } }
  • 28. 1. Простое обновление объекта class MyView extends JW.Class { private content = this.own(new JW.Property()).ownValue(); constructor(event) super(); this.refreshContent(); this.own(event.bind(() => this.refreshContent())); } refreshContent() { this.content.set(null); // опционально this.content.set(new Content()); } }
  • 30. 2. Простая отмена операции
  • 31. 2. Простая отмена операции Если в момент уничтожения или смены состояния объекта может выполняться некоторая операция, но вы не знаете этого наверняка, то для ее отмены следует воспользоваться агрегирующим свойством.
  • 32. 2. Простая отмена операции Класс Класс Класс
  • 33. 2. Простая отмена операции class MyPage extends JW.UI.Component { private currentOperation = this.own(new JW.Property()).ownValue(); afterRender() { super.afterRender(); this.currentOperation.set(new Request( "/api/data", (result) => this._onDataLoad(result))); } _onDataLoad(result) { this.currentOperation.set(new Animation( "fade in", () => this._onAnimationFinish())); } _onAnimationFinish() { this.currentOperation.set(null); } }
  • 38. 3. Массовое уничтожение объектов initContent() { this.objects = this.factory.createObjects(); } doneContent() { this.objects.forEach((obj) => obj.destroy()); } class Factory { createObjects() { return [ new Object1(), new Object2(), new Object3() ]; } }
  • 39. 3. Массовое уничтожение объектов Если объект вызовом некоторой функции провоцирует создание множества объектов, то функции следует возвращать один объект, агрегирующий в себе все эти объекты.
  • 40. 3. Массовое уничтожение объектов refreshContent() { this.objects.set(this.factory.createObjects()); } class Factory { createObjects() { var objects = new JW.Class(); objects.own(new Object1()); objects.own(new Object2()); objects.own(new Object3()); return objects; } }
  • 42. 4. Уничтожение драйвера объекта Драйвер объекта - это объект, обеспечивающий его актуальность.
  • 43. 4. Уничтожение драйвера объекта Пример: динамическая смена цветовой схемы приложения Основная схема Шоколадная схема Цвет "normal" Цвет "marginal" Цвет "critical" currentScheme
  • 44. 4. Уничтожение драйвера объекта Пример: динамическая смена цветовой схемы приложения Основная схема Шоколадная схема Цвет "normal" Цвет "marginal" Цвет "critical" currentScheme
  • 45. 4. Уничтожение драйвера объекта Пример: динамическая смена цветовой схемы приложения Основная схема Шоколадная схема Цвет "normal" Цвет "marginal" Цвет "critical" currentScheme
  • 46. 4. Уничтожение драйвера объекта Пример: динамическая смена цветовой схемы приложения Основная схема Шоколадная схема Цвет "normal" Цвет "marginal" Цвет "critical" currentScheme
  • 47. 4. Уничтожение драйвера объекта class ColorScheme { colors: {[key: string]: Color}; } class ColorSchemeManager { currentScheme: ColorScheme; getCurrentColor(key: string): Color { return this.currentScheme.colors[key]; } }
  • 48. 4. Уничтожение драйвера объекта class ColorSchemeManager { currentScheme = new JW.Property<ColorScheme>(); getCurrentColor(key: string): JW.Property<Color> { var color = new JW.Property<Color>(); color.set(this.currentScheme.get().colors[key]); this.currentScheme.changeEvent.bind(() => { color.set(this.currentScheme.get().colors[key]); }); return color; } } // Где-то в клиенте var color = manager.getCurrentColor('marginal'); this.own($('.color-box').jwcss('background-color', color));
  • 49. 4. Уничтожение драйвера объекта class ColorSchemeManager { currentScheme = new JW.Property<ColorScheme>(); getCurrentColor(key: string): JW.Property<Color> { var color = new JW.Property<Color>(); color.set(this.currentScheme.get().colors[key]); this.own(this.currentScheme.changeEvent.bind(() => { color.set(this.currentScheme.get().colors[key]); })); return color; } } // Где-то в клиенте var color = manager.getCurrentColor('marginal'); this.own($('.color-box').jwcss('background-color', color));
  • 50. 4. Уничтожение драйвера объекта class ColorSchemeManager { currentScheme = new JW.Property<ColorScheme>(); getCurrentColor(key: string, owner): JW.Property<Color> { var color = new JW.Property<Color>(); color.set(this.currentScheme.get().colors[key]); owner.own(this.currentScheme.changeEvent.bind(() => { color.set(this.currentScheme.get().colors[key]); })); return color; } } // Где-то в клиенте var color = manager.getCurrentColor('marginal', this); this.own($('.color-box').jwcss('background-color', color));
  • 51. 4. Уничтожение драйвера объекта Если функция возвращает объект, который имеет свой драйвер, заагрегируйте этот драйвер в самом объекте.
  • 52. 4. Уничтожение драйвера объекта class ColorSchemeManager { currentScheme = new JW.Property<ColorScheme>(); getCurrentColor(key: string): JW.Property<Color> { var color = new JW.Property<Color>(); color.set(this.currentScheme.get().colors[key]); this.currentScheme.changeEvent.bind(() => { color.set(this.currentScheme.get().colors[key]); }); return color; } } // Где-то в клиенте var color = manager.getCurrentColor('marginal'); this.own($('.color-box').jwcss('background-color', color));
  • 53. 4. Уничтожение драйвера объекта class ColorSchemeManager { currentScheme = new JW.Property<ColorScheme>(); getCurrentColor(key: string): JW.Property<Color> { var color = new JW.Property<Color>(); color.set(this.currentScheme.get().colors[key]); color.own(this.currentScheme.changeEvent.bind(() => { color.set(this.currentScheme.get().colors[key]); })); return color; } } // Где-то в клиенте var color = this.own(manager.getCurrentColor('marginal')); this.own($('.color-box').jwcss('background-color', color));
  • 54. 4. Уничтожение драйвера объекта class ColorSchemeManager { currentScheme = new JW.Property<ColorScheme>(); getCurrentColor(key: string) { return this.currentScheme.$$mapValue( (scheme) => scheme.colors[key]); } }