2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность
Transcript of 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность
![Page 1: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/1.jpg)
Агрегация и осведомленностьили как сократить объем кода вашего FrontEnd на 7%
Непомнящих Егор, ИСС Арт
![Page 2: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/2.jpg)
О себе 2005-2010 - ОмГУ ИМИТс 2008 - ИСС Арт
Специализация: JavaScript
Умения: TypeScript, Java, Scala, Unity 3D, PHP, Ruby, ...
Собственный MV-фреймворк (jWidget)
Тимлид и эксперт
Фанат ООП и Iron Maiden
![Page 3: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/3.jpg)
Что такое агрегация и осведомленность
![Page 4: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/4.jpg)
Что такое агрегация и осведомленность
![Page 5: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/5.jpg)
Что такое агрегация и осведомленность
Параграф 1.6 - Сравнение структур времени выполнения и времени компиляции.
Использующийобъект
Использованныйобъект
Агрегирующийобъект
Агрегируемыйобъект
![Page 6: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/6.jpg)
Агрегация
"У машины есть корпус, колеса и двигатель"
![Page 7: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/7.jpg)
Осведомленность
"Каждый человек знает, какие книги он прочитал"
![Page 8: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/8.jpg)
Агрегация в C++
class Department; class University { private: Department faculty[20];};
Агрегация по значению
![Page 9: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/9.jpg)
Агрегация в C++
class Engine;
class Car { private: Engine* engine; public: Car() { engine = new Engine(); } virtual ~Car() { delete engine; }};
Агрегация по ссылке
![Page 10: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/10.jpg)
Осведомленность в C++
class Book; class Person { private: Book** booksRead;};
![Page 11: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/11.jpg)
Агрегация в jWidget
● JW.Class имеет деструктор● object.destroy() - вызов деструктора● destroyObject - реализация деструктора● own - агрегация объекта
![Page 12: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/12.jpg)
Агрегация в jWidget
class Car extends JW.Class { engine = this.own(new Engine());}
var car = new Car();car.destroy(); // Двигатель уничтожен
![Page 13: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/13.jpg)
Реальный примерclass MyView extends JW.Class { constructor() { super(); this._layout(); $(window).resize(() => this._layout()); }
_layout() { // ... }}
var myView = new MyView();myView.destroy(); // чего-то не хватает?
![Page 14: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/14.jpg)
Реальный примерclass MyView extends JW.Class { constructor() { super(); this._layout(); $(window).bind("resize", () => this._layout()); }
destroyObject() { $(window).unbind("resize", () => this._layout()); super.destroyObject(); }
_layout() { // ... }}
![Page 15: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/15.jpg)
Реальный пример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() { // ... }}
![Page 16: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/16.jpg)
Реальный пример
class MyView extends JW.Class { constructor() { super(); this._layout(); this.own($(window).jwon( "resize", this._layout, this)); }
_layout() { // ... }}
![Page 17: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/17.jpg)
Агрегирующие свойства и коллекции
![Page 18: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/18.jpg)
Агрегирующие свойства и коллекции
![Page 19: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/19.jpg)
Агрегирующие свойства
var property = new JW.Property().ownValue();property.set(new SampleValue(1));
property.set(new SampleValue(2));// SampleValue(1) неявно уничтожается
property.destroy();// SampleValue(2) неявно уничтожается
![Page 20: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/20.jpg)
Агрегирующие коллекции
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) неявно уничтожается
![Page 21: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/21.jpg)
Паттерн 1
Простое обновление объекта
![Page 22: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/22.jpg)
1. Простое обновление объекта
![Page 23: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/23.jpg)
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(); }}
![Page 24: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/24.jpg)
1. Простое обновление объекта
Если подобъект, который хочется заагрегировать в объекте, с ходом времени
пересоздается, поместите его в агрегирующее свойство.
![Page 25: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/25.jpg)
1. Простое обновление объекта
![Page 26: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/26.jpg)
1. Простое обновление объекта
![Page 27: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/27.jpg)
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()); }}
![Page 28: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/28.jpg)
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()); }}
![Page 29: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/29.jpg)
Паттерн 2
Простая отмена операции
![Page 30: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/30.jpg)
2. Простая отмена операции
![Page 31: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/31.jpg)
2. Простая отмена операции
Если в момент уничтожения или смены состояния объекта может выполняться
некоторая операция, но вы не знаете этого наверняка, то для ее отмены следует
воспользоваться агрегирующим свойством.
![Page 32: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/32.jpg)
2. Простая отмена операции
Класс
Класс
Класс
![Page 33: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/33.jpg)
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); }}
![Page 34: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/34.jpg)
Паттерн 3
Массовое уничтожение объектов
![Page 35: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/35.jpg)
3. Массовое уничтожение объектов
![Page 36: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/36.jpg)
3. Массовое уничтожение объектов
![Page 37: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/37.jpg)
3. Массовое уничтожение объектов
![Page 38: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/38.jpg)
3. Массовое уничтожение объектов
initContent() { this.objects = this.factory.createObjects();}
doneContent() { this.objects.forEach((obj) => obj.destroy());}
class Factory { createObjects() { return [ new Object1(), new Object2(), new Object3() ]; }}
![Page 39: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/39.jpg)
3. Массовое уничтожение объектов
Если объект вызовом некоторой функции провоцирует создание множества объектов, то
функции следует возвращать один объект, агрегирующий в себе все эти объекты.
![Page 40: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/40.jpg)
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; }}
![Page 41: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/41.jpg)
Паттерн 4
Уничтожение драйвера объекта
![Page 42: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/42.jpg)
4. Уничтожение драйвера объекта
Драйвер объекта - это объект, обеспечивающий его актуальность.
![Page 43: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/43.jpg)
4. Уничтожение драйвера объектаПример: динамическая смена цветовой схемы приложения
Основная схема Шоколадная схема
Цвет "normal"
Цвет "marginal"
Цвет "critical"
currentScheme
![Page 44: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/44.jpg)
4. Уничтожение драйвера объектаПример: динамическая смена цветовой схемы приложения
Основная схема Шоколадная схема
Цвет "normal"
Цвет "marginal"
Цвет "critical"
currentScheme
![Page 45: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/45.jpg)
4. Уничтожение драйвера объектаПример: динамическая смена цветовой схемы приложения
Основная схема Шоколадная схема
Цвет "normal"
Цвет "marginal"
Цвет "critical"
currentScheme
![Page 46: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/46.jpg)
4. Уничтожение драйвера объектаПример: динамическая смена цветовой схемы приложения
Основная схема Шоколадная схема
Цвет "normal"
Цвет "marginal"
Цвет "critical"
currentScheme
![Page 47: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/47.jpg)
4. Уничтожение драйвера объекта
class ColorScheme { colors: {[key: string]: Color};}
class ColorSchemeManager { currentScheme: ColorScheme;
getCurrentColor(key: string): Color { return this.currentScheme.colors[key]; }}
![Page 48: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/48.jpg)
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));
![Page 49: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/49.jpg)
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));
![Page 50: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/50.jpg)
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));
![Page 51: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/51.jpg)
4. Уничтожение драйвера объекта
Если функция возвращает объект, который имеет свой драйвер, заагрегируйте этот
драйвер в самом объекте.
![Page 52: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/52.jpg)
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));
![Page 53: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/53.jpg)
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));
![Page 54: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/54.jpg)
4. Уничтожение драйвера объекта
class ColorSchemeManager { currentScheme = new JW.Property<ColorScheme>();
getCurrentColor(key: string) { return this.currentScheme.$$mapValue( (scheme) => scheme.colors[key]); }}
![Page 55: 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность](https://reader036.fdocuments.net/reader036/viewer/2022062412/587d55311a28abee158b5799/html5/thumbnails/55.jpg)
Заключение
https://habrahabr.ru/post/270879/