SlideShare una empresa de Scribd logo
1 de 162
Descargar para leer sin conexión
Moisés Belchín
blogdart.es librodart.es
PRESENTACIÓN DE
MOISÉS BELCHÍN
!
PARA PRESENTAR EL LENGUAJE DART EN
EL EVENTO DART FLIGHT SCHOOL MADRID 2014
ORGANIZADO POR GDGMADRID
!
La presentación ha sido complementada con diapositivas
explicativas para entender el contenido esquemático de la
presentación
2014 | Moisés Belchín - librodart.es | blogdart.es
¿Qué es
?
2014 | Moisés Belchín - librodart.es | blogdart.es
!
!
Desarrollado por Google
De código abierto
Para proyectos web
Estructurado
Flexible
2014 | Moisés Belchín - librodart.es | blogdart.es
Es un lenguaje de programación:
Orientado a Objetos
Basado en clases
Con herencia simple
Opcionalmente tipado
2014 | Moisés Belchín - librodart.es | blogdart.es
Sintaxis sencilla
Muy legible
Auto-documentado
Compatible
Cross-Brower
2014 | Moisés Belchín - librodart.es | blogdart.es
Estructurado
Fácil Mantenimiento
Permite programación
asíncrona
2014 | Moisés Belchín - librodart.es | blogdart.es
De Alto rendimiento
2014 | Moisés Belchín - librodart.es | blogdart.es
Actualmente, incluso compilado a JavaScript
es superior a código JavaScript nativo en V8.	

Vamos a ver unos gráficos, que muestran una
comparativa entre Dart, Dart compilado y
JavaScript nativo en V8
2014 | Moisés Belchín - librodart.es | blogdart.es
El primer gráfico, es un solucionador de
restricciones de un solo sentido que muestra
poli-morfismo y programación orientada a
objetos.	

Vemos la distancia que hay entre JSV8 y
Dart, que es de más del doble.
[clic sobre el gráfico para reproducir]	

!
DeltaBlue
DeltaBlue
!
2014 | Moisés Belchín - librodart.es | blogdart.es
[Pulsar para reproducir]
2014 | Moisés Belchín - librodart.es | blogdart.es
Es un solucionador de ecuaciones 2D
Navier- Stokes. Muestra los resultados del	

acceso a las matrices numéricas, así como
hacer aritmética de punto flotante.	

!
[clic sobre el gráfico para reproducir]	

!
FluidMotion
FluidMotion
[Pulsar para reproducir]
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Es el punto de referencia de simulación de
núcleo del sistema operativo. El foco
principal es el acceso a la propiedad y
llamar a funciones y métodos.	

!
!
[clic sobre el gráfico para reproducir]
Richards
Richards
!
[Pulsar para reproducir]
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Ya que Dart tiene un sistema de clase nativa, no sería muy “justo”
hacer una comparación de rendimiento directo con la versión en
octano.
Por lo tanto, en este último gráfico se compara el rendimiento de
dart con una versión mejorada de JavaScript llamada Tracer.	

Estar versión mejorada utiliza sólo los constructores y prototipos
sin ninguna capa de abstracción en el medio. Corre un 50 % más
rápido que el original RayTrace JavaScript referenciado en
octano.	

!
[clic sobre el gráfico para reproducir]
Tracer
Tracer
!
[Pulsar para reproducir]
2014 | Moisés Belchín - librodart.es | blogdart.es
Grandes proyectos
!
2014 | Moisés Belchín - librodart.es | blogdart.es
Grandes proyectos
!
2014 | Moisés Belchín - librodart.es | blogdart.es
Dart no ha sido creado para sustituir a JavaScript,
sino para ofrecer una opción alternativa más
moderna en el desarrollo web y eficiente, sobre todo,
para grandes proyectos.
A
n
t
e
s
servidor
A
h
o
r
a
cliente
cliente
servidor
2014 | Moisés Belchín - librodart.es | blogdart.es
El paradigma está cambiando
2014 | Moisés Belchín - librodart.es | blogdart.es
Hasta ahora el servidor era quien realizaba todo el trabajo.	

Cuando un visitante accedía a una web, el servidor:
- Realizaba las consultas a la base de datos
- y los procesos de validación de acceso
- y componía la estructura HTML del documento
- cargando los vínculos externos CSS, JavaScript, imágenes,
documentos, vídeos, etc.



Esto es lo que sucede en las aplicaciones desarrolladas en PHP,
Python, JSP, Ruby, etc.
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
A esto, debemos añadirle, el problema de la atención de la
grandísima cantidad de solicitudes que se reciben y ahora más que
nunca, con el cloud computing y los dispositivos móviles con
acceso a internet.

¿Que pasará? Que Nuestro servidor no será capaz de atender toda la
demanda que tiene de peticiones porque cada petición consume
demasiados recursos.



¿Cual puede ser la solución? Descargar nuestro servidor de aquellos
procesos que puede realizar el cliente y dotar a los clientes de mayor
capacidad de proceso e inteligencia
2014 | Moisés Belchín - librodart.es | blogdart.es
Desde hace unos años esta es la norma habitual. Gracias a HTML,
CSS y JavaScript, cada vez que navegas por internet accedes a un
servicio en el que el servidor te da un documento HTML con una serie
de scripts, aplicaciones que son capaces de realizar muchos
procesos en tu navegador web.



Estas aplicaciones que corren en el navegador realizan peticiones de
datos en modo asíncrono (para evitar bloquear el cliente) al servidor
y con esos datos van modificando la página web mostrando u
ocultando datos. Así conseguimos simplificar las peticiones que
realizamos al servidor pudiendo atender más clientes, además de
aprovechar la capacidad de proceso de los clientes.
mantenimiento
legibilidad
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Si pensamos en aplicaciones como Gmail o Google Docs, desarrollar
toda su interfaz, gestionar todas las peticiones y los eventos que se
gestionan en el navegador .... puede ser una tarea muy costosa. Da
miedo solo pensarlo!!


Y el mantenimiento de esas aplicaciones?... eso si que da miedo.



JavaScript no se diseñó para estos propósitos, no es lo
suficientemente robusto, el código se vuelve ilegible e
incomprensible cuando empezamos con callbacks y padece de
grandes problemas de gestión de memoria.
GWT
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Por este motivo, los desarrolladores de Google al crear sus apps con
JavaScript, se preguntaron si realmente era el lenguaje ideal para
hacerlo, por lo que buscaron otras alternativas como GWT.
Consiguieron con ello un enfoque estructurado, pero muy poco
optimizado para la web.	

!
Y posteriormente, crearon Dart, un lenguaje que permitiese combinar
ambos mundos: el dinamismo de JavaScript con la Potencia y
estructura de lenguajes como C# o Java
ejemplos código
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Estamos hablando de JavaScript y probablemente
la mayoría de los que estáis leyendo esta
presentación sepáis JavaScript, por lo que vamos a
ver las diferencias reales entre ambos lenguajes,
usando unos pequeños fragmentos de código muy
sencillos.
Nombres más estructurados
! JavaScript Dart
HTMLElement Element
ownerDocument document
XMLHttpRequest HttpRequest
CSSStyleSheet CssStyleSheet
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Lo primero que llama la atención, es que en Dart los nombres
son más simples y estructurados.



Los nombres han sido simplificados, están más optimizados y
estructurados. Lo que nos simplifica mucho la vida a los
desarrolladores.

Se ha utilizado una nomenclatura más estándar y se sigue la
norma CamelCase.
Buscar Elementos fácilmente
!
JavaScript Dart
getElementsById('id') querySelector('#id')
getElementsByTagName('tag') querySelectorAll('tag')
getElementsByName('name') querySelectorAll('[name="name"]')
getElementsByClassName('class') querySelectorAll('.class')
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
En Dart buscar elementos en el DOM es más sencillo.
Los métodos que empleamos para la búsqueda de elementos
en el DOM se han simplificado también, dejando únicamente
dos y, esto es importante, compatibles con el nuevo estándar
de HTML5	

!
querySelector() y querySelectorAll().
Colecciones reales de datos
! JavaScript Dart
elem.hasAttribute('name') elem.attributes.containsKey('name')
elem.getAttribute('name')('tag') elem.attributes['name']
elem.setAttribute('name', 'value') elem.attributes['name'] = 'value'
elem.removeAttribute('name') elem.attributes.remove('name')
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Dart dispone de diferentes tipos de datos para representar
colecciones de datos: Lists, Maps y Sets.



En JavaScript, los tipos de colecciones del DOM cuando
recuperas una lista de elementos, por ejemplo, utilizando
getElementsByTagName son diferentes del tipo Array nativo de
Javasript, lo que produce errores e inconsistencia de datos.	

!
!
2014 | Moisés Belchín - librodart.es | blogdart.es
En Dart, se ha simplificado y los métodos que manejan el DOM como
por ejemplo, children, nodes o cuando recuperas un conjunto de
elementos con querySelectorAll se devuelven en colecciones de
datos nativas de Dart.	

!
Gracias a que Dart dispone los elementos del DOM en colecciones de
datos reales, también simplifica muchos de los métodos nativos de
JavaScript. Por ejemplo, en lugar de recuperar un elemento del DOM y
tener diferentes métodos para trabajar con sus atributos, Dart trabaja
con sus atributos con los métodos generales y comunes a los Maps ya
que Dart almacena los atributos de los elementos en la estructura de
datos Map.
Constructores para elementos del DOM
JavaScript Dart
document.createElement('div') new DivElement()
new InputElement
(type:'checkbox')
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
En Dart, tenemos constructores para crear elementos del DOM!

Para crear nuevas elementos del DOM, con JavaScript, tenemos
createElement(). 	

En Dart, como es un un lenguaje orientado a objetos, tenemos
constructores para los diferentes tipos de elementos del DOM.
Mejora y unifica el sistema de eventos
!
JavaScript Dart
elem.addEventListener('click',
(event) => print('click'), false);
var eventListener =
elem.onClick.listen((event)
=> print('click'));
elem.removeEventListener
('click', listener);
eventListener.cancel();
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Además, mejora y unifica el sistema de eventos."


Los eventos son el cambio más importante y útil que encontrarás en Dart. Se ha
modificado el modo en el que están unidos los controladores de eventos.



El DOM tiene dos formas de trabajar con eventos. El modo más antiguo que
enlaza un único controlador en un elemento a través de una de las propiedades
on del elemento. Y el modo más moderno utilizando las funciones
addEventListener() y removeEventListener() que permite establecer
múltiples oyentes para el mismo evento.



En Dart, se han simplificado las cosas. Se han eliminado todas las propiedades
on en Element y usa el API Stream que proporciona un modelo unificado de
eventos.

Para cada tipo de evento existente en el DOM cada elemento dispone de una
propiedad concreta, por ejemplo, onClick, onMouseOver, onBlur, etc.
Future API
function showResult(xhr) {
if (xhr.readyState==4 && xhr.status==200) {
var div =document.getElementById(“result”);
div.innerHTML=xhr.responseText;
}
}
function getResult() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = showResult(xhr);
xhr.open(‘GET’, ‘http://www.google.es’, true);
xhr.send();
}
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
API basadas en Futuros	

Cuando en JavaScript queremos escribir un código asíncrono, tenemos que
utilizar funciones callbacks como respuesta de retorno de otras funciones o
como parámetros para nuevas llamadas a funciones. 

En aplicaciones grandes, este sistema se vuelve ilegible y muy propenso a
errores y el mantenimiento resulta ser un trabajo muy duro.



Dart ha integrado dentro de su SDK la clase Future que permite encapsular
en una forma orientado a objetos respuestas asíncronas de manera nativa.

Sin duda algo que hará las delicias de muchos. Un código más claro, limpio y
que permite paralelizar tareas de manera muy simple.



Si antes teníamos un código como en que acabamos de ver, ahora tendríamos
el siguiente:
Future API
void getResult() {
var xhr = HttpRequest.getString('http://www.google.es')
..then((resp) => print(resp))
..catchError((e) => print('Error!'));
}
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Sin duda una mejora increíble y notable a la hora de trabajar.



Los Futures se utilizan constantemente en el SDK de Dart y
también los utilizarás con mucha frecuencia en tú código, ya
que Dart se ha diseñado desde su origen para que sea
totalmente asíncrono.
Librerías muy organizadas
Gran limpieza y organización
Librería pura de manejo del DOM y HTML
más ligera y sencilla
Librerías independientes para cada bloque
Cada librería tiene su propio namespace
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Otra diferencia interesante, son las librerías.	

!
Dart presenta una gran limpieza y organización en lo que a las librerías
del DOM se refiere y gracias a esta reorganización, la librería pura de
manejo del DOM y HTML es más ligera y sencilla.



Todo lo relativo a indexedDB, audio, web_sql y svg se ha extraído del
DOM y se han creado librerías independientes para cada bloque, con lo
que además de tener librerías concretas para cada función, se han
mejorado y simplificado los nombres, eliminando prefijos innecesarios y
repetitivos ya que cada librería tiene su propio namespace.
Coherencia Cross-Browser
Elimina prefijos de los desarrolladores
Soporte multi-navegador
Sin necesidad de usar Framework
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Así como la coherencia cross-browser:"


Poder eliminar los prefijos de los diferentes desarrolladores de
navegadores y reorganizar las librerías simplifica nuestro trabajo
dándonos soporte multi navegador para que nuestro código se
compatible en todos los navegadores modernos. Y todo esto de manera
nativa sin necesidad de trabajar con un framework que añada otra capa
a tus aplicaciones!!
Construcción en Cascada
Facilita el trabajo cuando trabajamos con
elementos del DOM
!
var text = document.querySelector('#sample_text_id');
text
..text = 'Bienvenido a Dart !'
..lang = 'ES'
..attributes.forEach((k, v) => print('$k: $v'));
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Y por último, las construcción en cascada:

Uno de los operadores que se incluyó posteriormente en Dart y que
utilizarás mucho es el operador en cascada. Inicialmente no se
contemplaba y se añadió para facilitarnos el trabajo cuando trabajamos
con elementos del DOM.



Es muy común estar trabajando con elementos HTML y cambiar o añadir
los valores de múltiples propiedades. Esto origina grandes bloques de
código, muy repetitivos y que nos llevan a incorporar ilegibilidad a
nuestro código.



Si tienes que repetir el nombre del elemento en lugar de darle un nombre
descriptivo es muy posible que uses un nombre lo más abreviado
posible, lo que lleva a producir un código menos legible.
2014 | Moisés Belchín - librodart.es | blogdart.es
Por último, algo que no podemos olvidar: ES MUY
NOVEDOSO.



Si pensamos en lo que será la versión 6 de JavaScript,
que esperamos estará disponible para finales de 2014,
hay gran parte de sus funciones y APIs ya disponibles
en Dart:
Variables de ámbito de bloque Valores
por defecto en funciones
Parám. opcionales por nombre
Interpolación de Strings
Arrow functions y Promises API
2014 | Moisés Belchín - librodart.es | blogdart.es
/**
* Shift the bits of this integer to the right by [shiftAmount].
*
* Shifting to the right makes the number smaller and drops the least
* significant bits, doing an integer division by `pow(2, shiftIndex)`.
*
* It is an error of [shiftAmount] is negative.
*/
int operator >>(int shiftAmount);
!
/// Returns true if and only if this integer is even.
bool get isEven;
Documentación
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Además, es un lenguaje donde es muy fácil hacer la
documentación, es auto-documentado



Tenemos docgen, dartdoc y comentarios documentación	

