closures-ios-visual-engineering

WORKSHOP IOS - CLOSURES, GENÉRICOS Y OPERADORES

En los primeros workshops de iOS tratamos el tema de las closures. Si recordamos, una closure, también denominada función de cierre, era como un bloque de Objective-C o C, en la que una función en vez de comenzar con la palabra reservada func incorpora unas llaves { }:

{ (parámetros) -> tipo de retorno in declaración del bloque }

En este workshop entramos en detalle con genéricos y operadores. Respecto a los genéricos, éstos sirven para definir código de una forma más abstracta, sin depender de un tipo en concreto para que el mismo código pueda aplicarse luego a distintos tipos siempre que sigan una serie de reglas, o restricciones, como un protocolo.

El propio módulo de foundation define estructuras como el array o el diccionario que hacen un uso extensivo de generics y eso les permite almacenar colecciones de cualquier tipo. Incluso, ese es quizás el uso más habitual de los generics.

Y en cuanto a los operadores, son símbolos que se usan para trabajar como valores. Se pueden usar para realizar manipulaciones matemáticas o lógicas específicas, pero también pueden servir para comparar números, juntar textos,... Es decir puedes definir operadores que hagan lo que quieran. E incluso, aunque Objective-C cuenta con una gran cantidad de operadores,  te puedes crear operadores nuevos que aún no existen en el lenguaje.

Si quieres conocer más sobre estos aspectos, nuestro ingeniero Alberto Irurueta nos enseñó ese workshop de "Closures, generics & operators":

Puedes descargar su presentación aquí.


closures-ios-visual-engineering

WORKSHOP IOS - Closures, genéricos y operadores

En los primeros workshops de iOS tratamos el tema de las closures. Si recordamos, una closure, también denominada función de cierre, era como un bloque de Objective-C o C, en la que una función en vez de comenzar con la palabra reservada func incorpora unas llaves { }:

{ (parámetros) -> tipo de retorno in declaración del bloque }

En este workshop entramos en detalle con genéricos y operadores. Respecto a los genéricos, éstos sirven para definir código de una forma más abstracta, sin depender de un tipo en concreto para que el mismo código pueda aplicarse luego a distintos tipos siempre que sigan una serie de reglas, o restricciones, como un protocolo.

El propio módulo de foundation define estructuras como el array o el diccionario que hacen un uso extensivo de generics y eso les permite almacenar colecciones de cualquier tipo. Incluso, ese es quizás el uso más habitual de los generics.

Y en cuanto a los operadores, son símbolos que se usan para trabajar como valores. Se pueden usar para realizar manipulaciones matemáticas o lógicas específicas, pero también pueden servir para comparar números, juntar textos,… Es decir puedes definir operadores que hagan lo que quieran. E incluso, aunque Objective-C cuenta con una gran cantidad de operadores,  te puedes crear operadores nuevos que aún no existen en el lenguaje.

Si quieres conocer más sobre estos aspectos, nuestro ingeniero Alberto Irurueta nos enseñó ese workshop de “Closures, generics & operators“:

Puedes descargar su presentación aquí. 


testing ios blog visual engineering

WORKSHOP IOS - TESTING, PROTOCOLOS Y EXTENSIONES

Las pruebas o tests unitarios nos permiten verificar de forma ágil y segura que nuestra app hace lo que debe hacer. Para verificarlo se basa en los casos de prueba que hayamos definido previamente.

Normalmente se usan para verificar pruebas de regresión, es decir, que nuestra app sigue haciendo lo que antes hacía tras incorporar los nuevos cambios. Es importante tenerlo en cuenta porque Apple puede rechazar una actualización de nuestra app debido a que ésta produzca errores no controlados que podríamos evitar con estas pruebas.

Las pruebas unitarias son la base para el desarrollo guiado por pruebas o Test-Driven Development (TDD), que es un estilo de programación que impone la creación de los casos de prueba con antelación al código que va a ser verificado.

En Xcode existen principalmente dos tipos de pruebas unitarias:

  • Pruebas unitarias lógicas: verifican el correcto funcionamiento de un fragmento de código de forma independiente.
  • Pruebas unitarias de aplicación: verifican el correcto funcionamiento de fragmentos de código dentro del contexto de nuestra app, y verificar funcionalidades específicas de un dispositivo, como el uso de la geolocalización, acelerómetro, etc.

Los casos de pruebas deben ser:

  • Automatizables: que no requieran intervención humana para su verificación.
  • Completas: deben cubrir el mayor código posible, es decir que debemos tener casos de prueba que cubran cuántos más métodos de nuestra app mejor.
  • Repetibles: un caso de prueba no debe tener ninguna dependencia que impida ser ejecutado varias veces con el mismo resultado.
  • Independencia: un caso de prueba no puede depender del resultado de otro caso.

