Володимир Семенякін “demiurg. Приручення заліза”

100
Знакомимся - Год objective-C++ CMK - Год C++ 4A Games - Полгода Java SE + EE в Bionic University - 10 статей, косящих под науку - Около 15 опубликованных рассказов - В планах – учиться на режиссёра

Upload: lviv-startup-club

Post on 28-Jan-2018

301 views

Category:

Business


2 download

TRANSCRIPT

Page 1: Володимир Семенякін “Demiurg. Приручення заліза”

Знакомимся

- Год objective-C++ CMK

- Год C++ 4A Games

- Полгода Java SE + EE в Bionic University

- 10 статей, косящих под науку

- Около 15 опубликованных рассказов

- В планах – учиться на режиссёра

Page 2: Володимир Семенякін “Demiurg. Приручення заліза”

О чём пойдёт речь

Романтические бредни

Кульбиты идей без кумиров

Сёрфинг на гребняхабстракции

++11С

ШАБЛОНЫ против

ВИРТУАЛЬНОСТИ

fАнтинаучные размышления

SIM-АРХИТЕКТУРА

Алгоритмы оптимизации*

Динамические библиотеки

Гуманитарное мышление

Умные указатели

DEMIURG

Алгоритмы оптимизации*

Многослойность Модульность

Плагины Низкий уровень

Page 3: Володимир Семенякін “Demiurg. Приручення заліза”

Открытие ООП

Глава первая

Page 4: Володимир Семенякін “Demiurg. Приручення заліза”
Page 5: Володимир Семенякін “Demiurg. Приручення заліза”

Что это такое?

Пример

Структура

Объяснение

Истории

Краткое описание шаблона

Расширенное описание на примере

UML с указанием назначения классов

Краткое пояснение взаимодействия классов на UML

Всякие странные задачки по мотивам

Page 6: Володимир Семенякін “Demiurg. Приручення заліза”

IGorynych

Cards

NIICHAVO

Page 7: Володимир Семенякін “Demiurg. Приручення заліза”

Манифест самоделкиных

Не бойся тюрьмы, Не бойся сумы,

Не бойся ни мора, ни глада,

А бойся единственно только того,

Кто скажет: «Я знаю, как надо!»

Page 8: Володимир Семенякін “Demiurg. Приручення заліза”

Маленький физический этюд

Глава вторая

История удивительных превращений

Page 9: Володимир Семенякін “Demiurg. Приручення заліза”
Page 10: Володимир Семенякін “Demiurg. Приручення заліза”

MovingForce

PushingForce

GravityForce

JumpingForce

g

T

Page 11: Володимир Семенякін “Demiurg. Приручення заліза”
Page 12: Володимир Семенякін “Demiurg. Приручення заліза”

S

I

M

Page 13: Володимир Семенякін “Demiurg. Приручення заліза”

SIM-подход

Shell

Model Influence

Page 14: Володимир Семенякін “Demiurg. Приручення заліза”

ShellAbstraction

ModelPos: (100; 80)Speed: (0; 0)Rotation: 0Mass: 4.5

. . .

Influence Flex: 0.05 Obj_1: obj1 Obj_2: obj2

Page 15: Володимир Семенякін “Demiurg. Приручення заліза”

Physical Object

Shell

Base Property Packabstract

PrDynamic

PrOptic

PrElectricity

Model

Page 16: Володимир Семенякін “Demiurg. Приручення заліза”

Physical object

Shell

Base Ruleabstract

RuleOhme

RuleFerma

Influence

RuleNewton

Page 17: Володимир Семенякін “Demiurg. Приручення заліза”

PhysicSyst – main class of the engine

Page 18: Володимир Семенякін “Demiurg. Приручення заліза”

PhysicSyst – main class of the engine

O

S

I

M

Page 19: Володимир Семенякін “Demiurg. Приручення заліза”

Следующий шаг…

Physical Object

Shell

Model

+ =

Physical World

+

Models List

Property Packs

Rules&

Utilities

