55
Агрегация и осведомленность или как сократить объем кода вашего FrontEnd на 7% Непомнящих Егор, ИСС Арт

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

  • Upload
    -

  • View
    34

  • Download
    0

Embed Size (px)

Citation preview

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

Агрегация и осведомленностьили как сократить объем кода вашего FrontEnd на 7%

Непомнящих Егор, ИСС Арт

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

О себе 2005-2010 - ОмГУ ИМИТс 2008 - ИСС Арт

Специализация: JavaScript

Умения: TypeScript, Java, Scala, Unity 3D, PHP, Ruby, ...

Собственный MV-фреймворк (jWidget)

Тимлид и эксперт

Фанат ООП и Iron Maiden

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

Что такое агрегация и осведомленность

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

Что такое агрегация и осведомленность

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

Что такое агрегация и осведомленность

Параграф 1.6 - Сравнение структур времени выполнения и времени компиляции.

Использующийобъект

Использованныйобъект

Агрегирующийобъект

Агрегируемыйобъект

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

Агрегация

"У машины есть корпус, колеса и двигатель"

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

Осведомленность

"Каждый человек знает, какие книги он прочитал"

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

Агрегация в C++

class Department; class University { private: Department faculty[20];};

Агрегация по значению

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

Агрегация в C++

class Engine;

class Car { private: Engine* engine; public: Car() { engine = new Engine(); } virtual ~Car() { delete engine; }};

Агрегация по ссылке

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

Осведомленность в C++

class Book; class Person { private: Book** booksRead;};

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

Агрегация в jWidget

● JW.Class имеет деструктор● object.destroy() - вызов деструктора● destroyObject - реализация деструктора● own - агрегация объекта

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

Агрегация в jWidget

class Car extends JW.Class { engine = this.own(new Engine());}

var car = new Car();car.destroy(); // Двигатель уничтожен

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

Реальный пример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 Егор Непомнящих. Агрегация и осведомленность

Реальный пример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 Егор Непомнящих. Агрегация и осведомленность

Реальный пример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 Егор Непомнящих. Агрегация и осведомленность

Реальный пример

class MyView extends JW.Class { constructor() { super(); this._layout(); this.own($(window).jwon( "resize", this._layout, this)); }

_layout() { // ... }}

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

Агрегирующие свойства и коллекции

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

Агрегирующие свойства и коллекции

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

Агрегирующие свойства

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 Егор Непомнящих. Агрегация и осведомленность

Агрегирующие коллекции

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 Егор Непомнящих. Агрегация и осведомленность

Паттерн 1

Простое обновление объекта

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

1. Простое обновление объекта

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

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 Егор Непомнящих. Агрегация и осведомленность

1. Простое обновление объекта

Если подобъект, который хочется заагрегировать в объекте, с ходом времени

пересоздается, поместите его в агрегирующее свойство.

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

1. Простое обновление объекта

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

1. Простое обновление объекта

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

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 Егор Непомнящих. Агрегация и осведомленность

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 Егор Непомнящих. Агрегация и осведомленность

Паттерн 2

Простая отмена операции

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

2. Простая отмена операции

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

2. Простая отмена операции

Если в момент уничтожения или смены состояния объекта может выполняться

некоторая операция, но вы не знаете этого наверняка, то для ее отмены следует

воспользоваться агрегирующим свойством.

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

2. Простая отмена операции

Класс

Класс

Класс

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

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 Егор Непомнящих. Агрегация и осведомленность

Паттерн 3

Массовое уничтожение объектов

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

3. Массовое уничтожение объектов

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

3. Массовое уничтожение объектов

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

3. Массовое уничтожение объектов

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

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 Егор Непомнящих. Агрегация и осведомленность

3. Массовое уничтожение объектов

Если объект вызовом некоторой функции провоцирует создание множества объектов, то

функции следует возвращать один объект, агрегирующий в себе все эти объекты.

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

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 Егор Непомнящих. Агрегация и осведомленность

Паттерн 4

Уничтожение драйвера объекта

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

4. Уничтожение драйвера объекта

Драйвер объекта - это объект, обеспечивающий его актуальность.

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

4. Уничтожение драйвера объектаПример: динамическая смена цветовой схемы приложения

Основная схема Шоколадная схема

Цвет "normal"

Цвет "marginal"

Цвет "critical"

currentScheme

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

4. Уничтожение драйвера объектаПример: динамическая смена цветовой схемы приложения

Основная схема Шоколадная схема

Цвет "normal"

Цвет "marginal"

Цвет "critical"

currentScheme

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

4. Уничтожение драйвера объектаПример: динамическая смена цветовой схемы приложения

Основная схема Шоколадная схема

Цвет "normal"

Цвет "marginal"

Цвет "critical"

currentScheme

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

4. Уничтожение драйвера объектаПример: динамическая смена цветовой схемы приложения

Основная схема Шоколадная схема

Цвет "normal"

Цвет "marginal"

Цвет "critical"

currentScheme

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

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 Егор Непомнящих. Агрегация и осведомленность

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 Егор Непомнящих. Агрегация и осведомленность

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 Егор Непомнящих. Агрегация и осведомленность

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 Егор Непомнящих. Агрегация и осведомленность

4. Уничтожение драйвера объекта

Если функция возвращает объект, который имеет свой драйвер, заагрегируйте этот

драйвер в самом объекте.

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

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 Егор Непомнящих. Агрегация и осведомленность

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 Егор Непомнящих. Агрегация и осведомленность

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://habrahabr.ru/post/270879/