Tan necesarias son las pruebas unitarias como lo es la práctica de la integración continua.

La integración continua consiste en tener un proceso automatizado en el que, después de que cada developer suba código al repositorio, se obtiene la última versión, se compila, se ejecutan el conjunto de pruebas unitarias seleccionado, y se dejan los binarios/resultados en una ubicación conocida.

Con la integración continua evitaríamos el posible problema de que no compile o que de repente fallen funcionalidades dependientes de referencias externas, nos ahorraría tiempo en los desarrollos y nos permitiría centrarnos en lo importante de la aplicación: su funcionalidad.

Existen dos sistemas de integración continua:

  • Travis CI: especialmente diseñado para construir y testear proyectos en Github de forma automática.
  • Jenkins: es gratuito, open-source y actualmente uno de los más empleados para esta función. Además es muy fácil de utilizar y permite actualizaciones fáciles.

Todos esto lo puedes profundizar en el siguiente workshop "TESTING, PROTOCOLOS Y EXTENSIONES", impartido por Alberto Irurueta y Alejandro García, que se hizo con el objetivo de:

  • Entender el funcionamiento de los protocolos
  • Aprender a crear tests unitarios
  • Generar informes de resultados de tests y de cobertura de código
  • Integración continua (Travis vs. Jenkins)

Puedes descargar la presentación aquí.

 


testing ios blog visual engineering

WORKSHOP IOS - Testing, protocolos y extensiones

Las pruebas o tests unitarios nos permiten verificar de forma ágil y segura que nuestra app hace lo que debe hacer. Para verificarlo se basa en los casos de prueba que hayamos definido previamente.

Normalmente se usan para verificar pruebas de regresión, es decir, que nuestra app sigue haciendo lo que antes hacía tras incorporar los nuevos cambios. Es importante tenerlo en cuenta porque Apple puede rechazar una actualización de nuestra app debido a que ésta produzca errores no controlados que podríamos evitar con estas pruebas.

Las pruebas unitarias son la base para el desarrollo guiado por pruebas o Test-Driven Development (TDD), que es un estilo de programación que impone la creación de los casos de prueba con antelación al código que va a ser verificado.

En Xcode existen principalmente dos tipos de pruebas unitarias:

  • Pruebas unitarias lógicas: verifican el correcto funcionamiento de un fragmento de código de forma independiente.
  • Pruebas unitarias de aplicación: verifican el correcto funcionamiento de fragmentos de código dentro del contexto de nuestra app, y verificar funcionalidades específicas de un dispositivo, como el uso de la geolocalización, acelerómetro, etc.

Los casos de pruebas deben ser:

  • Automatizables: que no requieran intervención humana para su verificación.
  • Completas: deben cubrir el mayor código posible, es decir que debemos tener casos de prueba que cubran cuántos más métodos de nuestra app mejor.
  • Repetibles: un caso de prueba no debe tener ninguna dependencia que impida ser ejecutado varias veces con el mismo resultado.
  • Independencia: un caso de prueba no puede depender del resultado de otro caso.

Tan necesarias son las pruebas unitarias como lo es la práctica de la integración continua.

La integración continua consiste en tener un proceso automatizado en el que, después de que cada developer suba código al repositorio, se obtiene la última versión, se compila, se ejecutan el conjunto de pruebas unitarias seleccionado, y se dejan los binarios/resultados en una ubicación conocida.

Con la integración continua evitaríamos el posible problema de que no compile o que de repente fallen funcionalidades dependientes de referencias externas, nos ahorraría tiempo en los desarrollos y nos permitiría centrarnos en lo importante de la aplicación: su funcionalidad.

Existen dos sistemas de integración continua:

  • Travis CI: especialmente diseñado para construir y testear proyectos en Github de forma automática.
  • Jenkins: es gratuito, open-source y actualmente uno de los más empleados para esta función. Además es muy fácil de utilizar y permite actualizaciones fáciles.

Todos esto lo puedes profundizar en el siguiente workshop “TESTING, PROTOCOLOS Y EXTENSIONES”, impartido por Alberto Irurueta y Alejandro García, que se hizo con el objetivo de:

  • Entender el funcionamiento de los protocolos
  • Aprender a crear tests unitarios
  • Generar informes de resultados de tests y de cobertura de código
  • Integración continua (Travis vs. Jenkins)

Puedes descargar la presentación aquí.