Page 20: Володимир Семенякін “Demiurg. Приручення заліза”
Page 21: Володимир Семенякін “Demiurg. Приручення заліза”

O

S

I

M

Page 22: Володимир Семенякін “Demiurg. Приручення заліза”

O

S

I

M

Prototypes

Page 23: Володимир Семенякін “Demiurg. Приручення заліза”

Программирование по Платону

или

Эпическая битва тараканов в голове

Глава третья

Page 24: Володимир Семенякін “Demiurg. Приручення заліза”

Какие-то мысли

Главная задача архитектуры:

Правильное распределение областей ответственности

Программа как модель Вселенной:

Точное отображение предметной области

Page 25: Володимир Семенякін “Demiurg. Приручення заліза”
Page 26: Володимир Семенякін “Demiurg. Приручення заліза”
Page 27: Володимир Семенякін “Demiurg. Приручення заліза”
Page 28: Володимир Семенякін “Demiurg. Приручення заліза”
Page 29: Володимир Семенякін “Demiurg. Приручення заліза”

Data Context Interaction

Page 30: Володимир Семенякін “Demiurg. Приручення заліза”
Page 31: Володимир Семенякін “Demiurg. Приручення заліза”

LINQ

Page 32: Володимир Семенякін “Demiurg. Приручення заліза”

Глава четвёртая

Page 33: Володимир Семенякін “Demiurg. Приручення заліза”

Просто написать игру

Game

UserCode

Page 34: Володимир Семенякін “Demiurg. Приручення заліза”

Платформонезависимая игра

Game

IGame

UserCode

Page 35: Володимир Семенякін “Demiurg. Приручення заліза”

Вот… Платформонезависимая

WindowsGame

AndroidGame

IGame

UserCode

Page 36: Володимир Семенякін “Demiurg. Приручення заліза”

Spring?!!

Game

UserCode

Page 37: Володимир Семенякін “Demiurg. Приручення заліза”

Хочу такое же!!.

WindowsGame

AndroidGame

IGame

UserCode

User configuration

Default сonfiguration

Page 38: Володимир Семенякін “Demiurg. Приручення заліза”

… с зависимостями чтобы

WindowsGame

AndroidGame

IGame

UserCode

User configuration

Default сonfiguration

Page 39: Володимир Семенякін “Demiurg. Приручення заліза”

С библиотечными модулями!!

Physic

.so / .dll

.aWindowsGame

AndroidGame

IGame

UserCode

User configuration

Default сonfiguration

.a

Page 40: Володимир Семенякін “Demiurg. Приручення заліза”

A la Maven!!!!

Physic

.so / .dll

.aWindowsGame

AndroidGame

IGame

UserCode

User configuration

Default сonfiguration

.a

Page 41: Володимир Семенякін “Demiurg. Приручення заліза”

С магазином библиотек!!!!!

$$$

Physic

.so / .dll

.aWindowsGame

AndroidGame

IGame

UserCode

User configuration

Default сonfiguration

.a

Page 42: Володимир Семенякін “Demiurg. Приручення заліза”

$$$

Physic

.so / .dll

.aWindowsGame

AndroidGame

IGame

UserCode

User configuration

Default сonfiguration

.a

Да ещё и на «плюсах»

С++

Page 43: Володимир Семенякін “Demiurg. Приручення заліза”

Принципы

Упрощение конфигурированияУпрощение конфигурирования

- Простота добавления зависимостей

- Простота переключения между источниками

- Простота контроля версий

Соблюдение «хороших» принциповСоблюдение «хороших» принципов

- Использование контекстной композиции

- Избегание глобальных и статических переменных

- Прозрачность жизненного цикла объектов

Page 44: Володимир Семенякін “Demiurg. Приручення заліза”

Window *theWindow = new Window(. . .);

View *theView0 = new View(. . .);View *theView1 = new View(. . .);

theWindow->contentView()->addSubview(theView0);theView0->addSubview(theView1);

Использование контекстной композиции