!
En el ejemplo, podemos ver un fragmento de código donde
podemos ver documentación en bloque y documentación en
línea
library animales;
!
num NUMERO_MAXIMO = 12;
!
void crearAnimal() {}
!
class Animal {}
!
class Perro extends Animal {}
!
class Gato extends Animal {}
Paquetes-Librerías
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Otra novedad son los paquetes-librerías	

Las librerías, permiten crear código modular, que pueda
compartirse y reutilizarse fácilmente.



Una librería no es más que un paquete que creas a partir de
interfaces, clases y funciones globales que empaquetas para
reutilizar en otro proyecto bajo la palabra reservada library
seguido de un nombre.	

!
En el ejemplo podemos ver un fragmento de código, donde
definimos la librería animales
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Otra novedad importante, es el gestor de paquetes PUB!!


Que es la herramienta que nos permite añadir a nuestras
aplicaciones cualquier librería que necesitemos escrita por otro
programador de una manera muy cómoda y simple.	

!
PUB se ocupa automáticamente de resolver dependencias y de
mantenernos al tanto de las últimas versiones, si así se lo
indicamos.
import 'dart:html';
!
void main() {
var text = document.querySelector('#sample_text_id');
text.text = 'Bienvenido a Dart !';
text.lang = 'ES';
text.attributes.forEach((k, v) => print('$k: $v'));
text.style.backgroundColor = '#f87c45';
}
Manejo estructurado propiedades DOM
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Permite un manejo estructurado de todas las propiedades
del DOM, como hemos visto en el ejemplo anterior.

!
Propiedades
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Vamos a ver otro método: .querySelectorAll que devuelve una lista de
elementos que coincidan con el selector especificado. Cada elemento
encontrado es un objeto y por tanto dispone de todas las propiedades y
métodos definidos en dart:html.	

!
Además, otra gran ventaja es que al utilizar este método obtienes colecciones
reales de datos nativas de Dart, es decir .querySelectorAll te devuelve una lista
de objetos que coincidan con el selector especificado y por lo tanto tienes a tu
disposición todos los métodos que ya has visto en dart:core para trabajar con el
tipo de datos List. 	

Sin lugar a dudas esta es una de las mayores ventajas que presenta Dart en esta
librería ya que todo el DOM está perfectamente estructurado y todos los nodos
representados son tratados como objetos nativos de Dart con sus propiedades y
métodos.
2014 | Moisés Belchín - librodart.es | blogdart.es
Ejemplos de manipulación de todo lo relacionado con CSS y los
estilos de elementos HTML y, cómo Dart vuelve a poner a tu
disposición sencillos y bien definidos mecanismos para trabajar con
este tipo de propiedades de manera consistente y uniforme.	

!
Al igual que HTML, CSS ha ido evolucionando rápidamente para
dar soporte a nuevas y mejoradas funciones todas ellas ya
contempladas dentro de Dart.	

!
Así puedes acceder a todas las propiedades relacionadas con
estilos de los elementos HTML desde Dart.
import 'dart:html';
main() {
print('1. Lanzo una petición de manera asíncrona');
var resultado = HttpRequest.getString('respuesta.json');
resultado
.then((future_resultado) {
print('2. Ya se ha completado el future y obtengo un resultado.');
print(future_resultado);
}).catchError((_) {
print('3. Error ejecutando la petición al servidor.');
});
print('4. Continúo ejecutando más acciones.');
}
Programación asíncrona
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Y hemos dejado para el final, una de las mejores novedades: la programación
asíncrona.

Que tal como la presenta Dart y como lo hará JavaScript 6 con su API Promises, es una
forma de poder trabajar, ejecutar y crear procedimientos asíncronos de una manera
natural, sencilla y estructurada.	

!
Pone a nuestra disposición el API dart:async con las clases Future y Stream para poder
realizar programación asíncrona.



Comenzamos viendo brevemente Future que representa un proceso, función o valor de
retorno que se recuperará en un futuro en modo diferido. Ejecutaremos una función, por
ejemplo, y el valor de retorno de la función no lo obtendremos de manera inmediata sino
en otro momento.
2014 | Moisés Belchín - librodart.es | blogdart.es
!
En el ejemplo vemos un fragmento de código, donde, ind
independientemente del mensaje que mostramos, nuestra pequeña
aplicación no se queda esperando la respuesta de HttpRequest.getString!
!
Continúa ejecutando más acciones y cuando el servidor responde con un
valor de retorno o un error se ejecutan los métodos .then o .catchError del
objeto Future resultado.
void main() {
print('1. Instrucciones');
var serie = [1, 2, 3, 4, 5];
var stream = new Stream.fromIterable(serie);
!
// Nos suscribimos a los eventos del Stream
stream.listen((valor) {
print("3. Stream: $valor");
});
print('2. Instrucciones');
}
Programación asíncrona
Resultado:
1. Instrucciones
2. Instrucciones
3. Stream: 1
3. Stream: 2
3. Stream: 3
3. Stream: 4
3. Stream: 5
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Ahora lo vemos usando Stream



Como podemos observar en este fragmento de código, el
resultado es similar a la ejecución de los ejemplos de Future. 

Nuestro programa main no se queda esperando al Stream



Es totalmente asíncrono y según se van recibiendo los datos
desde el Stream se va ejecutando la función onData registrada y
aquí podemos ver el resultado:
Resultado:
1. Instrucciones
2. Instrucciones
3. Stream: 1
3. Stream: 2
3. Stream: 3
3. Stream: 4
3. Stream: 5
2014 | Moisés Belchín - librodart.es | blogdart.es
Polymer Web Components
Reutilizar
Vincular interfaz y lógica
(Data Binding)
Encapsular
Estructura, estilo y comportamiento
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Polymer hace uso de Shadow DOM para poder crear nuevos
componentes web y aislarlos del resto del documento y de otros
componentes para evitar colisiones de nombres, así como para
encapsular su estructura, estilo y comportamiento.

Hemos comentado que gracias a Polymer.dart podremos crear
nuestros propios componentes web y utilizarlos en nuestros
documentos HTML muy fácilmente.
2014 | Moisés Belchín - librodart.es | blogdart.es
Vamos a preparar un sencillo ejemplo que represente perfectamente esta
idea y te permita ver como queda separado por un lado su estructura, qué
etiquetas lo componen, por otro lado su estilo, todas las definiciones CSS
que le darán formato, y por último, el código Dart que le proporcionará
funcionalidad.	

!
Vamos a crear un componente para gestionar todo el sistema de acceso de
un usuario al sistema. Este componente estará compuesto por:

- Un fichero HTML que definirá su estructura
- La definición CSS que conforma el estilo de nuestro login
- El fichero Dart
HTML
(estructura)	

!
CSS
(estilo)	

!
fichero	

DART
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Ahora vemos la parte HTML, una parte del CSS (solo un
fragmento para que puedas hacerte a la idea) y el
archivo Dart
<polymer-element name="login-usuario">
<meta charset="utf-8">
<template>
<link rel="stylesheet" href="login.css">
<div id="login">
<h1><strong>Bienvenido.</strong> <span>Accede con tu nombre y contraseña</span></h1>
<template if="{{error == true}}">
<div id="login_msg">{{login_error}}</div>
</template>
<fieldset>
<p><input type="text" required id="usuario" name="usuario" placeholder="Usuario"></p>
<p><input type="password" required id="password" name="password" placeHolder="Contraseña"></p>
<p><a href="#" on-click="{{recordarPassword}}">¿No puedes entrar?</a></p>
<p><button on-click="{{entrar}}">Entrar</button></p>
</fieldset>
<p><span class="btn-round">o</span></p>
<p><a class="facebook-before"><span class="fontawesome-facebook"></span></a>
<button class="facebook" on-click="{{facebookLogin}}">Accede Usando Facebook</button> </p>
<p><a class="twitter-before"><span class="fontawesome-twitter"></span></a>
<button class="twitter" on-click="{{twitterLogin}}">Accede Usando Twitter</button> </p>
</div>
</template>
<script type="application/dart" src="login.dart"></script>
</polymer-element>
HTML
2014 | Moisés Belchín - librodart.es | blogdart.es
/* CSS Document */
a { text-decoration: none; }
h1 { font-size: 1em; }
h1, p {
margin-bottom: 10px;
}
span {
color: #5a5656;
font-weight: lighter;
}
strong {
font-weight: bold;
}
.uppercase { text-transform: uppercase; }
!
/* ---------- LOGIN ---------- */
#login {
margin: 50px auto;
width: 300px;
}
…
CSS
2014 | Moisés Belchín - librodart.es | blogdart.es
import 'package:polymer/polymer.dart';
!
/**
* Polymer Login System Element.
*/
@CustomTag('login-usuario')
class LoginUsuario extends PolymerElement {
@observable String usuario;
@observable String password;
@observable bool error = false;
@observable String login_error = '';
!
LoginUsuario.created() : super.created();
/// Valida nombre usuario y contraseña.
void entrar() {
if(usuario == null || usuario.trim() == '' ||
password == null || password.trim() == '') {
error = true;
login_error = 'Introduce usuario y password.’;} continua …
DART
2014 | Moisés Belchín - librodart.es | blogdart.es
… continua
!
return;
}
}
/// Permite recordar la contraseña olvidada.
void recordarPassword() {}
/// Permite hacer login con Facebook.
void facebookLogin() {}
/// Permite hacer login con Twitter.
void twitterLogin() {}
}
DART
2014 | Moisés Belchín - librodart.es | blogdart.es
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Sample app</title>
<link rel="stylesheet" href="aplicacion.css">
<!-- importamos login-usuario -->
<link rel="import" href="login.html">
<script type=“application/dart">
export 'package:polymer/init.dart';</script>
<script src="packages/browser/dart.js"></script>
</head>
<body>
<h1>Bienvenido a Polymer y Dart</h1>
<login-usuario></login-usuario>
!
</body>
</html>
}
2014 | Moisés Belchín - librodart.es | blogdart.es
¿Cómo se
trabaja con
?
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Ahora pasamos a la parte práctica, donde
haremos un rápido tour por el lenguaje.
!
DartEditor, el editor de Dart.
DartEditor
2014 | Moisés Belchín - librodart.es | blogdart.es
Vistas
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Podemos configurar las vistas, en la opción tools:

Breakpoints: acceso rápido a los puntos de parada establecidos



Callers: permite ver los métodos que llaman a otros métodos. Encontrarás
esta opción muy útil cuando tus aplicaciones crezcan.



Debugger: permite manejar el debugger de Dart Editor.



Files: permite gestionar tus proyectos.



Outline: muestra todas las clases y métodos que las componen y permite
dirigirte a cualquier método o clase haciendo clic sobre él.



Problems: Permite ver cualquier error o problema que exista en tus
aplicaciones y acceder a él rápidamente haciendo doble clic.
2014 | Moisés Belchín - librodart.es | blogdart.es
Ahora vamos a ver como se compila a JavaScript. Actualmente solo Dartium
puede correr aplicaciones Dart porque incluye la máquina virtual de Dart
(DartVM). Con el tiempo Dart funcionará de manera nativa en todos los
navegadores y en Google Chrome porque incluirá la máquina virtual de Dart.
Si ahora mismo quieres que tus aplicaciones funcionen en el resto de
navegadores debes compilar tu código Dart a JavaScript.



El proceso de compilación lo hace dart2js, transforma la aplicación de
código Dart en código JavaScript y puede durar más o menos dependiendo
de la cantidad de código de tu aplicación.



Cuando lances la compilación a JavaScript verás que se abre una nueva
ventana Output donde informa de la evolución del proceso de compilación.



Una vez hayas finalizado el proceso de compilación podrás ver que se han
generado varios ficheros JavaScript en el panel de ficheros y aplicaciones.
Depurar
2014 | Moisés Belchín - librodart.es | blogdart.es
[Pulsar para reproducir]
Dart VM
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Dart Virtual Machine o DartVM es la máquina virtual de Dart. Al igual que
sucede con Java, Dart necesita de un intérprete que sepa reconocer y
ejecutar el código Dart.

Si escribes una aplicación Dart de línea de comandos e intentas ejecutarla
en un sistema en el que no tengas instalada la máquina virtual de Dart esa
aplicación no funcionará, será un simple fichero de texto con unas
instrucciones en su interior que el sistema no sabe reconocer.



Para evitar esto debes instalar DartVM. La máquina virtual de Dart
reconocerá y ejecutará aplicaciones de línea de comandos así como scripts
del lado del servidor, aplicaciones y servidores.
Dartium
Chromium + DartVM
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
En un futuro, podremos correr nuestras aplicaciones Dart de manera nativa en
los principales navegadores y entonces, al instalar nuevas versiones de Dart,
Dartium ya no aparecerá en nuestro sistema.

Hasta que ese momento llegue tenemos dos opciones:	

!
- Compilar las apps Dart a código JavaScript para que sean entendidas y
ejecutadas en cualquier navegador web moderno con soporte de JavaScript.



- Correr las apps Dart en un navegador que tenga ya incluido de manera
predeterminada DartVM.
2014 | Moisés Belchín - librodart.es | blogdart.es
Dartium es el navegador web de código abierto Chromium (basado en Google
Chrome) al que se la ha incluído la máquina virtual de Dart, de ahí su nombre
Dart + Chromium = Dartium.

Gracias a esto podemos ejecutar nuestras aplicaciones Dart directamente en el
navegador web sin necesidad de compilarlas previamente a JavaScript.



Dartium y DartVM viene incluido por defecto en nuestra instalación de Dart
Editor junto con el SDK, pub, dart2js, etc. Y para ejecutar una app web será el
navegador que ejecute por defecto la app Dart.
2014 | Moisés Belchín - librodart.es | blogdart.es
Dart permite formatear programas de manera más automática. Esta herramienta
se llama Dart Formatter y puedes ejecutarla desde el directorio de aplicaciones
del sdk de estos dos modos.

La forma de funcionar es sencilla, si especificas un fichero con código Dart
realiza los cambios correspondientes en dicho fichero, si por el contrario
indicas un directorio, Dart Formatter realizará cambios en todos los ficheros que
encuentre de manera recursiva en dicho directorio. 	

Por defecto, los cambios que realices, dartfmt los muestra en la salida estándar.
!
Dart Formatter permite que establecer de manera automática un formato
estándar del código siguiendo la guía de estilo definida por Google.



Pasamos de este este primer código, al siguiente:	

DartFormatter
/** * DocString para este fichero. */
import 'dart:html';
/// Punto de entrada en la aplicacion.
void main() {
int zero;
if (0==0)
  zero=0;
else if (0==1)
  zero=1;
else if (0==2)
  zero=2;
}
DartFormatter
2014 | Moisés Belchín - librodart.es | blogdart.es
/**
* DocString para este fichero.
*/
import 'dart:html';
!
/// Punto de entrada en la aplicacion.
void main() {
 int zero;
 if (0 == 0) {
   zero = 0;
 } else if (0 == 1) {
   zero = 1;
 } else if (0 == 2) {
   zero = 2;
 }
}
DartFormatter
2014 | Moisés Belchín - librodart.es | blogdart.es
¿Como
Programar
en ?
2014 | Moisés Belchín - librodart.es | blogdart.es
Operadores
Expresiones
Sentencias
Funciones
Variables
Excepciones
Clases
Librerías
2014 | Moisés Belchín - librodart.es | blogdart.es
Operadores
2014 | Moisés Belchín - librodart.es | blogdart.es
Operadores
Ahora vamos a ver, los operadores, parte imprescindible de cualquier lenguaje de
programación. Nos permiten efectuar operaciones aritméticas con números, asignar
valores entre variables y poder tomar decisiones en un momento determinado para
que tu programa ejecute una parte u otra.	