swift estructuras visual engineering

WORKSHOP IOS - SWIFT: ESTRUCTURAS

En Swift tanto las estructuras como las clases son fundamentales para hacer un proyecto completo.

Las estructuras (structs) son uno de los pilares principales de Swift como lenguaje. Las estructuras representan unidades de información.

Las clases (class) son las partes esenciales que organizar y que dividen nuestra aplicación en diferentes archivos y dentro de estos en diferentes métodos que nos permiten estructurar todo.

Las estructuras y las clases tiene mucho en común. Ambas pueden:

  • Definir propiedades para guardar valores

  • Definir métodos para proveer funcionalidades

  • Definir sub-scripts para proveer acceso a sus valores usando la sintaxis del sub-script

  • Definir inicializadores  para configurar en estado inicial

  • Para ser extendidos y expandir su funcionalidad más allá de su implementación por defecto

  • Ajustar protocolos para proveer funcionalidades estándares de cierto tipo.

Las clases tienen capacidades adicionales que las estructuras no tienen:

  • La inner-herencia permite una clase heredar las características de otra clase.

  • El type-casting te permite revisar e interpretar el tipo de instancias dentro de una clase al crear un runtime.

  • Los des-inicializadores permiten a la instancia de una clase liberar cualquier recurso que se le haya asignado.

  • El conteo de referencias permite a que más haya más de una referencia a la instancia de una clase.

Por otro lado, las enumeraciones (enums) en Swift son elementos de primera clase. Ellos adoptan muchas funcionalidades tradicionalmente soportadas por las clases, como propiedades computadas que proveen información adicional sobre los valores actuales de las enumeraciones, y métodos de instancias que proveen funcionalidades relacionadas a los valores que las enumeraciones representan, entre otras cosas.

Para conocer mejor todos estos elementos del código, nuestros ingenieros Jordi Serra y Pierluigi Cifani nos presentaron "Swift - Estructuras".

Puedes descargar su presentación: Swift: structs, enums and classes.

Para mayor información sobre las clases y estructuras, puedes visitar la página de Apple para developers.


swift estructuras visual engineering

WORKSHOP IOS - Swift: Estructuras

En Swift tanto las estructuras como las clases son fundamentales para hacer un proyecto completo.

Las estructuras (structs) son uno de los pilares principales de Swift como lenguaje. Las estructuras representan unidades de información.

Las clases (class) son las partes esenciales que organizar y que dividen nuestra aplicación en diferentes archivos y dentro de estos en diferentes métodos que nos permiten estructurar todo.

Las estructuras y las clases tiene mucho en común. Ambas pueden:

  • Definir propiedades para guardar valores

  • Definir métodos para proveer funcionalidades

  • Definir sub-scripts para proveer acceso a sus valores usando la sintaxis del sub-script

  • Definir inicializadores  para configurar en estado inicial

  • Para ser extendidos y expandir su funcionalidad más allá de su implementación por defecto

  • Ajustar protocolos para proveer funcionalidades estándares de cierto tipo.

Las clases tienen capacidades adicionales que las estructuras no tienen:

  • La inner-herencia permite una clase heredar las características de otra clase.

  • El type-casting te permite revisar e interpretar el tipo de instancias dentro de una clase al crear un runtime.

  • Los des-inicializadores permiten a la instancia de una clase liberar cualquier recurso que se le haya asignado.

  • El conteo de referencias permite a que más haya más de una referencia a la instancia de una clase.

Por otro lado, las enumeraciones (enums) en Swift son elementos de primera clase. Ellos adoptan muchas funcionalidades tradicionalmente soportadas por las clases, como propiedades computadas que proveen información adicional sobre los valores actuales de las enumeraciones, y métodos de instancias que proveen funcionalidades relacionadas a los valores que las enumeraciones representan, entre otras cosas.

Para conocer mejor todos estos elementos del código, nuestros ingenieros Jordi Serra y Pierluigi Cifani nos presentaron “Swift – Estructuras“.

Puedes descargar su presentación: Swift: structs, enums and classes.

Para mayor información sobre las clases y estructuras, puedes visitar la página de Apple para developers. 


workshop fundamentos swift 3 visual engineering

WORKSHOP IOS - FUNDAMENTOS DE SWIFT 3

Swift es un intuitivo lenguaje de programación creado por Apple que permite diseñar apps para iOS, Mac, Apple TV y Apple Watch. Es uno de los lenguajes de programación de Apple para iOS y OS X con más futuro. Ahora la versión disponible para los developers es Swift 3.

