Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Me presento ...
Víctor M. Bolinches
Software Architect en Capgemini.
Founder Programmer en PlayGram Games.
Ninja Developer en Indie VideoGames Development.
3
4 Paradigmas de Programación
▹ OOP
▸ Estructura de datos llamados objetos
▸ Aglutinan propiedades y métodos
▸ Manipula datos de entrada para generar datos de salida específicos
▹ FP
▸ Estructura mediante expresiones
▸ Variables sin estado e inmutables
▸ Recursión y Funciones de primer orden
▸ Definición de cómputos y cálculo de lambdas
5
”
6 Objeto inmutable
class A {
public void foo() {
Arrays.asList(1,2,3,4,5,6).forEach( s -> { System.out.println(s); } );
}
}
...eq
class A {
public void foo() {
Arrays.asList(1,2,3,4,5,6).forEach( [lambda for lambda$1 as Block] );
}
▹ Tipos abstractos
▹ Modelo conceptual simple
▹ Incluye definición de métodos
10 Traits - Mejores prácticas por composición
▹ Clase abstractas
▹ Modelo conceptual simple
▹ Puede guardar el estado de un objeto
▹ Clase base no tiene control sobre la composición del mixin
12 Mixins
▹ Síncrono
▸ Intercambio de información en tiempo real
▹ Concurrente
▸ Ejecución simultánea de tareas en tiempo real
▹ Paralelo
▸ Sistema multi-procesado (subdominio concurrente)
▹ Asíncrono
▸ Intercambio de información en tiempo diferido
14 Comunicación entre procesos
15
”
16 Patrón Promesa
▹ Iteraciones
▸ Desarrollo mediante pruebas (Fallo - Acierto)
▸ Refactorizaciones
19
Java 8
Streams, Function Interface, Threading, CompletableFuture…
21 Java 8 - Emulador GameBoy DMG 01 / Homebrew
/**
* Returns whether all elements of this stream match the provided predicate
* @throws Exception
*/
@Test
public void allMatch() throws Exception {
final boolean result = IntStream.of(0, 1, 2, 3, 4, 5, 6)
.allMatch(value -> value % 1 == 0);
Assert.assertTrue(result);
}
27 Java 8 - Streams { reduce }
/** Performs a reduction on the elements of this stream, using an associative accumulation
* function, and returns an Optional describing the reduced value, if any.
* @throws Exception
*/
@Test
public void reduce() throws Exception {
final int expected = 789;
final int result = Arrays.asList(18, 19, 29, 23, 43, 266, 789)
.stream()
.reduce((p1, p2) -> p1 > p2 ? p1 : p2)
.get();
Assert.assertTrue(expected == result);
}
28 Java 8 - Creando nuestra programación funcional
▹ Package java.utils.Functions
▸ Function <T,R>, BiFunction <T,U,R>
▸ Consumer <T>, BiConsumer <T,U>
▸ Predicate <T>, BiPredicate <T,U>
▸ Supplier <T>
▸ BinaryOperation <T>
▸ UnaryOperation <T>
▹ @Functional Interface
29 Java 8 - Creando nuestra programación funcional 1/2
/**
* Expresión Lambda que suma un incremento de +1
* @throws Exception
*/
Function<Integer,Integer> add1 = x -> x + 1;
@Test
public void addTest() throws Exception {
final int expected = 2;
final int result = add1.apply(1);
Assert.assertTrue(expected == result);
}
30 Java 8 - Creando nuestra programación funcional 2/2
/**
* Expresión Lambda que implementa la suma de un operador
* @throws Exception
*/
BinaryOperation<Integer> sum = (x,y) -> x + y;
@Test
public void sumTest() throws Exception {
final int expected = 4;
final int result = sum.apply(1,3);
Assert.assertTrue(expected == result);
}
31 Java 8 - Migrando OOP a FP
/**
* Clase que suma un incremento de +2
* @throws Exception
*/
public class Utils { public static Integer add2(Integer x) { return x + 2; } }
@Test
public void addTest() throws Exception {
final int expected = 4;
final int result = add2.apply(2);
Assert.assertTrue(expected == result);
}
32 Java 8 - Functional Interface
/**
* Interface que checkea un enumerado de tipo checkeable
* @throws Exception
*/
@FunctionalInterface
public interface ICheck {
Boolean check(Checkeable c);
}
@Test
public void composeTest() throws Exception {
final ICheck newChecker = c -> c.toString().equals("COMPLETED");
final boolean result = newChecker.check(CheckEnum.FINISHED);
Assert.assertNotEquals(CheckEnum.COMPLETED, result);
}
33 Java 8 - Ejemplo de uso - Scanlines Horizontal w/576i Emu GameBoy
34 Java 8 - Ejemplo de uso - Scanlines Horizontal w/576i Emu GameBoy
35 Java 8 - Ejemplo de uso - Scanlines Horizontal w/576i Emu GameBoy
▹ Proceso Concurrente
▹ Productor y Consumidor de Imágenes
▹ Recorrido, filtrado y reducciones con Streams
▹ Uso de variables ‘volatiles’ en contexto Threading
36 Java 8 - Programación Asíncrona
▹ Thread - Runnable
▹ Executors
▹ Callables - Futures
▹ Scheduled Executors
▹ CompletableFuture (Patrón Promesa)
▸ CompletableStage
▸ Future
37 Java 8 - Threads y Runnables
System.out.println("Done!");
… eq
System.out.println("Done! "+executor.isTerminated());
39 Java 8 - Callable y Futures
** Copia de SleepyWings
47 C# - Ejemplo de uso ‘Cube Line Match 3’
▹ Delegados
▸ Func<in T, out T>
▸ Action<in T>
▸ Predicate<in T>
▹ Lambdas
▸ Compile-time duck typing (dynamic keyword)
▹ Linq Queries
50 C# - Func<in T… , out TResult>
dividir(num1, num2);
}
52 C# - Predicate<in T… ,out Boolean>
-eq
return tcs.Task;
}
59 C# - Task & Patrón Asíncronos basado en Eventos (EAP)
wc.DownloadStringAsync(url);
return tcs.Task;
}
▹ Async es un modificador que permite establecer o modificar la firma
de un método formal, una expresión lambda, o un método anónimo
para que sea tratado como un método asíncrono.
60
”
Nota: Declarar un método como async es requisito indispensable para poder usar await.
61 C# - Mejores Prácticas con Task.Run<T>
});
}
return default(T)
}
64 Unitor - Micro Framework para Unity 2D/3D
▹ Lambdas
▸ Compile-time duck typing
▹ std::function
▸ Programación funcional abstracta
▸ Run-time duck typing
69 C/C++ - Estructura Lambdas
int main() {
auto print = [] () { cout << "Hello world"; };
auto print2 = [] () { return 1; } //Infiere la salida el compilador
auto print3 = [] () -> int { return 1; } // Imponemos el tipo de salida
print();
print2();
print3();
Foo f;
f.func();
}
72 C/C++ - std::function
#include <iostream>
#include <functional>
using namespace std;
int main() {
std::function<void()> foo;
cout << "sizeof(f) == " << sizeof(f) << endl;
foo = global_f;
foo();
Functor functor;
foo= functor;
foo();
}
73 C/C++ - Programación concurrente con ppltask.h
▹ Concurrency::task
▸ Encadena múltiples operaciones sincrónicas y asincrónicas
▸ Administra excepciones
▸ Realizar cancelaciones
▸ Garantizar que las tareas individuales se ejecuten en el contexto o
contenedor de subproceso apropiado
74 C/C++ - Consumiendo Op Async con Tareas
#include <ppltasks.h>
using namespace concurrency;
using namespace Windows::Devices::Enumeration;
void App::TestAsync()
{
IAsyncOperation<DeviceInformationCollection^>^ deviceOp = DeviceInformation::FindAllAsync();
#include <ppltasks.h>
using namespace concurrency;
using namespace Windows::Storage;
getFileTask
.then([](StorageFile^ storageFileSample) ->IAsyncAction^ {
return storageFileSample->DeleteAsync();
})
.then([](void) {
OutputDebugString(L"File deleted.");
});
}
76 C/C++ - Cancelación de Tareas
#include <ppltasks.h>
using namespace concurrency;
using namespace Windows::Storage;
getFileTask
.then([](StorageFile^ storageFileSample) ->IAsyncAction^ {
m_fileTaskTokenSource.cancel();
return storageFileSample->DeleteAsync();
})
.then([](void) {
OutputDebugString(L"File deleted."); -> este bloque ya no se ejecutará xq hemos cancelado la tarea
});
77 C/C++ - Control de Errores con Tareas
#include <ppltasks.h>
using namespace Windows::Storage;
using namespace concurrency;
void App::DeleteWithTasksHandleErrors(String^ fileName)
{
StorageFolder^ documentsFolder = KnownFolders::DocumentsLibrary;
auto getFileTask = create_task(documentsFolder->GetFileAsync(fileName));
getFileTask.then([](StorageFile^ storageFileSample) {
return storageFileSample->DeleteAsync();
})
.then([](task<void> t) {
try {
t.get();
OutputDebugString(L"File deleted.");
}
catch (Platform::COMException^ e) {
OutputDebugString(e->Message->Data());
}
}); }
78 C/C++ - Calling Haskell / Cpphs
▹ Promesa nativas de JS
▹ Timer Task
▹ Tweens
83 Scala y Kotlin - Programación Asíncrona
▹ Threads
▹ Futures
▹ Async/await
▹ Coroutines
84 Kotlin - Kotlin Koans
85 Scala - Programming in Scala First Edition
2. Functional Programming
86
Haskell
88
”
89 Haskell
▹ Lazy Evaluation
▹ Pattern Matching
▹ Type classes
▹ Funciones de primer orden
▹ Monads
▹ Recursividad
▹ Modules
90 Haskell - Programación asíncrona
▹ Control.Concurrent.Async 2.1.0
▸ Spawning con automatic cancellation
▸ Querying Async
▸ STM operations
▸ Waiting for multiple Async
▸ Linking
91 Haskell - Combine Task
main = do
fut <- fork combineTask
n <- fut
print n
92 Haskell - Async wait
import Control.Concurrent.Async
…
asyncWait :: Assertion
asyncWait = do
a <- async (return value)
r <- wait a
assertEqual "async_wait" r value
93 Haskell - Async poll
import Control.Concurrent.Async
…
asyncPoll :: Assertion
asyncPoll = do
a <- async (threadDelay 500000)
r <- poll a
when (isJust r) $ assertFailure ""
r <- poll a
when (isJust r) $ assertFailure ""
F#
95 F#
▹ Declaración Imperativa
▹ Lazy Evaluation a través de keyword (lazy)
▹ Pattern Matching
▹ Quoted Expression
▹ Funciones de primer orden
▹ Interoperabilidad con .Net
▹ Recursividad (Tail)
96 F# - Programación asincrona
▹ Clásico
▸ Thread, AutoResetEvent, BackgroundWorker y IAsyncResult
▹ Asynchronous workflows
▸ Async
▸ Async.RunSynchronously
▸ Async.Parallel
97 F# - AutoResetEvent
open System
let userTimerWithCallback =
let fileWriteWithAsync =
Async.RunSynchronously async
Async.RunSynchronously sleepWorkflow
100 F# - Async.Parallel
#time
[sleep1; sleep2]
|> Async.Parallel
|> Async.RunSynchronously
#time
Conclusiones
101
102 Beneficios aportados por la programación asíncrona
▹ Código desarrollado
▸ Entendimiento
▸ Acoplamiento
▸ Mantenibilidad
▸ Dificultad de debuggear
104 Beneficios de la programación funcional
106
Referencias
107
108 Referencias
▹ https://github.com/vicboma1/Java8-Stream
▹ https://www.todojs.com/programacion-asincrona-paso-de-continuadores-eventos-pro
mesas-y-generadores/
▹ http://itpn.mx/recursosisc/4semestre/topicosavanzados/Unidad%20IV.pdf
▹ http://elmanantialdebits.blogspot.com.es/2013/08/que-es-eso-de-la-programacion-asi
ncrona.html
▹ http://concurrenteparalela.blogspot.com.es/2012/11/caracteristicas-programacion.ht
ml
▹ http://www.depi.itchihuahua.edu.mx/apacheco/lengs/paralelo/index.html
▹ http://www.johndcook.com/blog/2010/11/03/object-oriented-vs-functional-programmi
ng
▹ https://msdn.microsoft.com/en-us/magazine/jj991977.aspx?tduid=(a46d0d465c0b3794
7c4a3901d32004e2)(256380)(2459594)(TnL5HPStwNw-mIXzBM2g9PT4zCIuyzsidQ)()
109 Referencias
▹ https://dzone.com/articles/functional-programming-java-8
▹ http://www.drdobbs.com/jvm/lambda-expressions-in-java-8/240166764
▹ http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-exa
mples/
▹ http://zeroturnaround.com/rebellabs/why-the-debate-on-object-oriented-vs-functiona
l-programming-is-all-about-composition/
▹ https://msdn.microsoft.com/es-es/library/mt674882.aspx
▹ http://es.slideshare.net/JeffHart6/async-await-46060988
▹ https://msdn.microsoft.com/es-es/library/jj130730.aspx
▹ https://www.microsoft.com/en-us/download/confirmation.aspx?id=19957
▹ http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11
110 Referencias
▹ https://msdn.microsoft.com/es-es/windows/uwp/threading-async/asynchronous-progr
amming-in-cpp-universal-windows-platform-apps
▹ https://blog.risingstack.com/introduction-to-koa-generators/
▹ https://www.npmjs.com/package/async
▹ https://github.com/promises-aplus
▹ https://github.com/vicboma1/C-Sharp-Promise
▹ https://msdn.microsoft.com/es-es/library/bb397687.aspx
▹ http://www.adobe.com/support/documentation/en/flex/1/mixin/mixin2.html#118542
▹ http://slides.com/juanramb/promesas-en-javascrip
▹ https://usingstdcpp.files.wordpress.com/2014/12/introduccic3b3n-a-la-programacic3b
3n-funcional-en-c.pdf
▹ https://gobyexample.com
111 Java 8 - Rom Hacking <- Video