!
Como Dart es un lenguaje orientado a objetos, los operadores son métodos de
instancia con nombres especiales, por ejemplo, +, -, *, %, etc.



Los métodos de instancia operan sobre las variables de instancia de los objetos,
aunque también tienen acceso a las variables de la clase.	

!
En el ejemplo podemos ver como se ha definido la clase Double la cual posee una
serie de operadores. Operador de suma [+] y operador de resta [-].
!
Hay varios tipos de operadores, los vamos a ver brevemente:
2014 | Moisés Belchín - librodart.es | blogdart.es
Operadores: tipos
Aritméticos
Test de tipado
Condicionales
De igualdad y relacionales
Asignación
De Bits
2014 | Moisés Belchín - librodart.es | blogdart.es
+ Suma
- Resta
-expr Signo negativo
* Multiplicación
/ División
~ División entera
% Resto de la división
Operadores aritméticos
2014 | Moisés Belchín - librodart.es | blogdart.es
++var Incrementa valor de la variable antes
de realizar otra operación
var++ Incrementa valor de la variable
después de ejecutar la sentencia
- -var Decrementa valor de la variable antes
de realizar otra operación
var- - Decrementa valor de la variable
después de ejecutar la sentencia
Operadores aritméticos
2014 | Moisés Belchín - librodart.es | blogdart.es
“==" Igualdad
!= Distinto
> Mayor que
< Menor que
>= Mayor o igual
<= Menor o igual
Operadores de igualdad y relacionales
2014 | Moisés Belchín - librodart.es | blogdart.es
as Casting de tipos para convertir un
objeto de un tipo a otro
is Verdadero si el objeto es del tipo
indicado
is! Falso si el objeto es del tipo
indicado
Operadores de test de tipado
2014 | Moisés Belchín - librodart.es | blogdart.es
“=“ Asigna un valor a una variable
“x=“ Multiplica y asigna
%= Resto de la división y asigna
&= Realiza operación de bit AND y asigna
+= Suma y asigna
/= Divide y asigna
Operadores de asignación
2014 | Moisés Belchín - librodart.es | blogdart.es
<<= Realiza operación de bit de desplazamiento izquierda y
asigna
^= Realiza operación de bit XOR y asigna
-= Resta y asigna
~/= Realiza la división entera y asigna
>>= Realiza operación de bit de desplazamiento derecha y
asigna
|= Realiza operación de bit OR y asigna
Operadores de asignación
2014 | Moisés Belchín - librodart.es | blogdart.es
& AND
| OR
^ XOR
~expr Invierte el valor del Bit
<< Desplazamiento izquierda
>> Desplazamiento derecha
Operadores de Bit
2014 | Moisés Belchín - librodart.es | blogdart.es
( ) Llamada a una función
[ ] Referencia un valor de una lista
cond?exp1:exp2 Si se cumple la condición se asigna el valor de la
expresión 1 sino el de la expresión 2.
. Acceder a los miembros de un objeto
.. Realizar múltiples operaciones sobre un objeto
?identificador Sirve para comprobar argumentos opcionales
Otros Operadores
2014 | Moisés Belchín - librodart.es | blogdart.es
Expresiones
Las Expresiones en Dart, son fragmentos de código Dart que se evalúan
en tiempo de ejecución para obtener un valor, que es siempre un objeto.
Cada expresión tiene un tipo estático asociado y cada valor tiene un tipo
dinámico asociado.

Una expresión es un conjunto de datos o funciones unidos por
operadores aritméticos, lógicos, etc.	

!
!
2014 | Moisés Belchín - librodart.es | blogdart.es
Expresiones
Condicionales expr1 ? expr2 : expr3
Lógica expr1 || expr2
expr1 && expr2
Bit expr1 & expr2
expr1 | expr2
expr1 ^ expr2
2014 | Moisés Belchín - librodart.es | blogdart.es
Expresiones
Igualdad expr1 == expr2
expr1 != expr2
Relación expr1 > expr2
expr1 >= expr2
expr1 < expr2
expr1 <= expr2
Desplazamiento expr1 >> expr2
expr1 << expr2
2014 | Moisés Belchín - librodart.es | blogdart.es
Expresiones
Adición expr1 + expr2
expr1 - expr2
!
Multiplicación expr1 * expr2
expr1 / expr2
expr1 ~/ expr2
expr1 % expr2
2014 | Moisés Belchín - librodart.es | blogdart.es
Expresiones
Pre-expresiones y post-expresiones
++expr expr++
--expr expr--
Asignación [=]
[*=], [/=], [~/=], [%=], [+=], [-=], [<<=],
[>>=], [&=], [^=], [|=]
2014 | Moisés Belchín - librodart.es | blogdart.es
Variables y tipos de datos
main() {	

var variable1 = 5;	

var variable2 = 2;	

print(variable1+variable2); // El resultado es 7	

}	

!
————————————————————-	

main() {	

String variable1 = 'Bienvenido a Dart';	

num variable2 = 1.1;	

print('${variable1} ${variable2}'); // El resultado es 	

"Bienvenido a Dart 1.1"	

}
2014 | Moisés Belchín - librodart.es | blogdart.es
Dart soporta diferentes tipos de datos para definir las diferentes variables que
vayamos utilizando en nuestros programas.



El tipo de dato es un indicativo que puedes utilizar para saber que el valor que
contiene esa variable es un número, una cadena u otro tipo de dato.	

!
Los tipos de datos también ayudan a Dart en el momento de la traducción de código
Dart a JavaScript.



Vemos unos sencillos ejemplos de uso de variables. En el primero, hemos definido
dos variables, sin indicar el tipo de dato que van a contener y las hemos sumado
mostrando el resultado en pantalla.



En el siguiente ejemplo trabajamos con dos variables diferentes una de tipo String y
otra de tipo num. Mostramos un mensaje al usuario concatenando el contenido de
ambas variables.	

2014 | Moisés Belchín - librodart.es | blogdart.es
main() {
final app_title = 'Mi primera app Dart';
final String app_subtitle = 'Dart mola !’;
const pi = 3.14159265358979;
}
Tipos de variables: Final y Const
2014 | Moisés Belchín - librodart.es | blogdart.es
Existen dos modificadores que permiten modificar el comportamiento normal de
una variable final y const.



La diferencia exacta entre final y const, es que una variable declarada como final
se inicializa una única vez. Una variable declarada como const se considera una
constante en tiempo de ejecución.	

!
Variables de ámbito global o local o variables de clase declaradas como final se
inicializan la primera vez que se utilicen. Esto se conoce como lazy initialization
(inicialización perezosa) y ayuda a las aplicaciones a cargar más rápidamente.	

!
Para cualquier valor que quieras que sea constante en tiempo de ejecución utiliza
const seguido del nombre de la variable y del valor que vaya a tener la variable.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Sentencias
var clima = 'riesgo';	

if (clima.isNotEmpty && clima == 'riesgo') {	

precaucion();	

} else {	

sinPrecaucion();	

}
2014 | Moisés Belchín - librodart.es | blogdart.es
Dart permite sentencias if con sentencias else opcionales.



La particularidad es que en Dart, hay que ser más explícito, ya
que considera que todos los valores distintos de True
(verdadero) son False (falso), esto comportamiento difiere del
comportamiento de JavaScript y, como ya te comentamos en la
sección de Definición de Variables y tipos de datos, si utilizas
este tipo de comprobaciones obtendrás un error.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Tipos de datos
String
num
int
double
bool
DateTime
List, Set
Map
2014 | Moisés Belchín - librodart.es | blogdart.es
Bucle For
var lista = ['uno', 'dos', 'tres', 'cuatro'];	

!
for (var i=0; i < lista.length; i++) {	

print('${i} :: ${lista[i]}'); // 0 :: uno	

// 1 :: dos	

// 2 :: tres	

// 3 :: cuatro	

}
2014 | Moisés Belchín - librodart.es | blogdart.es
!
En Dart dispones de varios tipos de bucles diferentes, pero ahora nos
centraremos en los bucle for.



Este bucle tiene un formato que te resultará muy familiar ya que hereda
la sintaxis de JavaScript, C, etc.	