Swift es un lenguaje rápido y eficaz que proporciona información a tiempo real y se integra a la perfección con Objective-C. Así los developers pueden ofrecer más seguridad, ahorrar tiempo y crear aún mejores apps.

Está pensado para dar a los developers más libertad que nunca. Como es público y de código abierto y tan fácil de usar, con Swift cualquiera puede ejecutar sus ideas.

Como Swift es un código prometedor, decidimos hacer un workshop de "Fundamentos de Swift 3", siendo el 3, como se ha comentado anteriormente, la última versión disponible para todos los developers. Nos los presentaron Alberto Irurueta y Pia Muñoz.

Podéis decargar la presentación aquí.


workshop fundamentos swift 3 visual engineering

WORKSHOP IOS - Fundamentos de Swift 3

Swift es un intuitivo lenguaje de programación creado por Apple que permite diseñar apps para iOS, Mac, Apple TV y Apple Watch. Es uno de los lenguajes de programación de Apple para iOS y OS X con más futuro. Ahora la versión disponible para los developers es Swift 3.

Swift es un lenguaje rápido y eficaz que proporciona información a tiempo real y se integra a la perfección con Objective-C. Así los developers pueden ofrecer más seguridad, ahorrar tiempo y crear aún mejores apps.

Está pensado para dar a los developers más libertad que nunca. Como es público y de código abierto y tan fácil de usar, con Swift cualquiera puede ejecutar sus ideas.

Como Swift es un código prometedor, decidimos hacer un workshop de “Fundamentos de Swift 3“, siendo el 3, como se ha comentado anteriormente, la última versión disponible para todos los developers. Nos los presentaron Alberto Irurueta y Pia Muñoz.

Podéis descargar la presentación aquí


react native parte nativa blog visual engineering

WORKSHOP: REACT NATIVE Y LA PARTE NATIVA

Con React Native, un framework de código abierto, se permite compilar aplicaciones escritas en JavaScript para Web, iOS y Android desde una única base de código, lo que significa que los desarrolladores pueden aprender un idioma único de programación y desplegar su software en las tres plataformas.

"Aprende una vez y escribe en cualquier lugar" es el lema con el que Facebook quiere hacer ver a los desarrolladores las bondades de su herramienta.

Entre las ventajas de React Native se encuentran:

  • La posibilidad de utilizar componentes nativos
  • La ejecución asíncrona
  • El sistema táctil TouchableHighlight
  • El modelo de diseño Flexbox
  • La API Polyfills
  • Creación de bibliotecas nativas reutilizables
  • Creación de módulos y vistas para Android y iOS

Si entramos más al detalle, una de las mejores características de este framework, es que si conoces un poco de las plataformas nativas iOS con Swift u Objective-C y Android con Java, es muy fácil crear tus propios módulos nativos para usar mas características nativas del dispositivo que aún no se encuentren incorporadas en el framework.

En nuestro último workshop de React Native quisimos ver toda la parte nativa, entre ellos refrescar sus componentes y además, conocer toda la parte de módulos nativos. Éste se llamaba "React Native: La parte nativa" y fue presentado por nuestros ingenieros Enrique Oriol y Alberto Irurueta.



Presentación para descargar: React Native- The native side


react native parte nativa blog visual engineering

WORKSHOP: React Native y la parte nativa

Con React Native, un framework de código abierto, se permite compilar aplicaciones escritas en JavaScript para Web, iOS y Android desde una única base de código, lo que significa que los desarrolladores pueden aprender un idioma único de programación y desplegar su software en las tres plataformas.

Aprende una vez y escribe en cualquier lugar” es el lema con el que Facebook quiere hacer ver a los desarrolladores las bondades de su herramienta.

Entre las ventajas de React Native se encuentran:

  • La posibilidad de utilizar componentes nativos
  • La ejecución asíncrona
  • El sistema táctil TouchableHighlight
  • El modelo de diseño Flexbox
  • La API Polyfills
  • Creación de bibliotecas nativas reutilizables
  • Creación de módulos y vistas para Android y iOS

Si entramos más al detalle, una de las mejores características de este framework, es que si conoces un poco de las plataformas nativas iOS con Swift u Objective-C y Android con Java, es muy fácil crear tus propios módulos nativos para usar mas características nativas del dispositivo que aún no se encuentren incorporadas en el framework.

En nuestro último workshop de React Native quisimos ver toda la parte nativa, entre ellos refrescar sus componentes y además, conocer toda la parte de módulos nativos. Éste se llamaba “React Native: La parte nativa” y fue presentado por nuestros ingenieros Enrique Oriol y Alberto Irurueta.



Presentación para descargar: React Native- The native side