Page 45: Володимир Семенякін “Demiurg. Приручення заліза”

Window *theWindow = new Window(. . .);

View *theView0 = new View(. . .);View *theView1 = new View(. . .);

theWindow->contentView()->addSubview(theView0);theView0->addSubview(theView1);

Использование контекстной композиции

Page 46: Володимир Семенякін “Demiurg. Приручення заліза”

Window *theWindow = new Window(. . .);

View *theView0 = new View(. . .);View *theView1 = new View(. . .);

theWindow->contentView()->addSubview(theView0);theView0->addSubview(theView1);

Window *theWindow = new Window(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Использование контекстной композиции

Page 47: Володимир Семенякін “Demiurg. Приручення заліза”

Window *theWindow = new Window(. . .);

View *theView0 = new View(. . .);View *theView1 = new View(. . .);

theWindow->contentView()->addSubview(theView0);theView0->addSubview(theView1);

Window *theWindow = new Window(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Использование контекстной композиции

Page 48: Володимир Семенякін “Demiurg. Приручення заліза”

Window *theWindow = new Window(. . .);

View *theView0 = new View(. . .);View *theView1 = new View(. . .);

theWindow->contentView()->addSubview(theView0);theView0->addSubview(theView1);

Window *theWindow = new Window(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Использование контекстной композиции

Page 49: Володимир Семенякін “Demiurg. Приручення заліза”

Window *theWindow = new Window(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Прозрачность использования ресурсов

Page 50: Володимир Семенякін “Demiurg. Приручення заліза”

delete theView0;delete theView1;delete theWindow;

Window *theWindow = UIContext()->createWindow(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Прозрачность использования ресурсов

Page 51: Володимир Семенякін “Demiurg. Приручення заліза”

delete theView0;delete theView1;delete theWindow;

delete theView1;delete theView0;delete theWindow;

Window *theWindow = UIContext()->createWindow(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Прозрачность использования ресурсов

Page 52: Володимир Семенякін “Demiurg. Приручення заліза”

delete theView0;delete theView1;delete theWindow;

delete theView1;delete theView0;delete theWindow;

delete theWindow;

Window *theWindow = UIContext()->createWindow(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Прозрачность использования ресурсов

Page 53: Володимир Семенякін “Demiurg. Приручення заліза”

delete theView0;delete theView1;delete theWindow;

delete theView1;delete theView0;delete theWindow;

delete theWindow;

Window *theWindow = UIContext()->createWindow(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Прозрачность использования ресурсов

Page 54: Володимир Семенякін “Demiurg. Приручення заліза”

. . .

SomeType *theSomeVariable = new SomeType();

delete theSomeVariable;

Прозрачность использования ресурсов

Page 55: Володимир Семенякін “Demiurg. Приручення заліза”

SomeType *theSomeVariable = new SomeType();

delete theSomeVariable;

Прозрачность использования ресурсов

Page 56: Володимир Семенякін “Demiurg. Приручення заліза”

SomeType *theSomeVariable = new SomeType();

Прозрачность использования ресурсов

Page 57: Володимир Семенякін “Demiurg. Приручення заліза”
Page 58: Володимир Семенякін “Demiurg. Приручення заліза”

Я создаю объект.Объект существует, пока он мне нужен.Когда объект мне не нужен, я удаляю его.

{ }

Page 59: Володимир Семенякін “Demiurg. Приручення заліза”

{ MyObject theObject;

}

Объект создан

Объект удалён

copemancopeman

~ MyObject()

Page 60: Володимир Семенякін “Demiurg. Приручення заліза”

{ MyObject theObject;

}

Объект создан

Объект удалён

Class Struct Method Function nothing

. . .

copemancopeman

Page 61: Володимир Семенякін “Demiurg. Приручення заліза”

{ SmartReference theRef = new SomeType();

. . .} ~ SmartReference () { delete ptr; }

SmartReference(SomeType *p) { ptr = p; }

Умные указатели

Page 62: Володимир Семенякін “Demiurg. Приручення заліза”

void someFunction(SmartReference &inRef) {

SmartReference theOtherRef = inRef;

}

{ SmartReference theRef = new SomeType(); someFunction(theRef);

} ~ SmartReference () { delete ptr; }

SmartReference(SomeType *p) { ptr = p; }

SmartReference(SmartReference &r) { ptr = r.ptr; }

~ SmartReference () { delete ptr; }

Умные указатели

Page 63: Володимир Семенякін “Demiurg. Приручення заліза”
Page 64: Володимир Семенякін “Demiurg. Приручення заліза”

void someFunction(SmartReference &inRef) {

SmartReference theOtherRef = inRef;

}

{ SmartReference theRef = new SomeType(); someFunction(theRef);

} ~ SmartReference () { delete ptr; }

SmartReference(SomeType *p) { ptr = p; }

SmartReference(SmartReference &r) { ptr = r.ptr; }

~ SmartReference () { delete ptr; }

1

2

3

4

Умные указатели

Page 65: Володимир Семенякін “Demiurg. Приручення заліза”

void someFunction(SmartReference &inRef) {

SmartReference theOtherRef = inRef;

}

{ SmartReference theRef = new SomeType(); someFunction(theRef);

} ~ SmartReference () { delete ptr; }

SmartReference(SomeType *p) { ptr = p; }

SmartReference(SmartReference &r) { ptr = r.ptr; }

~ SmartReference () { delete ptr; }

1

2

3

4

Умные указатели

Page 66: Володимир Семенякін “Demiurg. Приручення заліза”

{ SmartReference theRef = new HolderType(SomeType());

someFunction(theRef);

} ~ SmartReference () { --h_p->own_count; if (0 == h_p->own_count) delete h_p;}

SmartReference(HolderType *h) { h_p = h; ++h_p->own_count; }

HolderType(SomeType &v) { val = v; own_count = 1; }

Умные указатели

Page 67: Володимир Семенякін “Demiurg. Приручення заліза”

void someFunction(SmartReference &inRef) {

SmartReference theOtherRef = inRef;

}

{ SmartReference theRef = new HolderType(SomeType()); someFunction(theRef);

}

11

121

0

Умные указатели

Page 68: Володимир Семенякін “Demiurg. Приручення заліза”

MemoryHoldervoid retain( ) = 0void release( ) = 0

CountedMemoryHoldervoid retain( ) { inc (r_count)}

void release( ) { dec (r_count) (r_count == 0) => remove()}

void remove( ) = 0

AllocatingCounted\MemoryHolder

void remove( ) { allocator.dealloc(this)}

Умные указатели

Page 69: Володимир Семенякін “Demiurg. Приручення заліза”

DStrongReference<SomeType> theStrongReference = theStorage.create();

DSomeStorage<SomeType> theStorage;

Контекст, в котором живут объекты:

Любое место программы:

DWeakReference<SomeType> theWeakReference = theStrongReference;

Любое другое место программы:

Умные указатели

Page 70: Володимир Семенякін “Demiurg. Приручення заліза”

Window *theWindow = new Window(. . .);

View *theView0 = new View(. . .);View *theView1 = new View(. . .);

theWindow->contentView()->addSubview(theView0);theView0->addSubview(theView1);

Window *theWindow = new Window(. . .);

View *theView0 = theWindow->contentView()-> createSubview(. . .);

View *theView1 = theView0->createSubview(. . .);

Умные указатели

Page 71: Володимир Семенякін “Demiurg. Приручення заліза”

Умные указатели

DHeapStorage<SomeType> theWindowsStorage;

DStrongReference<Window> theWindow = theWindowsStorage.createWindow(…);

DStrongReference<View> theView0 = theWindow->contentView()->createSubview(. . .);

DStrongReference<View> theView1 = theView0->createSubview(. . .);

Page 72: Володимир Семенякін “Demiurg. Приручення заліза”

Тонкая виртуальная машина

Точное отображение предметной области

Page 73: Володимир Семенякін “Demiurg. Приручення заліза”

void avadaKedavra(. . .);

.cpp.cpp .h

static MyLonelyClass sTexasRanger;

.h .cpp.cpp .h

.h

Контексты

Page 74: Володимир Семенякін “Demiurg. Приручення заліза”

.cpp

.cpp

.h

class Application {public: void avadaKedavra(. . .); MyLonelyClass &getTexasRanger( );}

.h.cpp.h

.cpp.h

Контексты

Page 75: Володимир Семенякін “Demiurg. Приручення заліза”

class ApplicationContext {private: DStrongReference<Window> _window; DStrongReference<View> _view0; DStrongReference<View> _view1;

public: void initialize( ) { _window = sHeapStorage()->create<Window>(…);

_view0 = _window->contentView()->createSubview(. . .); _view1 = theView0->createSubview(. . .); }}

?

Умные указатели

X

Page 76: Володимир Семенякін “Demiurg. Приручення заліза”

class ApplicationContext {private: DStrongReference<Window> _window; DStrongReference<View> _view0; DStrongReference<View> _view1;

public: void initialize( ) { _window = sHeapStorage()->create<Window>(…);

_view0 = _window->contentView()->createSubview(. . .); _view1 = theView0->createSubview(. . .); }}

verify()

Умные указатели

X

Page 77: Володимир Семенякін “Demiurg. Приручення заліза”

Контексты

- Контролёр взаимодействия объектов

Контекст – это:

- Фабрика объектов

- Интерфейс библиотеки

- Точка доступа к окружению

- «Система» в прототипном подходе

Page 78: Володимир Семенякін “Demiurg. Приручення заліза”

ContextManager

Context0 Context1 Context2

Контексты

Page 79: Володимир Семенякін “Demiurg. Приручення заліза”

ContextManager

Context0 Context1 Context2

Контексты

Page 80: Володимир Семенякін “Demiurg. Приручення заліза”

ContextManager

PlugIn0 PlugIn1 PlugIn2

Контексты

Page 81: Володимир Семенякін “Demiurg. Приручення заліза”

ContextManager

PlugIn0 LoopContext PlugIn2

Контексты

Page 82: Володимир Семенякін “Demiurg. Приручення заліза”

Плагины

Page 83: Володимир Семенякін “Demiurg. Приручення заліза”

Один раз написано. Компилируется везде

Внутренние реализации

Уровень интерфейсных связокУровень интерфейсных связок

Уровень реализацийУровень реализаций

Уровень прикладного кодаУровень прикладного кода

Упрощение связывания с реализациями

Связки

Что-то вроде Spring

Page 84: Володимир Семенякін “Demiurg. Приручення заліза”

DPlugInHolder Контроль жизненного циклаплагина с учётом спецификиместа его хранения

DPlugIn Реализация функционала

Решение зависимостей междуплагинами

Инъекция зависимостей

Минимальное описаниесобственных зависимостей

DPlugInManager

Плагины

Page 85: Володимир Семенякін “Demiurg. Приручення заліза”

DPackagePlugInHolder

DRAMPlugInHolder

Плагины

Хранение плагина воперативной памяти

Получение плагиновиз пакета – внешнегохранилища (например,из HDD)

Page 86: Володимир Семенякін “Demiurg. Приручення заліза”

SPlugIn0SDeveloper’sside only!

SPlugIn1S

DPlugIn1D

DPlugIn2D

DApplicationD

BUILD

RUN TIME

Простота добавления зависимостей

Page 87: Володимир Семенякін “Demiurg. Приручення заліза”

class DSomePlugIn : public DPlugIn{public:

// Plug-in public methodsD_EXPORT void foo() D_SUFFIX;

. . .

// Inherited plug-in implementationstatic void fillDescriptor(DPlugInDescriptor &);virtual void initialMediumRequest(DPlugInMediator &);virtual void initialize();

};

Простота добавления зависимостей

Page 88: Володимир Семенякін “Demiurg. Приручення заліза”

static void fillDescriptor(DPlugInDescriptor &);

virtual void initialize();

virtual void initialMediumRequest(DPlugInMediator &);

outMediator.addBinding("DVirtualDeviceRAM", _dependencies.virtualDeviceRAM);

outDescriptor.setName("DWindowBasedGUIContext“);

outDescriptor.addDependecy("DVirtualDeviceRAM“, [“MTag"]);

// Some initializing after dependency injection

Простота добавления зависимостей

outDescriptor.setTag(“Platform::Windows”);

Page 89: Володимир Семенякін “Demiurg. Приручення заліза”

static void fillDescriptor(DPlugInDescriptor &);

virtual void initialize();

outMediator.addBinding("DVirtualDeviceRAM", _dependencies.virtualDeviceRAM);

outDescriptor.setName("DWindowBasedGUIContext“);

outDescriptor.addDependecy("DVirtualDeviceRAM“, [“MTag"]);

// Some initializing after dependency injection

Простота добавления зависимостей

outDescriptor.setTag(“Platform::Windows”);

Inteface

UserCode

NS_0::Tag_Outer::Tag_InnerNS_1::Tag. . .

NS::ExtraTag

Page 90: Володимир Семенякін “Demiurg. Приручення заліза”

D_EXPORT void foo() D_SUFFIX;

Простота переключения между источниками

Page 91: Володимир Семенякін “Demiurg. Приручення заліза”

D_EXPORT void foo() D_SUFFIX;

virtual -

DynamicInterface

DynamicImplementation

Static“Interface”

StaticImplementation

virtual = 0;

- -

- -

Простота переключения между источниками

Page 92: Володимир Семенякін “Demiurg. Приручення заліза”

.h.dll / .so

some_dynamic_package

implementation (.dll) / (.so)

interface

some_dynamic_package

some_dynamic_package.h

...

Пакетные библиотеки

Page 93: Володимир Семенякін “Demiurg. Приручення заліза”

.h.а

some_static_package

some_static_package (.a)

interface

some_static_package

some_static_package.h

...

Пакетные библиотеки

Page 94: Володимир Семенякін “Demiurg. Приручення заліза”

dynamic

packages

interface

implementation (.dll / .so)

dynamic_package_0

dynamic_package_1…

static

static_package_0 (.a)

static_package_1 (.a)

static_package_0

interface…

static_package_1…

#include <some_package_0/ interface/package.h>

Library search path:-L "..\..\packages_shared\static“

Static library flag:-l static_package_0

Just runtime binding

Page 95: Володимир Семенякін “Demiurg. Приручення заліза”

Demiurg SDK

DPlugIn

DSystemLoopManager

DWindowBasedUIContext

DVirtualDevice

DHDDVirtualDevice

DGPUVirtualDevice

DLoopManager

DLoopContext

DDemiurgCore

DExampleApplicationContext Examples

DRAMVirtualDevice

Page 96: Володимир Семенякін “Demiurg. Приручення заліза”

Проблемы

_view1->addSubview(_view0);

package.a ???

Ресурсные пакеты

???

??????

??????

_window = 0; ??????

Page 97: Володимир Семенякін “Demiurg. Приручення заліза”

Install

1. Скачать demiurg_sdk

2. Установить и связать с проектом

3. Описать зависимости плагина

Цель: моментальный старт

4. Собрать и запустить приложение

// Inherited plug-in implementationstatic void fillDescriptor(DPlugInDescriptor &);virtual void initialMediumRequest(DPlugInMediator &);virtual void initialize();

Download

Build

Page 98: Володимир Семенякін “Demiurg. Приручення заліза”

Суть: Магазин программных библиотекЦелевая аудитория: Разработчики

Цель: Магазин

Page 99: Володимир Семенякін “Demiurg. Приручення заліза”

Суть: Магазин приложенийЦелевая аудитория: Обычные пользователи

Цель: Магазин

Page 100: Володимир Семенякін “Demiurg. Приручення заліза”