!
Los bucles for también te permiten iterar sobre objetos List, Map o Set.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Bucle For
Iterables
var lista = ['uno', 'dos', 'tres',‘cuatro'];	

!
lista.forEach((item){	

print(item);	

});	

!
for(item in lista) {	

print(item);	

}
2014 | Moisés Belchín - librodart.es | blogdart.es
Bucle While
while(llamadasPerdidas()) {	

parpadearLuz();	

}	

—————————————————	

do {	

parpadearLuz();	

} while (llamadasPerdidas());	

2014 | Moisés Belchín - librodart.es | blogdart.es
Repite un bloque de código mientras una condición se mantenga
True (verdadera). Evalúa la condición antes de entrar en el bucle y lo
repite mientras la condición sea verdadera.

Si queremos evaluar la condición después de ejecutar el ciclo del
bucle (es decir, ejecutaremos el bucle al menos una vez), podemos
utilizar do- while.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Bucle While
Al trabajar con bucles también tienes a tu disposición estas
dos sentencias: break y continue. Estas sentencias te
servirán para controlar la ejecución del bucle.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Break
var i = 100;	

while(true) {	

i -= 5;	

print(i);	

if(i < 75) {	

break;	

}	

}
Resultado:
95
90
85
80
75
70
2014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Resultado:
95
90
85
80
75
70
Continue
for (var i = 100; i > 0; i--) {
if (i.isEven) {
continue;
}
!
print(i);
if (i < 75) {
break;
}
}
Resultado:
99
97
95
93
91
89
87
85
83
81
79
77
75
732014 | Moisés Belchín - librodart.es | blogdart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
Resultado:
99
97
95
93
91
89
87
85
83
81
79
77
75
73
Switch
var accion = 'Abrir';	

!
switch (accion) {	

!
case 'Pagada':	

AnotarPago();	

break;	

!
case 'Impagada':	

dejarPendiente();	

break;	

!
default:	

Comprobar();	

}
2014 | Moisés Belchín - librodart.es | blogdart.es
Permite realizar una selección entre múltiples alternativas evitando
anidar sentencias if-else. Esto mejora la legibilidad del código y
además es una estructura que se ejecuta mucho más rápido que
utilizar if-else anidados.	

!
Como puedes ver la estructura de esta sentencia define una serie
de casos de coincidencia (case) y de acciones a realizar en caso de
que una de ellas se cumpla. Tras cumplirse esa coincidencia y
ejecutarse la acción siempre debe figurar la sentencia break para
salir de switch.
2014 | Moisés Belchín - librodart.es | blogdart.es
Switch
Funciones
void saluda(String nombre) {	

print('Bienvenido a Dart ${nombre}');	

}
Parám. opcionales por posición
Parám. opcionales por nombre
Valores predeterminados
Valores de retorno
2014 | Moisés Belchín - librodart.es | blogdart.es
Los parámetros de las funciones en Dart pueden ser obligatorios u
opcionales. En caso de ser opcionales pueden ser opcionales por
posición u opcionales por nombre.

Utilizamos funciones para dividir una tarea grande en otras más
simples o para implementar operaciones que vamos a utilizar varias
veces en nuestra aplicación.	

!
2014 | Moisés Belchín - librodart.es | blogdart.es
Funciones
Param. opc. por posición
void saluda (String nombre, [String apellidos,
num edad]) {
if(apellidos != null && edad != null) {
print('Bienvenido a Dart ${nombre} '
'${apellidos} tienes ${edad} años.');
} else {
print('Bienvenido a Dart ${nombre}.');
}
}
2014 | Moisés Belchín - librodart.es | blogdart.es
Param. opc. por posición
saluda('Pedro'); // Bienvenido a Dart Pedro.
saluda('Pedro', 'García'); // Bienvenido a Dart Pedro.
saluda('Pedro', 'García', 28); // Bienvenido a Dart
Pedro García tienes 28 años.
2014 | Moisés Belchín - librodart.es | blogdart.es
Los parámetros opciones por posición se indican entre corchetes [],
y siguen la misma descripción que el resto de los parámetros, tipo
de dato y nombre del parámetro.

Si realizas unas llamadas a esta función con estos tipos de
parámetros diferentes podrás obtener estos resultados
2014 | Moisés Belchín - librodart.es | blogdart.es
Param. op. por nombre
void saluda({String nombre, String apellidos, num edad}) {
var saludo = new StringBuffer('Bienvenido a Dart');
if (nombre != null) {
saludo.write(' ${nombre}');
}
!
if (apellidos != null) {
saludo.write(' ${apellidos}');
}
!
if (edad != null) {
saludo.write(' tienes ${edad} años.');
}
print(saludo.toString());
}
2014 | Moisés Belchín - librodart.es | blogdart.es
Param. op. por nombre
saluda(nombre:'Pedro');
saluda(apellidos:'García', nombre:'Pedro');
saluda(apellidos:'García', edad: 29, nombre:'Pedro');
saluda();
!
2014 | Moisés Belchín - librodart.es | blogdart.es
Además de los parámetros opcionales por posición dispones de
parámetros opcionales por nombre.
!
Son muy útiles porque no tienes que llamar a la función del
mismo modo siempre, y mejora la documentación de la propia
función cuando se realiza la llamada.	

!
Nota: observa que no importa el orden en el que pases los parámetros a la
función.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Valores predeterminados
void saluda([String nombre='ANONIMO']) {
var saludo = new StringBuffer('Bienvenido a Dart');
if (nombre != null) {
saludo.write(' ${nombre}');
}
print(saludo.toString());
}
saluda(); // Bienvenido a Dart ANONIMO
saluda('Juan'); // Bienvenido a Dart Juan
2014 | Moisés Belchín - librodart.es | blogdart.es
Las funciones con parámetros opcionales además pueden tener
valores predeterminados. Un valor predeterminado se asigna al
parámetro opcional en caso de que dicho parámetro no se especifique
en el momento de la llamada a la función.



Para indicar el valor predeterminado de un parámetro opcional usamos
el signo igual (=) o los dos puntos (:) dependiendo de si se trata de un
parámetro opcional por posición o por nombre.



Este es un ejemplo de valor predeterminado para parámetros
opcionales por posición.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Valores de retorno
num suma(num a, num b) {
return a+b;
}
var resultado = suma(1,5);
print(resultado); // 6
2014 | Moisés Belchín - librodart.es | blogdart.es
Hemos comentado al comienzo de esta sección que cuando una
función no retorne ningún valor como norma de sintaxis y estilo se
debe indicar la palabra void. En realidad no hemos dicho toda la
verdad ya que todas las funciones retornan un valor, pero cuando tú
función no indica de manera explícita ningún valor la función
devuelve null.	





En este primer ejemplo la función suma te devuelve un número.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Excepciones
var resultado;
try {
// Intento acceder al sistema.
resultado = login();
} on Exception catch(e) {
// Se produce un error en el sistema.
resultado = 'No has dicho la palabra mágica !';
} finally {
// Muestro la respuesta al usuario.
print(resultado);
}
2014 | Moisés Belchín - librodart.es | blogdart.es
Dart incorpora un mecanismo de excepciones que permite capturar casos de error
excepcionales no contemplados y actuar en consecuencia. De este modo podrás
mostrar un mensaje de error más adecuado para el usuario y que el sistema siga
funcionando.



En otros casos te puede interesar lanzar excepciones en determinadas partes de tu
aplicación. Dart también incorpora mecanismos para hacer esto.



Cuando algo inusual sucede en tu aplicación Dart lanzará una excepción, si esta
excepción no es capturada el isolate que generó la excepción se interrumpirá y el
programa terminará.	

Dart proporciona Exception y Error para el manejo de errores y excepciones. Y
también te permite crear tus propias excepciones.



Los mecanismos que presenta Dart para manejar errores y excepciones son throw,
catch y finally. Throw permite lanzar excepciones. Esta expresión permite lanzar
una excepción en cualquier parte de nuestro desarrollo.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Excepciones
try {
login();
} on PasswordVaciaException {
// Captura de una excepción concreta.
reLogin();
} on Exception catch(e) { // Captura cualquier Exception.
print('Pero que ha pasado aquí ?!?!');
} catch(e) { // Captura cualquier otra cosa que suceda.
print('Algo ha ido mal. No se que ha pasado !');
}
2014 | Moisés Belchín - librodart.es | blogdart.es
Catch es el mecanismos que tiene Dart para capturar las excepciones
producidas, de este modo se detiene la propagación de la excepción y
puedes manejarla.



Para ser más exactos Dart captura las excepciones mediante los bloques try
{} on {} catch {}.

Estos bloques pueden anidarse y capturar más de un tipo de excepciones.



Como puedes ver en el ejemplo puedes ir encadenando bloques dependiendo
de los diferentes tipos de excepciones que te interese capturar.



Durante la captura de una excepción puedes utilizar on o catch o ambas.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Excepciones
if(usuario == null) {
throw new Exception('Usuario no reconocido en el sistema !!');
}
!
if(password == null) {
throw new Exception('La contraseña no es correcta !!');
}
!
if(datos == null) {
throw new NullThrownError();
}
if((datos is Map) == false) {
throw new TypeError();
}
2014 | Moisés Belchín - librodart.es | blogdart.es
Por último, Dart permite ejecutar un fragmento de código se produzca
o no una excepción en un determinado código. finally te va a permitir
ejecutar un fragmento de código se produzca o no excepción.



En dart:core tienes a tu disposición la clase Exception y la clase Error
para gestionar excepciones o errores en el sistema, estas clases
además te permiten heredar de ellas para definir tus propias
excepciones o errores.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Clases
class Persona {
// Variables de instancia.
String nombre;
num edad;
// Constructor.
Persona() {}
// Método que lanza un saludo.
void saluda() => print('Hola me llamo $nombre');
}
!
void main() {
Persona juan = new Persona(); // Juan es un objeto, la instancia de Persona.
juan.nombre = 'Juan Alguien';
juan.edad = 29;
juan.saluda(); // Hola me llamo Juan Alguien
}
2014 | Moisés Belchín - librodart.es | blogdart.es
Dart es un lenguaje orientado a objetos, con clases y herencia simple. En Dart
todo es un objeto incluso los tipos de datos predefinidos son objetos.



Los objetos poseen miembros, funciones y datos. Los métodos de una clase
son las funciones y las variables de instancia los datos.	

!
En este ejemplo hemos creado una sencilla clase con unas variables de
instancia y un método. Una vez definas el objeto puedes acceder a sus
variables de instancia o a sus métodos utilizando la variable objeto seguido de
un punto y el método o la variable de instancia que quieras consultar.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Variables de instancia
class Persona {
// Variables de instancia.
String nombre; // variable inicializa a null.
num edad; // variable inicializa a null.
num hijos = 0; // variable inicializa a 0.
!
// Constructor.
Persona() {}
// Método que lanza un saludo.
void saluda() => print('Hola me llamo $nombre');
}
void main() {
Persona juan = new Persona();
juan.nombre = 'Juan Alguien';
juan.edad = 29;
print('Nombre: ${juan.nombre}'); // Nombre: Juan Alguien
print('Edad: ${juan.edad}'); // Edad: 29
}
2014 | Moisés Belchín - librodart.es | blogdart.es
Las variables de instancia son los “datos” del objeto. Estas variables de instancia se
definen en la clase y se declaran como las variables.

Todas las variables de instancia definidas de manera implícita generan un método
getter, por lo que no necesitarás declararlo tú.



Todas las variables de instancia que se definan con tipo de dato o con var además
también generan de manera implícita un método setter (para establecer el valor de la
variable de instancia).



Las variables de instancia pueden ser visibles o no visibles desde otras librerías, es
decir, puedes acceder a ellas desde la instancia creada o no.



Con tan solo comenzar el nombre de la variable con un guión bajo (_) ya estás
indicando si esa variable de instancia es o no privada.



Puedes identificar perfectamente las variables visibles y privadas en el outline por el
icono que se les asigna.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Herencia
class Animal {
String especie;
String variedad;
!
Animal.datos(this.especie, this.variedad);
void respira() {
print('Configurando sistema respiratorio...');
print('Sistema respiratorio configurado !');
}
void come() {
print('Configurando sistema digestivo...');
print('Sistema digestivo configurado !');
}
} continua …
2014 | Moisés Belchín - librodart.es | blogdart.es
… continuación
class Perro extends Animal {
String color;
num patas;
	

Perro(String variedad, String color, num patas):
super.datos('mamifero', variedad) {
this.color = color;
this.patas = patas;
}
	

void respira() {
super.respira();
print('respiro por la nariz');
}
} continua …
2014 | Moisés Belchín - librodart.es | blogdart.es
… continuación
!
void main() {
var p = new Perro('Labrador Retriever', 'Negro', 4);
p.respira(); // Configurando sistema respiratorio...
// Sistema respiratorio configurado !
// respiro por la nariz
p.come(); // Configurando sistema digestivo...
// Sistema digestivo configurado !
}
2014 | Moisés Belchín - librodart.es | blogdart.es
La herencia te permite crear nuevas clases a partir de otras existentes añadiendo nuevo
comportamiento, datos o funciones sobre lo que heredan de las clases padre evitando el
rediseño, modificación y verificación de la parte ya implementada.



En Dart puedes crear subclases utilizando la palabra extends y puedes referirte a la
clase padre con la palabra super.



En la clase hija puedes crear nuevas variables de instancia o nuevos métodos, también
puedes reescribir los métodos del padre. Siempre que necesites referirte un método o
variable de instancia de la clase padre utiliza super.



Anteriormente vimos los constructores y hablando de herencia debemos decir que los
constructores no se heredan, tampoco los constructores con nombre. Una subclase no
heredará los constructores de la clase superior. Si no se define constructor para la
subclase dispondrá del constructor implícito que crea Dart sin parámetros.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Librerías
library animales;
!
num NUMERO_MAXIMO = 12;
!
void crearAnimal() {}
!
class Animal {}
!
class Perro extends Animal {}
!
class Gato extends Animal {}
2014 | Moisés Belchín - librodart.es | blogdart.es
En Dart, generalmente cuando escribas una aplicación tendrás múltiples clases,
algunas heredarán de otras, tendrás en ficheros separados diferentes partes del
sistema, etc. Dart pone a tu disposición el concepto de librería.	

!
Actualmente en JavaScript tenemos esta gran limitación, tenemos que trabajar muy
duro para poder organizar nuestro proyecto en ficheros de código.

Las librerías, permiten crear código modular, que pueda compartirse y reutilizarse
fácilmente. Una librería no es más que un paquete que creas a partir de interfaces,
clases y funciones globales que empaquetas para reutilizar en otro proyecto bajo la
palabra reservada library seguido de un nombre.	

!
Este es un ejemplo sencillo de creación de librería, en el que hemos omitido la
implementación de las clases o de las funciones globales.	

2014 | Moisés Belchín - librodart.es | blogdart.es
Algunas Librerías interesantes
dart:async
dart:collection
dart:convert
dart:core
dart:html
!
dart:indexed_db
dart:io
dart:isolate
dart:js
dart:math
2014 | Moisés Belchín - librodart.es | blogdart.es
Recursos:
• dartlang.org
• api.dartlang.org
• blogdart.es
• librodart.es
2014 | Moisés Belchín - librodart.es | blogdart.es
¿Quieres aprender más sobre Dart?
Aprende Dart: www.librodart.es

Más contenido relacionado

La actualidad más candente

Introduccion a la poo
Introduccion a la pooIntroduccion a la poo
Introduccion a la pooBoris Salleg
 
Clase 10 Estructuras De Datos Y Arreglos
Clase 10 Estructuras De Datos Y ArreglosClase 10 Estructuras De Datos Y Arreglos
Clase 10 Estructuras De Datos Y Arreglossalomonaquino
 
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Adriano Teixeira de Souza
 
ALTER FACE Test Heuristic
ALTER FACE Test HeuristicALTER FACE Test Heuristic
ALTER FACE Test HeuristicJúlio de Lima
 
Sintaxis funciones c++
Sintaxis funciones c++Sintaxis funciones c++
Sintaxis funciones c++Fabiola Cortes
 
Data Structures in javaScript 2015
Data Structures in javaScript 2015Data Structures in javaScript 2015
Data Structures in javaScript 2015Nir Kaufman
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação CJose Augusto Cintra
 
Tipos de datos en java
Tipos de datos en javaTipos de datos en java
Tipos de datos en javaproyectopcd
 
Programación modular en Introducción a la Programación
Programación modular en Introducción a la ProgramaciónProgramación modular en Introducción a la Programación
Programación modular en Introducción a la ProgramaciónFacultad de Ciencias y Sistemas
 
Lenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y ComponentesLenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y ComponentesKarina Arguedas Ruelas
 
Array in c language
Array in c languageArray in c language
Array in c languagehome
 
Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Leinylson Fontinele
 

La actualidad más candente (20)

Introduccion a la poo
Introduccion a la pooIntroduccion a la poo
Introduccion a la poo
 
Clase 10 Estructuras De Datos Y Arreglos
Clase 10 Estructuras De Datos Y ArreglosClase 10 Estructuras De Datos Y Arreglos
Clase 10 Estructuras De Datos Y Arreglos
 
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória
 
Aula03 - JavaScript
Aula03 - JavaScriptAula03 - JavaScript
Aula03 - JavaScript
 
Expresiones regulares y gramaticas
Expresiones regulares y gramaticasExpresiones regulares y gramaticas
Expresiones regulares y gramaticas
 
Java - Primeiros passos
Java - Primeiros passosJava - Primeiros passos
Java - Primeiros passos
 
ALTER FACE Test Heuristic
ALTER FACE Test HeuristicALTER FACE Test Heuristic
ALTER FACE Test Heuristic
 
Sintaxis funciones c++
Sintaxis funciones c++Sintaxis funciones c++
Sintaxis funciones c++
 
Linguagem Dart (Google)
Linguagem Dart (Google)Linguagem Dart (Google)
Linguagem Dart (Google)
 
Paradigmas de la programación
Paradigmas de la programación Paradigmas de la programación
Paradigmas de la programación
 
Data Structures in javaScript 2015
Data Structures in javaScript 2015Data Structures in javaScript 2015
Data Structures in javaScript 2015
 
Árvores Rubro Negra
Árvores Rubro NegraÁrvores Rubro Negra
Árvores Rubro Negra
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
Curso de Python e Django
Curso de Python e DjangoCurso de Python e Django
Curso de Python e Django
 
Tipos de datos en java
Tipos de datos en javaTipos de datos en java
Tipos de datos en java
 
Programación modular en Introducción a la Programación
Programación modular en Introducción a la ProgramaciónProgramación modular en Introducción a la Programación
Programación modular en Introducción a la Programación
 
Lenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y ComponentesLenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y Componentes
 
Array in c language
Array in c languageArray in c language
Array in c language
 
Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)
 
Linguagem C 10 Arquivos
Linguagem C 10 ArquivosLinguagem C 10 Arquivos
Linguagem C 10 Arquivos
 

Similar a ¿Que es Google Dart? Presentación y desarrollo con Dart

Prototipado Web
Prototipado WebPrototipado Web
Prototipado WebiConstruye
 
Guía básica para pegarle al xhtml (Primera parte)
Guía básica para pegarle al xhtml (Primera parte)Guía básica para pegarle al xhtml (Primera parte)
Guía básica para pegarle al xhtml (Primera parte)Carlos Caicedo
 
Introducción a la web
Introducción a la webIntroducción a la web
Introducción a la webiConstruye
 
Tecnologías web.pptx
Tecnologías web.pptxTecnologías web.pptx
Tecnologías web.pptxGabrielCarbas
 
Germán Peraferrer: Cormo Framework
Germán Peraferrer: Cormo FrameworkGermán Peraferrer: Cormo Framework
Germán Peraferrer: Cormo FrameworkGrupo PHP Argentina
 
Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePointAdrian Diaz Cervera
 
Desarrollo Y ComercializacióN De Software Usando Ruby On Rails
Desarrollo Y  ComercializacióN De  Software Usando  Ruby On  RailsDesarrollo Y  ComercializacióN De  Software Usando  Ruby On  Rails
Desarrollo Y ComercializacióN De Software Usando Ruby On RailsDouglas Galindo
 
Programación Reactiva, Javascript Isomorfo y Meteorjs !
Programación Reactiva, Javascript Isomorfo y Meteorjs !Programación Reactiva, Javascript Isomorfo y Meteorjs !
Programación Reactiva, Javascript Isomorfo y Meteorjs !ouuyeah
 
Aprendiendo a Programas en 4 horas JavaScript
Aprendiendo a Programas en 4 horas JavaScriptAprendiendo a Programas en 4 horas JavaScript
Aprendiendo a Programas en 4 horas JavaScriptKarsarmi
 
Desarrollo de aplicaciones .net
Desarrollo de aplicaciones .netDesarrollo de aplicaciones .net
Desarrollo de aplicaciones .netJefersonGuevara1
 
Desarrollo de aplicaciones .net
Desarrollo de aplicaciones .netDesarrollo de aplicaciones .net
Desarrollo de aplicaciones .netJefersonGuevara1
 
Web matrix session2
Web matrix session2Web matrix session2
Web matrix session2Gonzalo C.
 
Caso real: Como migré un proyecto de Visual Composer a Gutenberg
Caso real: Como migré un proyecto de Visual Composer a GutenbergCaso real: Como migré un proyecto de Visual Composer a Gutenberg
Caso real: Como migré un proyecto de Visual Composer a GutenbergMarta Torre
 
Web Semantica - Tana BarCamp
Web Semantica - Tana BarCampWeb Semantica - Tana BarCamp
Web Semantica - Tana BarCampGiannella Ligato
 

Similar a ¿Que es Google Dart? Presentación y desarrollo con Dart (20)

Investigacion de pagina web
Investigacion de pagina webInvestigacion de pagina web
Investigacion de pagina web
 
Prototipado Web
Prototipado WebPrototipado Web
Prototipado Web
 
Guía básica para pegarle al xhtml (Primera parte)
Guía básica para pegarle al xhtml (Primera parte)Guía básica para pegarle al xhtml (Primera parte)
Guía básica para pegarle al xhtml (Primera parte)
 
Introducción a la web
Introducción a la webIntroducción a la web
Introducción a la web
 
1-HTML EXPO.pdf
1-HTML EXPO.pdf1-HTML EXPO.pdf
1-HTML EXPO.pdf
 
Tecnologías web.pptx
Tecnologías web.pptxTecnologías web.pptx
Tecnologías web.pptx
 
FULLSTACK JS DEV in 2017
FULLSTACK JS DEV in 2017FULLSTACK JS DEV in 2017
FULLSTACK JS DEV in 2017
 
Germán Peraferrer: Cormo Framework
Germán Peraferrer: Cormo FrameworkGermán Peraferrer: Cormo Framework
Germán Peraferrer: Cormo Framework
 
