Slide 1

Slide 1 text

for Java Developers

Slide 2

Slide 2 text

About Me • C# since 2005 till 2012 • Java since 2012 • JavaScript, Dart since 2013 • Working at Farata Systems • Conduct trainings 2

Slide 3

Slide 3 text

What is Dart? 3 New programming language and platform created by for Web development 3

Slide 4

Slide 4 text

4 Blink…! WebKit… Reader… Code Search… Chrome Frame…

Slide 5

Slide 5 text

Dart is Truly OSS • Public commits • Public issue tracker • Public code reviews • Accept contributions 5

Slide 6

Slide 6 text

• Dart is ECMA standard (TC52) • Also ECMA: JavaScript, C#, C++/CLI, JSON, ActionScript 6 What does it mean? ECMA committee standardizes syntax, semantics, core libraries Why it is important? Safe to develop own VMs and embed in browsers

Slide 7

Slide 7 text

Team • Lars Bak - HotSpot, V8, a Smalltalk VM, BETA • Kasper Lund - HotSpot, V8, OOVM • Gilad Bracha - Java Specification, Strongtalk, Newspeak • Many other engineers 7

Slide 8

Slide 8 text

http://youtu.be/huawCRlo9H4 8

Slide 9

Slide 9 text

Timeline 9 Sep 1, 2011 Oct 10, 2011 May 21, 2014 1.0 Release First commit Announcement Nov 14, 2013 1.4 Release

Slide 10

Slide 10 text

Dart at a glance • Runs in VM • Compiles to JavaScript • Dynamically typed • Object-oriented • Single inheritance • Single-threaded • Familiar syntax 10

Slide 11

Slide 11 text

How is it better than JS? • Faster • Predictable (no hoisting, no type coercion, etc.) • Rich standard libraries • Structured apps • Good tooling • Packaging system 11

Slide 12

Slide 12 text

What's Your Benefit? 12 Q: Front-end Developer? A: Build reliable apps faster Q: Back-end Developer? A: Probably just curiosity

Slide 13

Slide 13 text

Language Tour 13

Slide 14

Slide 14 text

Hello World 14 // Formal example
 void main(List args) {
 print('Hello from Dart!');
 }
 
 // Shorter version
 main() => print('Hello from Dart!'); • Explicit entry point

Slide 15

Slide 15 text

Built-in Types 15 int var i = 1;
 var hex = 0xABCD; double var d = 1.2;
 var exp = 1.2e9; String var s1 = 'single quotes';
 var s2 = "double quotes"; bool var b1 = false;
 var b2 = true; Symbol var sym1 = #mySymbol;
 var sym2 = const Symbol('mySymbol'); List var list = ['item1', 'item2', 'item3']; Map var map = {'key1': 'val1', 2: 'val2', []: 'val3'};

Slide 16

Slide 16 text

JSON is valid Dart Syntax 16 var map =
 {
 'firstName' : 'John',
 'lastName' : 'Doe',
 'age' : 30,
 'addresses' : [
 {
 'street': ''
 //...
 },
 {
 'street': ''
 //...
 }
 ]
 }; • List and Map literals make JSON a valid Dart syntax

Slide 17

Slide 17 text

Optional Types Example • Best practice - explicit types for method signatures and class members, for local variables - var main() { var a = 1; var b = 2; var c = divide(a, b); assert(c == 0.5); } ! divide(a, b) { return a / b; } void main() { int a = 1; int b = 2; double c = divide(a, b); assert(c == 0.5); } ! double divide(int a, int b) { return a / b; } 17

Slide 18

Slide 18 text

Optional Types Rules • All type annotations can be omitted • Has no effect at runtime • App without types has the same semantics • Do not cause errors, only warnings • You can always “compile” and run your program 18

Slide 19

Slide 19 text

Benefits of Type Annotations • Act as documentation • Advanced tools support (completion, code navigation, etc.) • Error detection via type checker • Can improve performance while compiling to JavaScript 19

Slide 20

Slide 20 text

Declaring Variables 20 • null is default value for all types • Supports final and const var str1 = ''; // type is dynamic (implicit)
 String str2 = ''; // type is String
 Object str3 = ''; // type is Object
 dynamic str4 = ''; // type is dynamic (explicit)

Slide 21

Slide 21 text

Functions 21 // Top-level functions
 void log(String message) {
 print(message);
 }
 
 // Single expression functions
 void log(String message) => print(message);
 
 // Nested functions
 void main() {
 void log(String msg) => print(msg);
 log('done');
 }

Slide 22

Slide 22 text

