Upload
roman-v-babenko
View
220
Download
0
Embed Size (px)
Citation preview
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
1/151
flying objectsless code for richer user interface
Oleg Andreev
oleganza.tumblr.com
Ruby BarCampOctober 2010
Kiev
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
2/151
part onethe problem
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
3/151
a typical web app
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
4/151
a typical web app
receive
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
5/151
a typical web app
receive
route
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
6/151
a typical web app
receive
route
talk to db
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
7/151
a typical web app
receive
route
talk to db
return html
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
8/151
receive
route
talk to db
return html
tools for everything
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
9/151
receive
route
talk to db
return html
passenger, mongrel, thin, unicorn
tools for everything
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
10/151
receive
route
talk to db
return html
passenger, mongrel, thin, unicorn
rack, rails, sinatra
tools for everything
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
11/151
receive
route
talk to db
return html
passenger, mongrel, thin, unicorn
rack, rails, sinatra
activerecord, datamapper, sequel
tools for everything
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
12/151
receive
route
talk to db
return html
passenger, mongrel, thin, unicorn
rack, rails, sinatra
activerecord, datamapper, sequel
erb, haml, helpers, builders
tools for everything
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
13/151
receive
route
talk to db
return html erb, haml, helpers, builders
tools for everything
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
14/151
receive
route
talk to db
return html erb, haml, helpers, builders
tools for everything
PHP
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
15/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
16/151
rails app
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
17/151
rails app
index.html.erb
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
18/151
rails app
index.html.erb
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
19/151
rails app
index.html.erb
_display.html.erb
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
20/151
rails app
index.html.erb
_display.html.erb
Bob Dylan
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
21/151
rails app
index.html.erb
_display.html.erb
Bob Dylan
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
22/151
rails app
index.html.erb
_display.html.erb
Bob Dylan
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
23/151
rails app
index.html.erb
_display.html.erb
Bob Dylan
_wheel.html.erb
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
24/151
rails app
index.html.erb
_display.html.erb
Bob Dylan
_wheel.html.erb
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
25/151
rails app
index.html.erb
_display.html.erb
Bob Dylan
_wheel.html.erb
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
26/151
html
Bob Dylan
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
27/151
real html
Bob Dylan
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
28/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
29/151
$(#display)
$(#artist .name)
$(#wheel)$(#button)
...
di
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
30/151
real html
Bob Dylan
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
31/151
var playerController
var display
Bob Dylanvar artist
var wheelControl
var button
javascript
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
32/151
var playerController
var display
Bobvar artist
var wheelControl
var button
index.html.erb
_display.html.erb
Dylan
_wheel.html.erb
ruby javascript
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
33/151
var playerController
var display
Bobvar artist
var wheelControl
var button
index.html.erb
_display.html.erb
Dylan
_wheel.html.erb
ruby javascripttons of glue code
...
dom:onload...
$(#content)$(display)
...
$(this)and
$(that)
...
$(#wheel)
$(button)...$$$
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
34/151
var playerController
var display
Bobvar artist
var wheelControl
var button
index.html.erb
_display.html.erb
Dylan
_wheel.html.erb
ruby javascripttons of glue code
...
dom:onload...
$(#content)$(display)
...
$(this)and
$(that)
...
$(#wheel)
$(button)...$$$
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
35/151
var playerController
var display
Bobvar artist
var wheelControl
var button
index.html.erb
_display.html.erb
Dylan
_wheel.html.erb
ruby javascript
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
36/151
var playerController
var display
Bobvar artist
var wheelControl
var button
Dylan
ruby javascript
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
37/151
var playerController
var display
Bobvar artist
var wheelControl
var button
Dylan
ruby javascript
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
38/151
part twothe framework
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
39/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
40/151
models,views,controllers
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
41/151
models,views,controllers
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
42/151
models,views,controllers
frame
display
wheel
button
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
43/151
models,views,controllers
frame
display
wheel
button
player controller
track controller
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
44/151
models,views,controllers
frame
display
wheel
button
player controller
track controller
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
45/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
46/151
models,views,controllers
frame
display
wheel
button
player controller
track controller
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
47/151
models,views,controllers
frame
display
wheel
button
player controller
track controller
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
48/151
models,views,controllers
frame
display
wheel
button
player controller
track controller
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
49/151
models,views,controllers
frame
display
wheel
button
player controller
track controller
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
50/151
models,views,controllers
frame
display
wheel
button
player controller
track controller
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
51/151
frame
display
wheel
button
player controller
track controller
artist
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
52/151
frame
display
wheel
button
player controller
track controller
artist
track
playlist
create on the server
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
53/151
frame
display
wheel
button
player controller
track controller
artist
track
playlist
copy to the client
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
54/151
how?
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
55/151
...
var app = ;
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
56/151
...
var app = ;
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
57/151
...
var app = ;
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
58/151
...
var app = ;
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
59/151
but it does not work
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
60/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
61/151
directed graph
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
62/151
multiple references
displaytrack controller
track
playlist
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
63/151
cyclic references
track controller button
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
64/151
what is the graph?
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
65/151
two things:
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
66/151
two things:
objects
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
67/151
two things:
objectsreferences
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
68/151
in the code:
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
69/151
in the code:
create the objects
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
70/151
in the code:
create the objectsconnect to each other
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
71/151
create
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
72/151
create
var playerController = new PlayerController();
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
73/151
create
var playerController = new PlayerController();
var trackController = new TrackController();
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
74/151
create
var playerController = new PlayerController();
var trackController = new TrackController();
var track = new Track();
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
75/151
create
var playerController = new PlayerController();
var trackController = new TrackController();
var track = new Track();
var frame = document.getElementById(frame);
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
76/151
create
var playerController = new PlayerController();
var trackController = new TrackController();
var track = new Track();
var frame = document.getElementById(frame);
var display = new DisplayControl();
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
77/151
create
var playerController = new PlayerController();
var trackController = new TrackController();
var track = new Track();
var frame = document.getElementById(frame);
var display = new DisplayControl();
order is not important
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
78/151
connect
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
79/151
connect
playerController.trackController= trackController;
playerController.frame = frame;
playerController.display = display;
trackController.track= track;
display.track= track;
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
80/151
connect
playerController.trackController= trackController;
playerController.frame = frame;
playerController.display = display;
trackController.track= track;
display.track= track;
order is still not important
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
81/151
constructor initializer
objects are connected after being created
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
82/151
initialize after connecting the graph
create event listeners, display data etc.
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
83/151
awake
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
84/151
awake
playerController.awake();
trackController.awake();
display.awake();
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
85/151
awake
playerController.awake();
trackController.awake();
display.awake();
order is still not important
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
86/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
87/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
88/151
when to launch the graph?
root.didAwakeAll();
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
89/151
var playerController = new PlayerController();
var trackController = new TrackController();
var track = new Track();var frame = document.getElementById(frame);
var display = new DisplayControl();
playerController.trackController= trackController;
playerController.frame = frame;
playerController.display = display;
trackController.track= track;display.track= track;
playerController.awake();
trackController.awake();
display.awake();
playerController.didAwakeAll();
function() {
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
90/151
var playerController = new PlayerController();
var trackController = new TrackController();
var track = new Track();var frame = document.getElementById(frame);
var display = new DisplayControl();
playerController.trackController= trackController;
playerController.frame = frame;
playerController.display = display;
trackController.track= track;display.track= track;
playerController.awake();
trackController.awake();
display.awake();
playerController.didAwakeAll();
function() {
return playerController;
}
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
91/151
...
jQuery( function( ) {
window.controller = aFunction();
} )
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
92/151
...
jQuery( function( ) {
window.controller = aFunction();
} )
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
93/151
...
jQuery( function( ) {
window.controller = aFunction();
} )
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
94/151
...
jQuery( function( ) {
window.controller = aFunction();
} )
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
95/151
...
jQuery( function( ) {
window.controller = ()();
} )
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
96/151
( ) {
ller = ()();
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
97/151
( ) {
ller = ()();
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
98/151
last partthe algorithm
l ith i t h ll
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
99/151
algorithm in a nutshell
l ith i t h ll
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
100/151
algorithm in a nutshell
two tables: objects and references
l ith i t h ll
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
101/151
algorithm in a nutshell
two tables: objects and references
add a root object
l ith i t h ll
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
102/151
algorithm in a nutshell
two tables: objects and references
add a root object
add the references (name, value)
l ith i t h ll
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
103/151
algorithm in a nutshell
two tables: objects and references
add a root object
add the references (name, value)
continue recursively
l ith i t h ll
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
104/151
algorithm in a nutshell
two tables: objects and references
add a root object
add the references (name, value)
continue recursively
skip already added objects
l ith i t h ll
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
105/151
algorithm in a nutshell
two tables: objects and references
add a root object
add the references (name, value)
continue recursively
skip already added objects
when done, convert the tables to javascript
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
106/151
APIapplication programming inspiration
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
107/151
1988
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
108/151
1988Jean-Marie HullotNextStep
InterfaceBuilder
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
109/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
110/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
111/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
112/151
InterfaceBuilder
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
113/151
InterfaceBuilder
InterfaceBuilder
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
114/151
InterfaceBuilder
layout
InterfaceBuilder
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
115/151
InterfaceBuilder
layout
controllers
InterfaceBuilder
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
116/151
InterfaceBuilder
layout
controllers
actions
InterfaceBuilder
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
117/151
InterfaceBuilder
layout
controllers
actions
arbitrary objects
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
118/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
119/151
d l l
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
120/151
developer.apple.com
Archives and Serializations Programming Guide
NSCoding Protocol Reference
NSCoder
NSKeyedArchiver
NSKeyedUnarchiver
NSCoding
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
121/151
NSCoding(PlayerController)
NSCoding
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
122/151
NSCoding
- (void)encodeWithCoder:(NSCoder*) coder {
(PlayerController)
NSCoding
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
123/151
NSCoding
- (void)encodeWithCoder:(NSCoder*) coder {
[coder encodeObject:playlistforKey:@"playlist"];
(PlayerController)
NSCoding
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
124/151
NSCoding
- (void)encodeWithCoder:(NSCoder*) coder {
[coder encodeObject:playlistforKey:@"playlist"];
[coder encodeObject:trackControllerforKey:@"trackController"];
(PlayerController)
NSCoding
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
125/151
NSCoding
- (void)encodeWithCoder:(NSCoder*) coder {
[coder encodeObject:playlistforKey:@"playlist"];
[coder encodeObject:trackControllerforKey:@"trackController"];
[coder encodeObject:frameforKey:@"frame"];
(PlayerController)
NSCoding
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
126/151
NSCoding
- (void)encodeWithCoder:(NSCoder*) coder {
[coder encodeObject:playlistforKey:@"playlist"];
[coder encodeObject:trackControllerforKey:@"trackController"];
[coder encodeObject:frameforKey:@"frame"];
[coder encodeObject:displayforKey:@"display"];
(PlayerController)
NSCoding
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
127/151
NSCoding
- (void)encodeWithCoder:(NSCoder*) coder {
[coder encodeObject:playlistforKey:@"playlist"];
[coder encodeObject:trackControllerforKey:@"trackController"];
[coder encodeObject:frameforKey:@"frame"];
[coder encodeObject:displayforKey:@"display"];
}
(PlayerController)
NSCoding in Ruby
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
128/151
NSCoding in Ruby
def encode_with_coder(coder)
coder.encode_object_for_key(playlist, "playlist")
coder.encode_object_for_key(trackController, "trackController")
coder.encode_object_for_key(frame, "frame")
coder.encode_object_for_key(display, "display")
end
(PlayerController)
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
129/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
130/151
coder = JSCoder.new
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
131/151
coder = JSCoder.new
coder.root_object = controller
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
132/151
coder = JSCoder.new
coder.root_object = controller
coder.encode
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
133/151
coder = JSCoder.new
coder.root_object = controller
coder.encode
window.controller = ()()
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
134/151
coder.rb
github.com/oleganza/coder
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
135/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
136/151
ruby object js object
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
137/151
ruby object js object
ruby class js prototype
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
138/151
TrackController = Class.create({
awake: function() {this.button.addEventListener(
"click", this.onClick.bind(this));
},onClick: function() {
this.track.togglePlayPause();
this.display.update();
}
});
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
139/151
TrackController = Class.create({
awake: function() {this.button.addEventListener(
"click", this.onClick.bind(this));
},onClick: function() {
this.track.togglePlayPause();
this.display.update();
}
});
why is it cool?
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
140/151
why is it cool?
why is it cool?
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
141/151
why is it cool?
automatically assigned properties
why is it cool?
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
142/151
why is it cool?
automatically assigned properties
no dependency on global state
why is it cool?
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
143/151
why is it cool?
automatically assigned properties
no dependency on global state
no time dependency
why is it cool?
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
144/151
why is it cool?
automatically assigned properties
no dependency on global state
no time dependency
highly recyclable (refactoring-friendly)
whats next
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
145/151
what s next
whats next
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
146/151
what s next
object-oriented views
whats next
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
147/151
what s next
object-oriented views
ubiquitous wysiwyg editing
whats next
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
148/151
what s next
object-oriented views
ubiquitous wysiwyg editing
remote code editing
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
149/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
150/151
8/7/2019 RubyConfUA - Flying objects less code for richer user interface Oleg Andreev
151/151
thank you
github.com/oleganza/coder