Cormo Framework
Cormo FrameworkCormo Framework
Cormo Framework
 
La magia de Flutter
La magia de FlutterLa magia de Flutter
La magia de Flutter
 
Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePoint
 
Congreso web
Congreso webCongreso web
Congreso web
 
Desarrollo Y ComercializacióN De Software Usando Ruby On Rails
Desarrollo Y  ComercializacióN De  Software Usando  Ruby On  RailsDesarrollo Y  ComercializacióN De  Software Usando  Ruby On  Rails
Desarrollo Y ComercializacióN De Software Usando Ruby On Rails
 
Programación Reactiva, Javascript Isomorfo y Meteorjs !
Programación Reactiva, Javascript Isomorfo y Meteorjs !Programación Reactiva, Javascript Isomorfo y Meteorjs !
Programación Reactiva, Javascript Isomorfo y Meteorjs !
 
Aprendiendo a Programas en 4 horas JavaScript
Aprendiendo a Programas en 4 horas JavaScriptAprendiendo a Programas en 4 horas JavaScript
Aprendiendo a Programas en 4 horas JavaScript
 
Desarrollo de aplicaciones .net
Desarrollo de aplicaciones .netDesarrollo de aplicaciones .net
Desarrollo de aplicaciones .net
 
Desarrollo de aplicaciones .net
Desarrollo de aplicaciones .netDesarrollo de aplicaciones .net
Desarrollo de aplicaciones .net
 
Web matrix session2
Web matrix session2Web matrix session2
Web matrix session2
 
Caso real: Como migré un proyecto de Visual Composer a Gutenberg
Caso real: Como migré un proyecto de Visual Composer a GutenbergCaso real: Como migré un proyecto de Visual Composer a Gutenberg
Caso real: Como migré un proyecto de Visual Composer a Gutenberg
 
Web Semantica - Tana BarCamp
Web Semantica - Tana BarCampWeb Semantica - Tana BarCamp
Web Semantica - Tana BarCamp
 

Último

Sanidad en alpacas, enfermedades infecciosas y parasitarias
Sanidad en alpacas, enfermedades infecciosas y parasitariasSanidad en alpacas, enfermedades infecciosas y parasitarias
Sanidad en alpacas, enfermedades infecciosas y parasitariasJilvertHuisaCenteno
 
Informe Mensual MARZO DE SUPERVISION.docx
Informe Mensual MARZO DE SUPERVISION.docxInforme Mensual MARZO DE SUPERVISION.docx
Informe Mensual MARZO DE SUPERVISION.docxTAKESHISAC
 
1. Cap. 4 Carga Axial (1).pdf237374335347
1. Cap. 4 Carga Axial (1).pdf2373743353471. Cap. 4 Carga Axial (1).pdf237374335347
1. Cap. 4 Carga Axial (1).pdf237374335347vd110501
 
Sistema de gestión de turnos para negocios
Sistema de gestión de turnos para negociosSistema de gestión de turnos para negocios
Sistema de gestión de turnos para negociosfranchescamassielmor
 
METROLOGÍA ÓPTICA E INSTRUMENTACIÓN BÁSICA.pdf
METROLOGÍA ÓPTICA E INSTRUMENTACIÓN BÁSICA.pdfMETROLOGÍA ÓPTICA E INSTRUMENTACIÓN BÁSICA.pdf
METROLOGÍA ÓPTICA E INSTRUMENTACIÓN BÁSICA.pdfesparzadaniela548
 
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosRevista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosJeanCarlosLorenzo1
 
5. MATERIAL COMPLEMENTARIO - PPT de la Sesión 02.pptx
5. MATERIAL COMPLEMENTARIO - PPT  de la Sesión 02.pptx5. MATERIAL COMPLEMENTARIO - PPT  de la Sesión 02.pptx
5. MATERIAL COMPLEMENTARIO - PPT de la Sesión 02.pptxJOSLUISCALLATAENRIQU
 
Proyecto de Base de Datos de César Guzmán
Proyecto de Base de Datos de César GuzmánProyecto de Base de Datos de César Guzmán
Proyecto de Base de Datos de César Guzmáncesarguzmansierra751
 
INSTRUCTIVO_NNNNNNNNNNNNNNSART2 iess.pdf
INSTRUCTIVO_NNNNNNNNNNNNNNSART2 iess.pdfINSTRUCTIVO_NNNNNNNNNNNNNNSART2 iess.pdf
INSTRUCTIVO_NNNNNNNNNNNNNNSART2 iess.pdfautomatechcv
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023ANDECE
 
POBLACIONES CICLICAS Y NO CICLICAS ......
POBLACIONES CICLICAS Y NO CICLICAS ......POBLACIONES CICLICAS Y NO CICLICAS ......
POBLACIONES CICLICAS Y NO CICLICAS ......dianamontserratmayor
 
SEMANA 6 MEDIDAS DE TENDENCIA CENTRAL.pdf
SEMANA  6 MEDIDAS DE TENDENCIA CENTRAL.pdfSEMANA  6 MEDIDAS DE TENDENCIA CENTRAL.pdf
SEMANA 6 MEDIDAS DE TENDENCIA CENTRAL.pdffredyflores58
 
Diseño de un aerogenerador de 400w de eje vertical
Diseño de un aerogenerador de 400w de eje verticalDiseño de un aerogenerador de 400w de eje vertical
Diseño de un aerogenerador de 400w de eje verticalEfrain Yungan
 
Mano de obra.pdf Curso Costos SENA Colombia
Mano de obra.pdf Curso Costos SENA ColombiaMano de obra.pdf Curso Costos SENA Colombia
Mano de obra.pdf Curso Costos SENA ColombiaCulturaGeneral1
 
La Evolución Industrial en el Ecuador.pdf
La Evolución Industrial en el Ecuador.pdfLa Evolución Industrial en el Ecuador.pdf
La Evolución Industrial en el Ecuador.pdfAnthony Gualpa
 
Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)dianamateo1513
 
trabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidastrabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidasNelsonQuispeQuispitu
 
Historia de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfHistoria de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfIsbelRodrguez
 
Estabilización de suelos (Física, Química y Mecánica)
Estabilización de suelos (Física, Química y Mecánica)Estabilización de suelos (Física, Química y Mecánica)
Estabilización de suelos (Física, Química y Mecánica)CristianSalas68
 

Último (20)

Sanidad en alpacas, enfermedades infecciosas y parasitarias
Sanidad en alpacas, enfermedades infecciosas y parasitariasSanidad en alpacas, enfermedades infecciosas y parasitarias
Sanidad en alpacas, enfermedades infecciosas y parasitarias
 
Informe Mensual MARZO DE SUPERVISION.docx
Informe Mensual MARZO DE SUPERVISION.docxInforme Mensual MARZO DE SUPERVISION.docx
Informe Mensual MARZO DE SUPERVISION.docx
 
1. Cap. 4 Carga Axial (1).pdf237374335347
1. Cap. 4 Carga Axial (1).pdf2373743353471. Cap. 4 Carga Axial (1).pdf237374335347
1. Cap. 4 Carga Axial (1).pdf237374335347
 
Sistema de gestión de turnos para negocios
Sistema de gestión de turnos para negociosSistema de gestión de turnos para negocios
Sistema de gestión de turnos para negocios
 
METROLOGÍA ÓPTICA E INSTRUMENTACIÓN BÁSICA.pdf
METROLOGÍA ÓPTICA E INSTRUMENTACIÓN BÁSICA.pdfMETROLOGÍA ÓPTICA E INSTRUMENTACIÓN BÁSICA.pdf
METROLOGÍA ÓPTICA E INSTRUMENTACIÓN BÁSICA.pdf
 
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosRevista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
 
5. MATERIAL COMPLEMENTARIO - PPT de la Sesión 02.pptx
5. MATERIAL COMPLEMENTARIO - PPT  de la Sesión 02.pptx5. MATERIAL COMPLEMENTARIO - PPT  de la Sesión 02.pptx
5. MATERIAL COMPLEMENTARIO - PPT de la Sesión 02.pptx
 
Proyecto de Base de Datos de César Guzmán
Proyecto de Base de Datos de César GuzmánProyecto de Base de Datos de César Guzmán
Proyecto de Base de Datos de César Guzmán
 
presentación manipulación manual de cargas sunafil
presentación manipulación manual de cargas sunafilpresentación manipulación manual de cargas sunafil
presentación manipulación manual de cargas sunafil
 
INSTRUCTIVO_NNNNNNNNNNNNNNSART2 iess.pdf
INSTRUCTIVO_NNNNNNNNNNNNNNSART2 iess.pdfINSTRUCTIVO_NNNNNNNNNNNNNNSART2 iess.pdf
INSTRUCTIVO_NNNNNNNNNNNNNNSART2 iess.pdf
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
 
POBLACIONES CICLICAS Y NO CICLICAS ......
POBLACIONES CICLICAS Y NO CICLICAS ......POBLACIONES CICLICAS Y NO CICLICAS ......
POBLACIONES CICLICAS Y NO CICLICAS ......
 
SEMANA 6 MEDIDAS DE TENDENCIA CENTRAL.pdf
SEMANA  6 MEDIDAS DE TENDENCIA CENTRAL.pdfSEMANA  6 MEDIDAS DE TENDENCIA CENTRAL.pdf
SEMANA 6 MEDIDAS DE TENDENCIA CENTRAL.pdf
 
Diseño de un aerogenerador de 400w de eje vertical
Diseño de un aerogenerador de 400w de eje verticalDiseño de un aerogenerador de 400w de eje vertical
Diseño de un aerogenerador de 400w de eje vertical
 
Mano de obra.pdf Curso Costos SENA Colombia
Mano de obra.pdf Curso Costos SENA ColombiaMano de obra.pdf Curso Costos SENA Colombia
Mano de obra.pdf Curso Costos SENA Colombia
 
La Evolución Industrial en el Ecuador.pdf
La Evolución Industrial en el Ecuador.pdfLa Evolución Industrial en el Ecuador.pdf
La Evolución Industrial en el Ecuador.pdf
 
Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)
 
trabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidastrabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidas
 
Historia de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfHistoria de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdf
 
Estabilización de suelos (Física, Química y Mecánica)
Estabilización de suelos (Física, Química y Mecánica)Estabilización de suelos (Física, Química y Mecánica)
Estabilización de suelos (Física, Química y Mecánica)
 