Higher-order functions 22 // Accept function as parameter
 void doSomething(Function callback) {
 //...
 callback();
 }
 doSomething(() => log('done'));
 
 // Return function
 Function getLogger() {
 return (String msg) => log(msg, level: 'INFO');
 }
 
 // Assign to a variable
 var logger = getLogger();
 logger('done');
 
 // Define function-type aliases
 typedef void Logger(String msg);
 Logger getLogger() {
 return (String msg) => log(msg, level: 'INFO');
 }

Slide 23

Slide 23 text

Optional Parameters 23 /// [level] parameter has default value void log(String msg, [Error error, String level = 'INFO']) {
 //...
 }
 log('Bad value'); log('Bad value', new ArgumentError()); log('Bad value', new ArgumentError(), ‘ERROR'); Positional parameters: void log(String msg, {Error error, String level}) {
 //...
 }
 log('Bad value');
 log('Bad value', level: 'ERROR');
 log('Bad value', level: 'ERROR', error: new ArgumentError()); Named parameters:

Slide 24

Slide 24 text

Classes 24

Slide 25

Slide 25 text

Class members 25 class WampService {
 // Instance member
 WebSocket socket;
 
 // Final member
 final String id;
 
 // Static member
 static int buffer_size = 0;
 
 // Const member
 static const String URL = ‘ws://localhost/ws’;
 } • Declaratively defined classes and members

Slide 26

Slide 26 text

Getters & Setters 26 class WampService {
 
 WebSocket _socket;
 
 get socket =>
 _socket != null ? _socket : _socket = new WebSocket();
 
 set socket(WebSocket s) {
 if (_socket.readyState != WebSocket.OPEN) _socket = s;
 else throw new StateError();
 }
 }

Slide 27

Slide 27 text

Constructors 27 class Person {
 String name;
 DateTime birthday;
 
 Person(String name, DateTime birthday) {
 this.name = name;
 this.birthday = birthday;
 }
 }

Slide 28

Slide 28 text

Automatic Assignment 28 class Person {
 String name;
 DateTime birthday;
 
 Person(this.name, this.birthday);
 }

Slide 29

Slide 29 text

Initializers 29 class Person {
 String name;
 DateTime birthday;
 
 Person(): name = '', birthday = new DateTime.now();
 }

Slide 30

Slide 30 text

Named constructors 30 class Collection {
 //...
 
 // Ordinary constructor
 Collection(List source) {}
 
 // Named constructor
 Collection.empty() {}
 }
 
 var c = new Collection.empty();

Slide 31

Slide 31 text

Factory constructors 31 // Publicly expose abstract class
 abstract class Service {
 void doSomething();
 
 // Expose concrete implementation via factory constructor
 factory Service() => new _DefaultService();
 }
 
 // Internally provide concrete implementation
 class _DefaultService implements Service {
 void doSomething() {}
 }
 
 // You can invoke factory constructors of abstract classes
 var s = new Service(); • Indirect instantiation

Slide 32

Slide 32 text

Factory constructors 32 class Service {
 static final Map _cache = {};
 
 String name;
 
 factory Service(String name) =>
 _cache.putIfAbsent(name, () => new Service._(name));
 
 Service._(this.name);
 } • Caching pattern

Slide 33

Slide 33 text

Java: Builder pattern 33 public class User {
 private String firstName; // required
 private String lastName; // required
 private String phone; // optional
 private int age; // optional
 
 private User(UserBuilder builder) {
 this.firstName = builder.firstName;
 this.lastName = builder.lastName;
 this.age = builder.age;
 this.phone = builder.phone;
 }
 
 public String getFirstName() {
 return firstName;
 }
 
 public String getLastName() {
 return lastName;
 }
 
 public int getAge() {
 return age;
 }
 
 public String getPhone() {
 return phone;
 }
 // TO BE CONTINUED... // Static nested class
 public static class UserBuilder {
 private String firstName;
 private String lastName;
 private String phone;
 private int age;
 ! public UserBuilder firstName(String firstName) {
 this.firstName = firstName;
 return this;
 }
 public UserBuilder lastName(String lastName) {
 this.lastName = lastName;
 return this;
 }
 public UserBuilder age(int age) {
 this.age = age;
 return this;
 }
 public UserBuilder phone(String phone) {
 this.phone = phone;
 return this;
 } 
 public User build() {
 return new User(this);
 }
 }
 }

Slide 34

Slide 34 text

Dart: a kind of “Builder pattern” 34 class User {
 String firstName;
 String lastName;
 String phone;
 int age;
 // Here "this" enables type checking.
 User({this.firstName, this.lastName, this.phone, this.age});
 }
 
 // Usage
 var user = new User(
 firstName: 'John',
 lastName: 'Doe',
 phone: '+123456789',
 age: 30);

Slide 35

Slide 35 text