¿Que es Google Dart? Presentación y desarrollo con Dart

  • 2. PRESENTACIÓN DE MOISÉS BELCHÍN ! PARA PRESENTAR EL LENGUAJE DART EN EL EVENTO DART FLIGHT SCHOOL MADRID 2014 ORGANIZADO POR GDGMADRID ! La presentación ha sido complementada con diapositivas explicativas para entender el contenido esquemático de la presentación 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 3. ¿Qué es ? 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 4. ! ! Desarrollado por Google De código abierto Para proyectos web Estructurado Flexible 2014 | Moisés Belchín - librodart.es | blogdart.es Es un lenguaje de programación:
  • 5. Orientado a Objetos Basado en clases Con herencia simple Opcionalmente tipado 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 6. Sintaxis sencilla Muy legible Auto-documentado Compatible Cross-Brower 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 7. Estructurado Fácil Mantenimiento Permite programación asíncrona 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 8. De Alto rendimiento 2014 | Moisés Belchín - librodart.es | blogdart.es Actualmente, incluso compilado a JavaScript es superior a código JavaScript nativo en V8. Vamos a ver unos gráficos, que muestran una comparativa entre Dart, Dart compilado y JavaScript nativo en V8
  • 9. 2014 | Moisés Belchín - librodart.es | blogdart.es El primer gráfico, es un solucionador de restricciones de un solo sentido que muestra poli-morfismo y programación orientada a objetos. Vemos la distancia que hay entre JSV8 y Dart, que es de más del doble. [clic sobre el gráfico para reproducir] ! DeltaBlue
  • 10. DeltaBlue ! 2014 | Moisés Belchín - librodart.es | blogdart.es [Pulsar para reproducir]
  • 11. 2014 | Moisés Belchín - librodart.es | blogdart.es Es un solucionador de ecuaciones 2D Navier- Stokes. Muestra los resultados del acceso a las matrices numéricas, así como hacer aritmética de punto flotante. ! [clic sobre el gráfico para reproducir] ! FluidMotion
  • 12. FluidMotion [Pulsar para reproducir] 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 13. 2014 | Moisés Belchín - librodart.es | blogdart.es Es el punto de referencia de simulación de núcleo del sistema operativo. El foco principal es el acceso a la propiedad y llamar a funciones y métodos. ! ! [clic sobre el gráfico para reproducir] Richards
  • 14. Richards ! [Pulsar para reproducir] 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 15. 2014 | Moisés Belchín - librodart.es | blogdart.es Ya que Dart tiene un sistema de clase nativa, no sería muy “justo” hacer una comparación de rendimiento directo con la versión en octano. Por lo tanto, en este último gráfico se compara el rendimiento de dart con una versión mejorada de JavaScript llamada Tracer. Estar versión mejorada utiliza sólo los constructores y prototipos sin ninguna capa de abstracción en el medio. Corre un 50 % más rápido que el original RayTrace JavaScript referenciado en octano. ! [clic sobre el gráfico para reproducir] Tracer
  • 16. Tracer ! [Pulsar para reproducir] 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 17. Grandes proyectos ! 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 18. Grandes proyectos ! 2014 | Moisés Belchín - librodart.es | blogdart.es Dart no ha sido creado para sustituir a JavaScript, sino para ofrecer una opción alternativa más moderna en el desarrollo web y eficiente, sobre todo, para grandes proyectos.
  • 20. El paradigma está cambiando 2014 | Moisés Belchín - librodart.es | blogdart.es Hasta ahora el servidor era quien realizaba todo el trabajo. Cuando un visitante accedía a una web, el servidor: - Realizaba las consultas a la base de datos - y los procesos de validación de acceso - y componía la estructura HTML del documento - cargando los vínculos externos CSS, JavaScript, imágenes, documentos, vídeos, etc.
 
 Esto es lo que sucede en las aplicaciones desarrolladas en PHP, Python, JSP, Ruby, etc.
  • 21. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 22. 2014 | Moisés Belchín - librodart.es | blogdart.es A esto, debemos añadirle, el problema de la atención de la grandísima cantidad de solicitudes que se reciben y ahora más que nunca, con el cloud computing y los dispositivos móviles con acceso a internet.
 ¿Que pasará? Que Nuestro servidor no será capaz de atender toda la demanda que tiene de peticiones porque cada petición consume demasiados recursos.
 
 ¿Cual puede ser la solución? Descargar nuestro servidor de aquellos procesos que puede realizar el cliente y dotar a los clientes de mayor capacidad de proceso e inteligencia
  • 23. 2014 | Moisés Belchín - librodart.es | blogdart.es Desde hace unos años esta es la norma habitual. Gracias a HTML, CSS y JavaScript, cada vez que navegas por internet accedes a un servicio en el que el servidor te da un documento HTML con una serie de scripts, aplicaciones que son capaces de realizar muchos procesos en tu navegador web.
 
 Estas aplicaciones que corren en el navegador realizan peticiones de datos en modo asíncrono (para evitar bloquear el cliente) al servidor y con esos datos van modificando la página web mostrando u ocultando datos. Así conseguimos simplificar las peticiones que realizamos al servidor pudiendo atender más clientes, además de aprovechar la capacidad de proceso de los clientes.
  • 24. mantenimiento legibilidad 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 25. 2014 | Moisés Belchín - librodart.es | blogdart.es Si pensamos en aplicaciones como Gmail o Google Docs, desarrollar toda su interfaz, gestionar todas las peticiones y los eventos que se gestionan en el navegador .... puede ser una tarea muy costosa. Da miedo solo pensarlo!! 
 Y el mantenimiento de esas aplicaciones?... eso si que da miedo.
 
 JavaScript no se diseñó para estos propósitos, no es lo suficientemente robusto, el código se vuelve ilegible e incomprensible cuando empezamos con callbacks y padece de grandes problemas de gestión de memoria.
  • 26. GWT 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 27. 2014 | Moisés Belchín - librodart.es | blogdart.es Por este motivo, los desarrolladores de Google al crear sus apps con JavaScript, se preguntaron si realmente era el lenguaje ideal para hacerlo, por lo que buscaron otras alternativas como GWT. Consiguieron con ello un enfoque estructurado, pero muy poco optimizado para la web. ! Y posteriormente, crearon Dart, un lenguaje que permitiese combinar ambos mundos: el dinamismo de JavaScript con la Potencia y estructura de lenguajes como C# o Java
  • 28. ejemplos código 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 29. 2014 | Moisés Belchín - librodart.es | blogdart.es Estamos hablando de JavaScript y probablemente la mayoría de los que estáis leyendo esta presentación sepáis JavaScript, por lo que vamos a ver las diferencias reales entre ambos lenguajes, usando unos pequeños fragmentos de código muy sencillos.
  • 30. Nombres más estructurados ! JavaScript Dart HTMLElement Element ownerDocument document XMLHttpRequest HttpRequest CSSStyleSheet CssStyleSheet 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 31. 2014 | Moisés Belchín - librodart.es | blogdart.es Lo primero que llama la atención, es que en Dart los nombres son más simples y estructurados.
 
 Los nombres han sido simplificados, están más optimizados y estructurados. Lo que nos simplifica mucho la vida a los desarrolladores.
 Se ha utilizado una nomenclatura más estándar y se sigue la norma CamelCase.
  • 32. Buscar Elementos fácilmente ! JavaScript Dart getElementsById('id') querySelector('#id') getElementsByTagName('tag') querySelectorAll('tag') getElementsByName('name') querySelectorAll('[name="name"]') getElementsByClassName('class') querySelectorAll('.class') 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 33. 2014 | Moisés Belchín - librodart.es | blogdart.es En Dart buscar elementos en el DOM es más sencillo. Los métodos que empleamos para la búsqueda de elementos en el DOM se han simplificado también, dejando únicamente dos y, esto es importante, compatibles con el nuevo estándar de HTML5 ! querySelector() y querySelectorAll().
  • 34. Colecciones reales de datos ! JavaScript Dart elem.hasAttribute('name') elem.attributes.containsKey('name') elem.getAttribute('name')('tag') elem.attributes['name'] elem.setAttribute('name', 'value') elem.attributes['name'] = 'value' elem.removeAttribute('name') elem.attributes.remove('name') 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 35. 2014 | Moisés Belchín - librodart.es | blogdart.es Dart dispone de diferentes tipos de datos para representar colecciones de datos: Lists, Maps y Sets.
 
 En JavaScript, los tipos de colecciones del DOM cuando recuperas una lista de elementos, por ejemplo, utilizando getElementsByTagName son diferentes del tipo Array nativo de Javasript, lo que produce errores e inconsistencia de datos. ! !
  • 36. 2014 | Moisés Belchín - librodart.es | blogdart.es En Dart, se ha simplificado y los métodos que manejan el DOM como por ejemplo, children, nodes o cuando recuperas un conjunto de elementos con querySelectorAll se devuelven en colecciones de datos nativas de Dart. ! Gracias a que Dart dispone los elementos del DOM en colecciones de datos reales, también simplifica muchos de los métodos nativos de JavaScript. Por ejemplo, en lugar de recuperar un elemento del DOM y tener diferentes métodos para trabajar con sus atributos, Dart trabaja con sus atributos con los métodos generales y comunes a los Maps ya que Dart almacena los atributos de los elementos en la estructura de datos Map.
  • 37. Constructores para elementos del DOM JavaScript Dart document.createElement('div') new DivElement() new InputElement (type:'checkbox') 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 38. 2014 | Moisés Belchín - librodart.es | blogdart.es En Dart, tenemos constructores para crear elementos del DOM!
 Para crear nuevas elementos del DOM, con JavaScript, tenemos createElement(). En Dart, como es un un lenguaje orientado a objetos, tenemos constructores para los diferentes tipos de elementos del DOM.
  • 39. Mejora y unifica el sistema de eventos ! JavaScript Dart elem.addEventListener('click', (event) => print('click'), false); var eventListener = elem.onClick.listen((event) => print('click')); elem.removeEventListener ('click', listener); eventListener.cancel(); 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 40. 2014 | Moisés Belchín - librodart.es | blogdart.es Además, mejora y unifica el sistema de eventos." 
 Los eventos son el cambio más importante y útil que encontrarás en Dart. Se ha modificado el modo en el que están unidos los controladores de eventos.
 
 El DOM tiene dos formas de trabajar con eventos. El modo más antiguo que enlaza un único controlador en un elemento a través de una de las propiedades on del elemento. Y el modo más moderno utilizando las funciones addEventListener() y removeEventListener() que permite establecer múltiples oyentes para el mismo evento.
 
 En Dart, se han simplificado las cosas. Se han eliminado todas las propiedades on en Element y usa el API Stream que proporciona un modelo unificado de eventos.
 Para cada tipo de evento existente en el DOM cada elemento dispone de una propiedad concreta, por ejemplo, onClick, onMouseOver, onBlur, etc.
  • 41. Future API function showResult(xhr) { if (xhr.readyState==4 && xhr.status==200) { var div =document.getElementById(“result”); div.innerHTML=xhr.responseText; } } function getResult() { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = showResult(xhr); xhr.open(‘GET’, ‘http://www.google.es’, true); xhr.send(); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 42. 2014 | Moisés Belchín - librodart.es | blogdart.es API basadas en Futuros Cuando en JavaScript queremos escribir un código asíncrono, tenemos que utilizar funciones callbacks como respuesta de retorno de otras funciones o como parámetros para nuevas llamadas a funciones. 
 En aplicaciones grandes, este sistema se vuelve ilegible y muy propenso a errores y el mantenimiento resulta ser un trabajo muy duro.
 
 Dart ha integrado dentro de su SDK la clase Future que permite encapsular en una forma orientado a objetos respuestas asíncronas de manera nativa.
 Sin duda algo que hará las delicias de muchos. Un código más claro, limpio y que permite paralelizar tareas de manera muy simple.
 
 Si antes teníamos un código como en que acabamos de ver, ahora tendríamos el siguiente:
  • 43. Future API void getResult() { var xhr = HttpRequest.getString('http://www.google.es') ..then((resp) => print(resp)) ..catchError((e) => print('Error!')); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 44. 2014 | Moisés Belchín - librodart.es | blogdart.es Sin duda una mejora increíble y notable a la hora de trabajar.
 
 Los Futures se utilizan constantemente en el SDK de Dart y también los utilizarás con mucha frecuencia en tú código, ya que Dart se ha diseñado desde su origen para que sea totalmente asíncrono.
  • 45. Librerías muy organizadas Gran limpieza y organización Librería pura de manejo del DOM y HTML más ligera y sencilla Librerías independientes para cada bloque Cada librería tiene su propio namespace 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 46. 2014 | Moisés Belchín - librodart.es | blogdart.es Otra diferencia interesante, son las librerías. ! Dart presenta una gran limpieza y organización en lo que a las librerías del DOM se refiere y gracias a esta reorganización, la librería pura de manejo del DOM y HTML es más ligera y sencilla.
 
 Todo lo relativo a indexedDB, audio, web_sql y svg se ha extraído del DOM y se han creado librerías independientes para cada bloque, con lo que además de tener librerías concretas para cada función, se han mejorado y simplificado los nombres, eliminando prefijos innecesarios y repetitivos ya que cada librería tiene su propio namespace.
  • 47. Coherencia Cross-Browser Elimina prefijos de los desarrolladores Soporte multi-navegador Sin necesidad de usar Framework 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 48. 2014 | Moisés Belchín - librodart.es | blogdart.es Así como la coherencia cross-browser:" 
 Poder eliminar los prefijos de los diferentes desarrolladores de navegadores y reorganizar las librerías simplifica nuestro trabajo dándonos soporte multi navegador para que nuestro código se compatible en todos los navegadores modernos. Y todo esto de manera nativa sin necesidad de trabajar con un framework que añada otra capa a tus aplicaciones!!
  • 49. Construcción en Cascada Facilita el trabajo cuando trabajamos con elementos del DOM ! var text = document.querySelector('#sample_text_id'); text ..text = 'Bienvenido a Dart !' ..lang = 'ES' ..attributes.forEach((k, v) => print('$k: $v')); 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 50. 2014 | Moisés Belchín - librodart.es | blogdart.es Y por último, las construcción en cascada:
 Uno de los operadores que se incluyó posteriormente en Dart y que utilizarás mucho es el operador en cascada. Inicialmente no se contemplaba y se añadió para facilitarnos el trabajo cuando trabajamos con elementos del DOM.
 
 Es muy común estar trabajando con elementos HTML y cambiar o añadir los valores de múltiples propiedades. Esto origina grandes bloques de código, muy repetitivos y que nos llevan a incorporar ilegibilidad a nuestro código.
 
 Si tienes que repetir el nombre del elemento en lugar de darle un nombre descriptivo es muy posible que uses un nombre lo más abreviado posible, lo que lleva a producir un código menos legible.
  • 51. 2014 | Moisés Belchín - librodart.es | blogdart.es Por último, algo que no podemos olvidar: ES MUY NOVEDOSO.
 
 Si pensamos en lo que será la versión 6 de JavaScript, que esperamos estará disponible para finales de 2014, hay gran parte de sus funciones y APIs ya disponibles en Dart:
  • 52. Variables de ámbito de bloque Valores por defecto en funciones Parám. opcionales por nombre Interpolación de Strings Arrow functions y Promises API 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 53. /** * Shift the bits of this integer to the right by [shiftAmount]. * * Shifting to the right makes the number smaller and drops the least * significant bits, doing an integer division by `pow(2, shiftIndex)`. * * It is an error of [shiftAmount] is negative. */ int operator >>(int shiftAmount); ! /// Returns true if and only if this integer is even. bool get isEven; Documentación 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 54. 2014 | Moisés Belchín - librodart.es | blogdart.es Además, es un lenguaje donde es muy fácil hacer la documentación, es auto-documentado
 
 Tenemos docgen, dartdoc y comentarios documentación ! En el ejemplo, podemos ver un fragmento de código donde podemos ver documentación en bloque y documentación en línea
  • 55. library animales; ! num NUMERO_MAXIMO = 12; ! void crearAnimal() {} ! class Animal {} ! class Perro extends Animal {} ! class Gato extends Animal {} Paquetes-Librerías 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 56. 2014 | Moisés Belchín - librodart.es | blogdart.es Otra novedad son los paquetes-librerías Las librerías, permiten crear código modular, que pueda compartirse y reutilizarse fácilmente.
 
 Una librería no es más que un paquete que creas a partir de interfaces, clases y funciones globales que empaquetas para reutilizar en otro proyecto bajo la palabra reservada library seguido de un nombre. ! En el ejemplo podemos ver un fragmento de código, donde definimos la librería animales
  • 57. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 58. 2014 | Moisés Belchín - librodart.es | blogdart.es Otra novedad importante, es el gestor de paquetes PUB!! 
 Que es la herramienta que nos permite añadir a nuestras aplicaciones cualquier librería que necesitemos escrita por otro programador de una manera muy cómoda y simple. ! PUB se ocupa automáticamente de resolver dependencias y de mantenernos al tanto de las últimas versiones, si así se lo indicamos.
  • 59. import 'dart:html'; ! void main() { var text = document.querySelector('#sample_text_id'); text.text = 'Bienvenido a Dart !'; text.lang = 'ES'; text.attributes.forEach((k, v) => print('$k: $v')); text.style.backgroundColor = '#f87c45'; } Manejo estructurado propiedades DOM 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 60. 2014 | Moisés Belchín - librodart.es | blogdart.es Permite un manejo estructurado de todas las propiedades del DOM, como hemos visto en el ejemplo anterior.
 !
  • 61. Propiedades 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 62. 2014 | Moisés Belchín - librodart.es | blogdart.es Vamos a ver otro método: .querySelectorAll que devuelve una lista de elementos que coincidan con el selector especificado. Cada elemento encontrado es un objeto y por tanto dispone de todas las propiedades y métodos definidos en dart:html. ! Además, otra gran ventaja es que al utilizar este método obtienes colecciones reales de datos nativas de Dart, es decir .querySelectorAll te devuelve una lista de objetos que coincidan con el selector especificado y por lo tanto tienes a tu disposición todos los métodos que ya has visto en dart:core para trabajar con el tipo de datos List. Sin lugar a dudas esta es una de las mayores ventajas que presenta Dart en esta librería ya que todo el DOM está perfectamente estructurado y todos los nodos representados son tratados como objetos nativos de Dart con sus propiedades y métodos.
  • 63. 2014 | Moisés Belchín - librodart.es | blogdart.es Ejemplos de manipulación de todo lo relacionado con CSS y los estilos de elementos HTML y, cómo Dart vuelve a poner a tu disposición sencillos y bien definidos mecanismos para trabajar con este tipo de propiedades de manera consistente y uniforme. ! Al igual que HTML, CSS ha ido evolucionando rápidamente para dar soporte a nuevas y mejoradas funciones todas ellas ya contempladas dentro de Dart. ! Así puedes acceder a todas las propiedades relacionadas con estilos de los elementos HTML desde Dart.
  • 64. import 'dart:html'; main() { print('1. Lanzo una petición de manera asíncrona'); var resultado = HttpRequest.getString('respuesta.json'); resultado .then((future_resultado) { print('2. Ya se ha completado el future y obtengo un resultado.'); print(future_resultado); }).catchError((_) { print('3. Error ejecutando la petición al servidor.'); }); print('4. Continúo ejecutando más acciones.'); } Programación asíncrona 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 65. 2014 | Moisés Belchín - librodart.es | blogdart.es Y hemos dejado para el final, una de las mejores novedades: la programación asíncrona.
 Que tal como la presenta Dart y como lo hará JavaScript 6 con su API Promises, es una forma de poder trabajar, ejecutar y crear procedimientos asíncronos de una manera natural, sencilla y estructurada. ! Pone a nuestra disposición el API dart:async con las clases Future y Stream para poder realizar programación asíncrona.
 
 Comenzamos viendo brevemente Future que representa un proceso, función o valor de retorno que se recuperará en un futuro en modo diferido. Ejecutaremos una función, por ejemplo, y el valor de retorno de la función no lo obtendremos de manera inmediata sino en otro momento.
  • 66. 2014 | Moisés Belchín - librodart.es | blogdart.es ! En el ejemplo vemos un fragmento de código, donde, ind independientemente del mensaje que mostramos, nuestra pequeña aplicación no se queda esperando la respuesta de HttpRequest.getString! ! Continúa ejecutando más acciones y cuando el servidor responde con un valor de retorno o un error se ejecutan los métodos .then o .catchError del objeto Future resultado.
  • 67. void main() { print('1. Instrucciones'); var serie = [1, 2, 3, 4, 5]; var stream = new Stream.fromIterable(serie); ! // Nos suscribimos a los eventos del Stream stream.listen((valor) { print("3. Stream: $valor"); }); print('2. Instrucciones'); } Programación asíncrona Resultado: 1. Instrucciones 2. Instrucciones 3. Stream: 1 3. Stream: 2 3. Stream: 3 3. Stream: 4 3. Stream: 5 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 68. 2014 | Moisés Belchín - librodart.es | blogdart.es Ahora lo vemos usando Stream
 
 Como podemos observar en este fragmento de código, el resultado es similar a la ejecución de los ejemplos de Future. 
 Nuestro programa main no se queda esperando al Stream
 
 Es totalmente asíncrono y según se van recibiendo los datos desde el Stream se va ejecutando la función onData registrada y aquí podemos ver el resultado:
  • 69. Resultado: 1. Instrucciones 2. Instrucciones 3. Stream: 1 3. Stream: 2 3. Stream: 3 3. Stream: 4 3. Stream: 5 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 70. Polymer Web Components Reutilizar Vincular interfaz y lógica (Data Binding) Encapsular Estructura, estilo y comportamiento 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 71. 2014 | Moisés Belchín - librodart.es | blogdart.es Polymer hace uso de Shadow DOM para poder crear nuevos componentes web y aislarlos del resto del documento y de otros componentes para evitar colisiones de nombres, así como para encapsular su estructura, estilo y comportamiento.
 Hemos comentado que gracias a Polymer.dart podremos crear nuestros propios componentes web y utilizarlos en nuestros documentos HTML muy fácilmente.
  • 72. 2014 | Moisés Belchín - librodart.es | blogdart.es Vamos a preparar un sencillo ejemplo que represente perfectamente esta idea y te permita ver como queda separado por un lado su estructura, qué etiquetas lo componen, por otro lado su estilo, todas las definiciones CSS que le darán formato, y por último, el código Dart que le proporcionará funcionalidad. ! Vamos a crear un componente para gestionar todo el sistema de acceso de un usuario al sistema. Este componente estará compuesto por:
 - Un fichero HTML que definirá su estructura - La definición CSS que conforma el estilo de nuestro login - El fichero Dart
  • 74. 2014 | Moisés Belchín - librodart.es | blogdart.es Ahora vemos la parte HTML, una parte del CSS (solo un fragmento para que puedas hacerte a la idea) y el archivo Dart
  • 75. <polymer-element name="login-usuario"> <meta charset="utf-8"> <template> <link rel="stylesheet" href="login.css"> <div id="login"> <h1><strong>Bienvenido.</strong> <span>Accede con tu nombre y contraseña</span></h1> <template if="{{error == true}}"> <div id="login_msg">{{login_error}}</div> </template> <fieldset> <p><input type="text" required id="usuario" name="usuario" placeholder="Usuario"></p> <p><input type="password" required id="password" name="password" placeHolder="Contraseña"></p> <p><a href="#" on-click="{{recordarPassword}}">¿No puedes entrar?</a></p> <p><button on-click="{{entrar}}">Entrar</button></p> </fieldset> <p><span class="btn-round">o</span></p> <p><a class="facebook-before"><span class="fontawesome-facebook"></span></a> <button class="facebook" on-click="{{facebookLogin}}">Accede Usando Facebook</button> </p> <p><a class="twitter-before"><span class="fontawesome-twitter"></span></a> <button class="twitter" on-click="{{twitterLogin}}">Accede Usando Twitter</button> </p> </div> </template> <script type="application/dart" src="login.dart"></script> </polymer-element> HTML 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 76. /* CSS Document */ a { text-decoration: none; } h1 { font-size: 1em; } h1, p { margin-bottom: 10px; } span { color: #5a5656; font-weight: lighter; } strong { font-weight: bold; } .uppercase { text-transform: uppercase; } ! /* ---------- LOGIN ---------- */ #login { margin: 50px auto; width: 300px; } … CSS 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 77. import 'package:polymer/polymer.dart'; ! /** * Polymer Login System Element. */ @CustomTag('login-usuario') class LoginUsuario extends PolymerElement { @observable String usuario; @observable String password; @observable bool error = false; @observable String login_error = ''; ! LoginUsuario.created() : super.created(); /// Valida nombre usuario y contraseña. void entrar() { if(usuario == null || usuario.trim() == '' || password == null || password.trim() == '') { error = true; login_error = 'Introduce usuario y password.’;} continua … DART 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 78. … continua ! return; } } /// Permite recordar la contraseña olvidada. void recordarPassword() {} /// Permite hacer login con Facebook. void facebookLogin() {} /// Permite hacer login con Twitter. void twitterLogin() {} } DART 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 79. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Sample app</title> <link rel="stylesheet" href="aplicacion.css"> <!-- importamos login-usuario --> <link rel="import" href="login.html"> <script type=“application/dart"> export 'package:polymer/init.dart';</script> <script src="packages/browser/dart.js"></script> </head> <body> <h1>Bienvenido a Polymer y Dart</h1> <login-usuario></login-usuario> ! </body> </html> } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 80. ¿Cómo se trabaja con ? 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 81. 2014 | Moisés Belchín - librodart.es | blogdart.es Ahora pasamos a la parte práctica, donde haremos un rápido tour por el lenguaje. ! DartEditor, el editor de Dart.
  • 82. DartEditor 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 83. Vistas 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 84. 2014 | Moisés Belchín - librodart.es | blogdart.es Podemos configurar las vistas, en la opción tools:
 Breakpoints: acceso rápido a los puntos de parada establecidos
 
 Callers: permite ver los métodos que llaman a otros métodos. Encontrarás esta opción muy útil cuando tus aplicaciones crezcan.
 
 Debugger: permite manejar el debugger de Dart Editor.
 
 Files: permite gestionar tus proyectos.
 
 Outline: muestra todas las clases y métodos que las componen y permite dirigirte a cualquier método o clase haciendo clic sobre él.
 
 Problems: Permite ver cualquier error o problema que exista en tus aplicaciones y acceder a él rápidamente haciendo doble clic.
  • 85. 2014 | Moisés Belchín - librodart.es | blogdart.es Ahora vamos a ver como se compila a JavaScript. Actualmente solo Dartium puede correr aplicaciones Dart porque incluye la máquina virtual de Dart (DartVM). Con el tiempo Dart funcionará de manera nativa en todos los navegadores y en Google Chrome porque incluirá la máquina virtual de Dart. Si ahora mismo quieres que tus aplicaciones funcionen en el resto de navegadores debes compilar tu código Dart a JavaScript.
 
 El proceso de compilación lo hace dart2js, transforma la aplicación de código Dart en código JavaScript y puede durar más o menos dependiendo de la cantidad de código de tu aplicación.
 
 Cuando lances la compilación a JavaScript verás que se abre una nueva ventana Output donde informa de la evolución del proceso de compilación.
 
 Una vez hayas finalizado el proceso de compilación podrás ver que se han generado varios ficheros JavaScript en el panel de ficheros y aplicaciones.
  • 86. Depurar 2014 | Moisés Belchín - librodart.es | blogdart.es [Pulsar para reproducir]
  • 87. Dart VM 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 88. 2014 | Moisés Belchín - librodart.es | blogdart.es Dart Virtual Machine o DartVM es la máquina virtual de Dart. Al igual que sucede con Java, Dart necesita de un intérprete que sepa reconocer y ejecutar el código Dart.
 Si escribes una aplicación Dart de línea de comandos e intentas ejecutarla en un sistema en el que no tengas instalada la máquina virtual de Dart esa aplicación no funcionará, será un simple fichero de texto con unas instrucciones en su interior que el sistema no sabe reconocer.
 
 Para evitar esto debes instalar DartVM. La máquina virtual de Dart reconocerá y ejecutará aplicaciones de línea de comandos así como scripts del lado del servidor, aplicaciones y servidores.
  • 89. Dartium Chromium + DartVM 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 90. 2014 | Moisés Belchín - librodart.es | blogdart.es En un futuro, podremos correr nuestras aplicaciones Dart de manera nativa en los principales navegadores y entonces, al instalar nuevas versiones de Dart, Dartium ya no aparecerá en nuestro sistema.
 Hasta que ese momento llegue tenemos dos opciones: ! - Compilar las apps Dart a código JavaScript para que sean entendidas y ejecutadas en cualquier navegador web moderno con soporte de JavaScript.
 
 - Correr las apps Dart en un navegador que tenga ya incluido de manera predeterminada DartVM.
  • 91. 2014 | Moisés Belchín - librodart.es | blogdart.es Dartium es el navegador web de código abierto Chromium (basado en Google Chrome) al que se la ha incluído la máquina virtual de Dart, de ahí su nombre Dart + Chromium = Dartium.
 Gracias a esto podemos ejecutar nuestras aplicaciones Dart directamente en el navegador web sin necesidad de compilarlas previamente a JavaScript.
 
 Dartium y DartVM viene incluido por defecto en nuestra instalación de Dart Editor junto con el SDK, pub, dart2js, etc. Y para ejecutar una app web será el navegador que ejecute por defecto la app Dart.
  • 92. 2014 | Moisés Belchín - librodart.es | blogdart.es Dart permite formatear programas de manera más automática. Esta herramienta se llama Dart Formatter y puedes ejecutarla desde el directorio de aplicaciones del sdk de estos dos modos.
 La forma de funcionar es sencilla, si especificas un fichero con código Dart realiza los cambios correspondientes en dicho fichero, si por el contrario indicas un directorio, Dart Formatter realizará cambios en todos los ficheros que encuentre de manera recursiva en dicho directorio. Por defecto, los cambios que realices, dartfmt los muestra en la salida estándar. ! Dart Formatter permite que establecer de manera automática un formato estándar del código siguiendo la guía de estilo definida por Google.
 
 Pasamos de este este primer código, al siguiente: DartFormatter
  • 93. /** * DocString para este fichero. */ import 'dart:html'; /// Punto de entrada en la aplicacion. void main() { int zero; if (0==0)   zero=0; else if (0==1)   zero=1; else if (0==2)   zero=2; } DartFormatter 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 94. /** * DocString para este fichero. */ import 'dart:html'; ! /// Punto de entrada en la aplicacion. void main() {  int zero;  if (0 == 0) {    zero = 0;  } else if (0 == 1) {    zero = 1;  } else if (0 == 2) {    zero = 2;  } } DartFormatter 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 95. ¿Como Programar en ? 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 97. Operadores 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 98. Operadores Ahora vamos a ver, los operadores, parte imprescindible de cualquier lenguaje de programación. Nos permiten efectuar operaciones aritméticas con números, asignar valores entre variables y poder tomar decisiones en un momento determinado para que tu programa ejecute una parte u otra. ! Como Dart es un lenguaje orientado a objetos, los operadores son métodos de instancia con nombres especiales, por ejemplo, +, -, *, %, etc.
 
 Los métodos de instancia operan sobre las variables de instancia de los objetos, aunque también tienen acceso a las variables de la clase. ! En el ejemplo podemos ver como se ha definido la clase Double la cual posee una serie de operadores. Operador de suma [+] y operador de resta [-]. ! Hay varios tipos de operadores, los vamos a ver brevemente: 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 99. Operadores: tipos Aritméticos Test de tipado Condicionales De igualdad y relacionales Asignación De Bits 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 100. + Suma - Resta -expr Signo negativo * Multiplicación / División ~ División entera % Resto de la división Operadores aritméticos 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 101. ++var Incrementa valor de la variable antes de realizar otra operación var++ Incrementa valor de la variable después de ejecutar la sentencia - -var Decrementa valor de la variable antes de realizar otra operación var- - Decrementa valor de la variable después de ejecutar la sentencia Operadores aritméticos 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 102. “==" Igualdad != Distinto > Mayor que < Menor que >= Mayor o igual <= Menor o igual Operadores de igualdad y relacionales 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 103. as Casting de tipos para convertir un objeto de un tipo a otro is Verdadero si el objeto es del tipo indicado is! Falso si el objeto es del tipo indicado Operadores de test de tipado 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 104. “=“ Asigna un valor a una variable “x=“ Multiplica y asigna %= Resto de la división y asigna &= Realiza operación de bit AND y asigna += Suma y asigna /= Divide y asigna Operadores de asignación 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 105. <<= Realiza operación de bit de desplazamiento izquierda y asigna ^= Realiza operación de bit XOR y asigna -= Resta y asigna ~/= Realiza la división entera y asigna >>= Realiza operación de bit de desplazamiento derecha y asigna |= Realiza operación de bit OR y asigna Operadores de asignación 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 106. & AND | OR ^ XOR ~expr Invierte el valor del Bit << Desplazamiento izquierda >> Desplazamiento derecha Operadores de Bit 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 107. ( ) Llamada a una función [ ] Referencia un valor de una lista cond?exp1:exp2 Si se cumple la condición se asigna el valor de la expresión 1 sino el de la expresión 2. . Acceder a los miembros de un objeto .. Realizar múltiples operaciones sobre un objeto ?identificador Sirve para comprobar argumentos opcionales Otros Operadores 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 108. Expresiones Las Expresiones en Dart, son fragmentos de código Dart que se evalúan en tiempo de ejecución para obtener un valor, que es siempre un objeto. Cada expresión tiene un tipo estático asociado y cada valor tiene un tipo dinámico asociado.
 Una expresión es un conjunto de datos o funciones unidos por operadores aritméticos, lógicos, etc. ! ! 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 109. Expresiones Condicionales expr1 ? expr2 : expr3 Lógica expr1 || expr2 expr1 && expr2 Bit expr1 & expr2 expr1 | expr2 expr1 ^ expr2 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 110. Expresiones Igualdad expr1 == expr2 expr1 != expr2 Relación expr1 > expr2 expr1 >= expr2 expr1 < expr2 expr1 <= expr2 Desplazamiento expr1 >> expr2 expr1 << expr2 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 111. Expresiones Adición expr1 + expr2 expr1 - expr2 ! Multiplicación expr1 * expr2 expr1 / expr2 expr1 ~/ expr2 expr1 % expr2 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 112. Expresiones Pre-expresiones y post-expresiones ++expr expr++ --expr expr-- Asignación [=] [*=], [/=], [~/=], [%=], [+=], [-=], [<<=], [>>=], [&=], [^=], [|=] 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 113. Variables y tipos de datos main() { var variable1 = 5; var variable2 = 2; print(variable1+variable2); // El resultado es 7 } ! ————————————————————- main() { String variable1 = 'Bienvenido a Dart'; num variable2 = 1.1; print('${variable1} ${variable2}'); // El resultado es "Bienvenido a Dart 1.1" } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 114. Dart soporta diferentes tipos de datos para definir las diferentes variables que vayamos utilizando en nuestros programas.
 
 El tipo de dato es un indicativo que puedes utilizar para saber que el valor que contiene esa variable es un número, una cadena u otro tipo de dato. ! Los tipos de datos también ayudan a Dart en el momento de la traducción de código Dart a JavaScript.
 
 Vemos unos sencillos ejemplos de uso de variables. En el primero, hemos definido dos variables, sin indicar el tipo de dato que van a contener y las hemos sumado mostrando el resultado en pantalla.
 
 En el siguiente ejemplo trabajamos con dos variables diferentes una de tipo String y otra de tipo num. Mostramos un mensaje al usuario concatenando el contenido de ambas variables. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 115. main() { final app_title = 'Mi primera app Dart'; final String app_subtitle = 'Dart mola !’; const pi = 3.14159265358979; } Tipos de variables: Final y Const 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 116. Existen dos modificadores que permiten modificar el comportamiento normal de una variable final y const.
 
 La diferencia exacta entre final y const, es que una variable declarada como final se inicializa una única vez. Una variable declarada como const se considera una constante en tiempo de ejecución. ! Variables de ámbito global o local o variables de clase declaradas como final se inicializan la primera vez que se utilicen. Esto se conoce como lazy initialization (inicialización perezosa) y ayuda a las aplicaciones a cargar más rápidamente. ! Para cualquier valor que quieras que sea constante en tiempo de ejecución utiliza const seguido del nombre de la variable y del valor que vaya a tener la variable. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 117. Sentencias var clima = 'riesgo'; if (clima.isNotEmpty && clima == 'riesgo') { precaucion(); } else { sinPrecaucion(); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 118. Dart permite sentencias if con sentencias else opcionales.
 
 La particularidad es que en Dart, hay que ser más explícito, ya que considera que todos los valores distintos de True (verdadero) son False (falso), esto comportamiento difiere del comportamiento de JavaScript y, como ya te comentamos en la sección de Definición de Variables y tipos de datos, si utilizas este tipo de comprobaciones obtendrás un error. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 119. Tipos de datos String num int double bool DateTime List, Set Map 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 120. Bucle For var lista = ['uno', 'dos', 'tres', 'cuatro']; ! for (var i=0; i < lista.length; i++) { print('${i} :: ${lista[i]}'); // 0 :: uno // 1 :: dos // 2 :: tres // 3 :: cuatro } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 121. ! En Dart dispones de varios tipos de bucles diferentes, pero ahora nos centraremos en los bucle for.
 
 Este bucle tiene un formato que te resultará muy familiar ya que hereda la sintaxis de JavaScript, C, etc. ! Los bucles for también te permiten iterar sobre objetos List, Map o Set. 2014 | Moisés Belchín - librodart.es | blogdart.es Bucle For
  • 122. Iterables var lista = ['uno', 'dos', 'tres',‘cuatro']; ! lista.forEach((item){ print(item); }); ! for(item in lista) { print(item); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 123. Bucle While while(llamadasPerdidas()) { parpadearLuz(); } ————————————————— do { parpadearLuz(); } while (llamadasPerdidas()); 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 124. Repite un bloque de código mientras una condición se mantenga True (verdadera). Evalúa la condición antes de entrar en el bucle y lo repite mientras la condición sea verdadera.
 Si queremos evaluar la condición después de ejecutar el ciclo del bucle (es decir, ejecutaremos el bucle al menos una vez), podemos utilizar do- while. 2014 | Moisés Belchín - librodart.es | blogdart.es Bucle While
  • 125. Al trabajar con bucles también tienes a tu disposición estas dos sentencias: break y continue. Estas sentencias te servirán para controlar la ejecución del bucle. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 126. Break var i = 100; while(true) { i -= 5; print(i); if(i < 75) { break; } } Resultado: 95 90 85 80 75 70 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 127. 2014 | Moisés Belchín - librodart.es | blogdart.es Resultado: 95 90 85 80 75 70
  • 128. Continue for (var i = 100; i > 0; i--) { if (i.isEven) { continue; } ! print(i); if (i < 75) { break; } } Resultado: 99 97 95 93 91 89 87 85 83 81 79 77 75 732014 | Moisés Belchín - librodart.es | blogdart.es
  • 129. 2014 | Moisés Belchín - librodart.es | blogdart.es Resultado: 99 97 95 93 91 89 87 85 83 81 79 77 75 73
  • 130. Switch var accion = 'Abrir'; ! switch (accion) { ! case 'Pagada': AnotarPago(); break; ! case 'Impagada': dejarPendiente(); break; ! default: Comprobar(); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 131. Permite realizar una selección entre múltiples alternativas evitando anidar sentencias if-else. Esto mejora la legibilidad del código y además es una estructura que se ejecuta mucho más rápido que utilizar if-else anidados. ! Como puedes ver la estructura de esta sentencia define una serie de casos de coincidencia (case) y de acciones a realizar en caso de que una de ellas se cumpla. Tras cumplirse esa coincidencia y ejecutarse la acción siempre debe figurar la sentencia break para salir de switch. 2014 | Moisés Belchín - librodart.es | blogdart.es Switch
  • 132. Funciones void saluda(String nombre) { print('Bienvenido a Dart ${nombre}'); } Parám. opcionales por posición Parám. opcionales por nombre Valores predeterminados Valores de retorno 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 133. Los parámetros de las funciones en Dart pueden ser obligatorios u opcionales. En caso de ser opcionales pueden ser opcionales por posición u opcionales por nombre.
 Utilizamos funciones para dividir una tarea grande en otras más simples o para implementar operaciones que vamos a utilizar varias veces en nuestra aplicación. ! 2014 | Moisés Belchín - librodart.es | blogdart.es Funciones
  • 134. Param. opc. por posición void saluda (String nombre, [String apellidos, num edad]) { if(apellidos != null && edad != null) { print('Bienvenido a Dart ${nombre} ' '${apellidos} tienes ${edad} años.'); } else { print('Bienvenido a Dart ${nombre}.'); } } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 135. Param. opc. por posición saluda('Pedro'); // Bienvenido a Dart Pedro. saluda('Pedro', 'García'); // Bienvenido a Dart Pedro. saluda('Pedro', 'García', 28); // Bienvenido a Dart Pedro García tienes 28 años. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 136. Los parámetros opciones por posición se indican entre corchetes [], y siguen la misma descripción que el resto de los parámetros, tipo de dato y nombre del parámetro.
 Si realizas unas llamadas a esta función con estos tipos de parámetros diferentes podrás obtener estos resultados 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 137. Param. op. por nombre void saluda({String nombre, String apellidos, num edad}) { var saludo = new StringBuffer('Bienvenido a Dart'); if (nombre != null) { saludo.write(' ${nombre}'); } ! if (apellidos != null) { saludo.write(' ${apellidos}'); } ! if (edad != null) { saludo.write(' tienes ${edad} años.'); } print(saludo.toString()); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 138. Param. op. por nombre saluda(nombre:'Pedro'); saluda(apellidos:'García', nombre:'Pedro'); saluda(apellidos:'García', edad: 29, nombre:'Pedro'); saluda(); ! 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 139. Además de los parámetros opcionales por posición dispones de parámetros opcionales por nombre. ! Son muy útiles porque no tienes que llamar a la función del mismo modo siempre, y mejora la documentación de la propia función cuando se realiza la llamada. ! Nota: observa que no importa el orden en el que pases los parámetros a la función. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 140. Valores predeterminados void saluda([String nombre='ANONIMO']) { var saludo = new StringBuffer('Bienvenido a Dart'); if (nombre != null) { saludo.write(' ${nombre}'); } print(saludo.toString()); } saluda(); // Bienvenido a Dart ANONIMO saluda('Juan'); // Bienvenido a Dart Juan 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 141. Las funciones con parámetros opcionales además pueden tener valores predeterminados. Un valor predeterminado se asigna al parámetro opcional en caso de que dicho parámetro no se especifique en el momento de la llamada a la función.
 
 Para indicar el valor predeterminado de un parámetro opcional usamos el signo igual (=) o los dos puntos (:) dependiendo de si se trata de un parámetro opcional por posición o por nombre.
 
 Este es un ejemplo de valor predeterminado para parámetros opcionales por posición. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 142. Valores de retorno num suma(num a, num b) { return a+b; } var resultado = suma(1,5); print(resultado); // 6 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 143. Hemos comentado al comienzo de esta sección que cuando una función no retorne ningún valor como norma de sintaxis y estilo se debe indicar la palabra void. En realidad no hemos dicho toda la verdad ya que todas las funciones retornan un valor, pero cuando tú función no indica de manera explícita ningún valor la función devuelve null. 
 
 En este primer ejemplo la función suma te devuelve un número. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 144. Excepciones var resultado; try { // Intento acceder al sistema. resultado = login(); } on Exception catch(e) { // Se produce un error en el sistema. resultado = 'No has dicho la palabra mágica !'; } finally { // Muestro la respuesta al usuario. print(resultado); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 145. Dart incorpora un mecanismo de excepciones que permite capturar casos de error excepcionales no contemplados y actuar en consecuencia. De este modo podrás mostrar un mensaje de error más adecuado para el usuario y que el sistema siga funcionando.
 
 En otros casos te puede interesar lanzar excepciones en determinadas partes de tu aplicación. Dart también incorpora mecanismos para hacer esto.
 
 Cuando algo inusual sucede en tu aplicación Dart lanzará una excepción, si esta excepción no es capturada el isolate que generó la excepción se interrumpirá y el programa terminará. Dart proporciona Exception y Error para el manejo de errores y excepciones. Y también te permite crear tus propias excepciones.
 
 Los mecanismos que presenta Dart para manejar errores y excepciones son throw, catch y finally. Throw permite lanzar excepciones. Esta expresión permite lanzar una excepción en cualquier parte de nuestro desarrollo. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 146. Excepciones try { login(); } on PasswordVaciaException { // Captura de una excepción concreta. reLogin(); } on Exception catch(e) { // Captura cualquier Exception. print('Pero que ha pasado aquí ?!?!'); } catch(e) { // Captura cualquier otra cosa que suceda. print('Algo ha ido mal. No se que ha pasado !'); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 147. Catch es el mecanismos que tiene Dart para capturar las excepciones producidas, de este modo se detiene la propagación de la excepción y puedes manejarla.
 
 Para ser más exactos Dart captura las excepciones mediante los bloques try {} on {} catch {}.
 Estos bloques pueden anidarse y capturar más de un tipo de excepciones.
 
 Como puedes ver en el ejemplo puedes ir encadenando bloques dependiendo de los diferentes tipos de excepciones que te interese capturar.
 
 Durante la captura de una excepción puedes utilizar on o catch o ambas. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 148. Excepciones if(usuario == null) { throw new Exception('Usuario no reconocido en el sistema !!'); } ! if(password == null) { throw new Exception('La contraseña no es correcta !!'); } ! if(datos == null) { throw new NullThrownError(); } if((datos is Map) == false) { throw new TypeError(); } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 149. Por último, Dart permite ejecutar un fragmento de código se produzca o no una excepción en un determinado código. finally te va a permitir ejecutar un fragmento de código se produzca o no excepción.
 
 En dart:core tienes a tu disposición la clase Exception y la clase Error para gestionar excepciones o errores en el sistema, estas clases además te permiten heredar de ellas para definir tus propias excepciones o errores. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 150. Clases class Persona { // Variables de instancia. String nombre; num edad; // Constructor. Persona() {} // Método que lanza un saludo. void saluda() => print('Hola me llamo $nombre'); } ! void main() { Persona juan = new Persona(); // Juan es un objeto, la instancia de Persona. juan.nombre = 'Juan Alguien'; juan.edad = 29; juan.saluda(); // Hola me llamo Juan Alguien } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 151. Dart es un lenguaje orientado a objetos, con clases y herencia simple. En Dart todo es un objeto incluso los tipos de datos predefinidos son objetos.
 
 Los objetos poseen miembros, funciones y datos. Los métodos de una clase son las funciones y las variables de instancia los datos. ! En este ejemplo hemos creado una sencilla clase con unas variables de instancia y un método. Una vez definas el objeto puedes acceder a sus variables de instancia o a sus métodos utilizando la variable objeto seguido de un punto y el método o la variable de instancia que quieras consultar. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 152. Variables de instancia class Persona { // Variables de instancia. String nombre; // variable inicializa a null. num edad; // variable inicializa a null. num hijos = 0; // variable inicializa a 0. ! // Constructor. Persona() {} // Método que lanza un saludo. void saluda() => print('Hola me llamo $nombre'); } void main() { Persona juan = new Persona(); juan.nombre = 'Juan Alguien'; juan.edad = 29; print('Nombre: ${juan.nombre}'); // Nombre: Juan Alguien print('Edad: ${juan.edad}'); // Edad: 29 } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 153. Las variables de instancia son los “datos” del objeto. Estas variables de instancia se definen en la clase y se declaran como las variables.
 Todas las variables de instancia definidas de manera implícita generan un método getter, por lo que no necesitarás declararlo tú.
 
 Todas las variables de instancia que se definan con tipo de dato o con var además también generan de manera implícita un método setter (para establecer el valor de la variable de instancia).
 
 Las variables de instancia pueden ser visibles o no visibles desde otras librerías, es decir, puedes acceder a ellas desde la instancia creada o no.
 
 Con tan solo comenzar el nombre de la variable con un guión bajo (_) ya estás indicando si esa variable de instancia es o no privada.
 
 Puedes identificar perfectamente las variables visibles y privadas en el outline por el icono que se les asigna. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 154. Herencia class Animal { String especie; String variedad; ! Animal.datos(this.especie, this.variedad); void respira() { print('Configurando sistema respiratorio...'); print('Sistema respiratorio configurado !'); } void come() { print('Configurando sistema digestivo...'); print('Sistema digestivo configurado !'); } } continua … 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 155. … continuación class Perro extends Animal { String color; num patas; Perro(String variedad, String color, num patas): super.datos('mamifero', variedad) { this.color = color; this.patas = patas; } void respira() { super.respira(); print('respiro por la nariz'); } } continua … 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 156. … continuación ! void main() { var p = new Perro('Labrador Retriever', 'Negro', 4); p.respira(); // Configurando sistema respiratorio... // Sistema respiratorio configurado ! // respiro por la nariz p.come(); // Configurando sistema digestivo... // Sistema digestivo configurado ! } 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 157. La herencia te permite crear nuevas clases a partir de otras existentes añadiendo nuevo comportamiento, datos o funciones sobre lo que heredan de las clases padre evitando el rediseño, modificación y verificación de la parte ya implementada.
 
 En Dart puedes crear subclases utilizando la palabra extends y puedes referirte a la clase padre con la palabra super.
 
 En la clase hija puedes crear nuevas variables de instancia o nuevos métodos, también puedes reescribir los métodos del padre. Siempre que necesites referirte un método o variable de instancia de la clase padre utiliza super.
 
 Anteriormente vimos los constructores y hablando de herencia debemos decir que los constructores no se heredan, tampoco los constructores con nombre. Una subclase no heredará los constructores de la clase superior. Si no se define constructor para la subclase dispondrá del constructor implícito que crea Dart sin parámetros. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 158. Librerías library animales; ! num NUMERO_MAXIMO = 12; ! void crearAnimal() {} ! class Animal {} ! class Perro extends Animal {} ! class Gato extends Animal {} 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 159. En Dart, generalmente cuando escribas una aplicación tendrás múltiples clases, algunas heredarán de otras, tendrás en ficheros separados diferentes partes del sistema, etc. Dart pone a tu disposición el concepto de librería. ! Actualmente en JavaScript tenemos esta gran limitación, tenemos que trabajar muy duro para poder organizar nuestro proyecto en ficheros de código.
 Las librerías, permiten crear código modular, que pueda compartirse y reutilizarse fácilmente. Una librería no es más que un paquete que creas a partir de interfaces, clases y funciones globales que empaquetas para reutilizar en otro proyecto bajo la palabra reservada library seguido de un nombre. ! Este es un ejemplo sencillo de creación de librería, en el que hemos omitido la implementación de las clases o de las funciones globales. 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 161. Recursos: • dartlang.org • api.dartlang.org • blogdart.es • librodart.es 2014 | Moisés Belchín - librodart.es | blogdart.es
  • 162. ¿Quieres aprender más sobre Dart? Aprende Dart: www.librodart.es