Cascade operator 35 // Equivalent declaration
 class User {
 String firstName;
 String lastName;
 String phone;
 int age;
 }
 
 // Usage
 var user = new User()
 ..firstName = ‘John' ..lastName = 'Doe' ..age = 30
 ..phone = '+123456789';

Slide 36

Slide 36 text

Automatic Fluent APIs 36 querySelector('h1')
 ..text = 'Welcome!'
 ..classes.add('caption')
 ..onClick.listen((_) => print('clicked'));

Slide 37

Slide 37 text

Abstract Classes 37 abstract class AuthService {
 void login(String user, String password) { /*...*/ }
 void register(String user, String email, String password);
 }
 
 class BasicAuthService extends AuthService {
 void register(String user, String email, String password) { /*...*/ }
 } • abstract keyword only for class declaration

Slide 38

Slide 38 text

Inheritance 38 abstract class AuthService {
 AuthService(String token) { /*...*/ }
 void login(String user, String password) { /*...*/ }
 void register(String user, String email, String password);
 }
 
 class BasicAuthService extends AuthService {
 BasicAuthService(String token): super(token);
 
 @override
 void login(String user, String password) {
 _ensureUnique(user);
 super.login(user, password);
 }
 
 @override
 void register(String user, String email, String password) { /*...*/ }
 
 _ensureUnique(String user) { /*...*/ }
 }

Slide 39

Slide 39 text

Interfaces • Each class implicitly defines an interface 39 abstract class AuthService {
 String get token => '';
 final String URL = '';
 
 AuthService(String token) { /*...*/ }
 void login(String user, String password) { /*...*/ }
 void register(String user, String email, String password);
 }
 
 class BasicAuthService implements AuthService {
 String get token => '';
 final String URL = '';
 
 @override
 void login(String user, String password) { /*...*/ }
 
 @override
 void register(String user, String email, String password) { /*...*/ }
 }

Slide 40

Slide 40 text

Mixins 40 abstract class Storage {
 void save() { /*...*/ }
 String toJson();
 }
 class Person extends Object with Storage {
 String name;
 String toJson() => '{ "name": "$name" }';
 }
 var p = new Person();
 p.save(); • Mixin class must: extend Object, declare no constructors, no calls to super

Slide 41

Slide 41 text

Generics 41 var dynamics = new List(); // new List();
 dynamics.add('string'); // always OK
 dynamics.add(42); // always OK
 
 String s = dynamics.first; // always OK
 String i = dynamics.last; // FAILS in checked mode • You are not required to use them • dynamic is default

Slide 43

Slide 43 text

Slide 44

Slide 44 text

Libraries • Dart libraries is a more flexible equivalent to Java packages 44 // myapp.dart
 library myapp;
 
 import 'dart:io';
 
 part 'services.dart';
 part 'models.dart';
 ! 
 // services.dart
 part of myapp;
 ! 
 // models.dart
 part of myapp; // services.dart
 library myapp.services; ! 
 // models.dart
 library myapp.models;
 ! 
 // myapp.dart
 library myapp;
 
 import 'services.dart';
 import 'models.dart';
 
 export 'services.dart' show IntegrationService;

Slide 45

Slide 45 text

Futures 45 new Future(() => print('Async job 1'))
 .then((_) => print('Async job 2'))
 .then((_) => print('Async job 3'))
 .catchError((err) => print(err));

Slide 46

Slide 46 text

Streams 46 Stream> inputStream = new file.openRead();
 
 inputStream
 .transform(UTF8.decoder)
 .transform(new LineSplitter())
 .listen((String line) => print(line));

Slide 47

Slide 47 text

VM • No bytecode • Dart is a native language for Dart VM • Enables dev tools and server-side apps • In future - embedded into browsers 47

Slide 48

Slide 48 text

Performance • Dart VM in average 1.5-2 times faster than JS/V8 • dart2js is almost the same as JS/V8 • 10x faster startup using snapshots 48

Slide 49

Slide 49 text

Benchmarks 49 dart js: v8 dart2js: v8 • More here: https://www.dartlang.org/performance/

Slide 50

Slide 50 text

Tools 50

Slide 51

Slide 51 text

Dart Editor 51

Slide 52

Slide 52 text

IntelliJ IDEA/WebStorm 52

Slide 53

Slide 53 text

Dartium 53

Slide 54

Slide 54 text

Pub 54

Slide 55

Slide 55 text

More Tools • dart2js • dartanalyzer • dartfmt • docgen 55

Slide 56

Slide 56 text

Resources • https://www.dartlang.org • Articles • Benchmarks • AngularDart • DartlangTV YouTube channel 56

Slide 57

Slide 57 text

Thanks! Contacts: • twitter.com/antonmoiseev • [email protected] 57