Skip to content

Commit 84f7ab8

Browse files
translation: It would close iluwatar#2479 and iluwatar#2481 (iluwatar#2480)
* Translate: Translate the aggregator-microservices readme to Spanish [Issue iluwatar#2335 (Task of issue iluwatar#2277 )] * Translate: Translate the aggregator-microservices readme to Spanish [Issue iluwatar#2335 (Task of issue iluwatar#2277 )] * Update README.md * Restored translated YAML Frontmatter keys to right words not translated and minor new changes Minor new changes are at YAML Frontmatter variables values of lines 2 and 3 where have switched the order of translated words to homogeinize the belowing structure of that order like figured at following lines 6,7 and 8 (First english term and then Spanish translation between parenthesis) * Update localization/es/aggregator-microservices/README.md Co-authored-by: Ilkka Seppälä <[email protected]> * Update localization/es/aggregator-microservices/README.md Co-authored-by: Ilkka Seppälä <[email protected]> * Update localization/es/aggregator-microservices/README.md Co-authored-by: Ilkka Seppälä <[email protected]> * Update localization/es/aggregator-microservices/README.md Co-authored-by: Ilkka Seppälä <[email protected]> * Update localization/es/aggregator-microservices/README.md Co-authored-by: Ilkka Seppälä <[email protected]> * Translated ambassador pattern README.md to Spanish(iluwatar#2453) * Changed Class Diagram image path to absolute way. The original path for Class Diagram image was relative to /ambassador folder (./etc/ambassador.urm.png) when translated at line 173 of translation doesn't show the diagram image so I haved changed it to absolute format (/ambassador/etc/ambassador.urm.png) and now it shows it. * Added arrange-act-assert folder with README file without being traslated yet * Translated line by line to spanish. English lines left for review, will be removed on next commit inmediately. * Translated arrange-act-assert/README.md to Spanish and removed the English version text lines. * Changed language tag value from en to es * async-method-invocation translated to Spanish. Left the original English version lines for review and will be removed in next commit inmediately. * async-method-invocation transalation to spanish. Removed the english version after review. --------- Co-authored-by: Ilkka Seppälä <[email protected]>
1 parent a612387 commit 84f7ab8

File tree

2 files changed

+308
-0
lines changed

2 files changed

+308
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
---
2+
title: Arrange/Act/Assert
3+
category: Idiom
4+
language: es
5+
tag:
6+
- Testing
7+
---
8+
9+
## También conocido como
10+
11+
Dado/Cuando/Entonces
12+
13+
## Intención
14+
15+
Arrange/Act/Assert (AAA) es un patrón para organizar UnitTests.
16+
Divide las UnitTests en tres pasos claros y diferenciados:
17+
18+
1. Arrange(Organizar): Realiza la configuración y la inicialización necesarias para el test.
19+
2. Act(Actuar): Toma las medidas necesarias para el test.
20+
3. Assert(Afirmar): Verifica los resultados del test.
21+
22+
## Explicacación
23+
24+
Este patrón tiene varios beneficios significativos. Crea una clara separación entre la configuración, operaciones y resultados de un test. Esta estructura hace que el código sea más fácil de leer y comprender. Si
25+
colocas los pasos en orden y formateas su código para separarlos, puedes escanear un test y
26+
comprender rápidamente lo que hace.
27+
28+
También impone un cierto grado de disciplina cuando escribes tus UnitTests. Tienes que visualizar
29+
claramente los tres pasos que tu test realizará. Esto hace que los tests sean más intuitivos de escribir a la vez que tienes presente un esquema.
30+
31+
Ejemplo cotidiano
32+
33+
> Necesitamos escribir un conjunto de UnitTests completo y claro para una clase.
34+
35+
En otras palabras
36+
37+
> Arrange/Act/Assert es un patrón de testeo que organiza las pruebas en tres pasos claros para facilitar su
38+
> mantenimiento.
39+
40+
WikiWikiWeb dice
41+
42+
> Arrange/Act/Assert es un patrón para organizar y dar formato al código en los métodos UnitTest.
43+
44+
**Código de ejemplo**
45+
46+
Veamos primero nuestra clase `Cash` para que sea testeada.
47+
48+
```java
49+
public class Cash {
50+
51+
private int amount;
52+
53+
Cash(int amount) {
54+
this.amount = amount;
55+
}
56+
57+
void plus(int addend) {
58+
amount += addend;
59+
}
60+
61+
boolean minus(int subtrahend) {
62+
if (amount >= subtrahend) {
63+
amount -= subtrahend;
64+
return true;
65+
} else {
66+
return false;
67+
}
68+
}
69+
70+
int count() {
71+
return amount;
72+
}
73+
}
74+
```
75+
76+
Luego escribimos nuestras UnitTests en función del patrón Arrange/Act/Assert. Note claramente la separación de los pasos para cada UnitTest.
77+
78+
```java
79+
class CashAAATest {
80+
81+
@Test
82+
void testPlus() {
83+
//Arrange
84+
var cash = new Cash(3);
85+
//Act
86+
cash.plus(4);
87+
//Assert
88+
assertEquals(7, cash.count());
89+
}
90+
91+
@Test
92+
void testMinus() {
93+
//Arrange
94+
var cash = new Cash(8);
95+
//Act
96+
var result = cash.minus(5);
97+
//Assert
98+
assertTrue(result);
99+
assertEquals(3, cash.count());
100+
}
101+
102+
@Test
103+
void testInsufficientMinus() {
104+
//Arrange
105+
var cash = new Cash(1);
106+
//Act
107+
var result = cash.minus(6);
108+
//Assert
109+
assertFalse(result);
110+
assertEquals(1, cash.count());
111+
}
112+
113+
@Test
114+
void testUpdate() {
115+
//Arrange
116+
var cash = new Cash(5);
117+
//Act
118+
cash.plus(6);
119+
var result = cash.minus(3);
120+
//Assert
121+
assertTrue(result);
122+
assertEquals(8, cash.count());
123+
}
124+
}
125+
```
126+
127+
## Aplicabilidad
128+
129+
Utilice el patrón Arrange/Act/Asert cuando
130+
131+
* Necesites estructurar tus UnitTests para que sean más fáciles de leer, mantener y mejorar.
132+
133+
## Créditos
134+
135+
* [Arrange, Act, Assert: ¿Qué son las pruebas AAA?](https://blog.ncrunch.net/post/arrange-act-assert-aaa-testing.aspx)
136+
* [Bill Wake: 3A – Arrange, Act, Assert](https://xp123.com/articles/3a-arrange-act-assert/)
137+
* [Martin Fowler: DadoCuandoEntonces](https://martinfowler.com/bliki/GivenWhenThen.html)
138+
* [Patrones de prueba xUnit: Refactorizando Código de prueba](https://www.amazon.com/gp/product/0131495054/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0131495054&linkId=99701e8f4af2f63d0bcf50)
139+
* [Principios, prácticas y patrones UnitTesting](https://www.amazon.com/gp/product/1617296279/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617296279&linkId=74c75cfae3a5a)accae3a5a)
140+
* [Desarrollo basado en pruebas: Ejemplo](https://www.amazon.com/gp/product/0321146530/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0321146530&linkId=5c63a93d8c1175b47caef50875)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
---
2+
title: Async Method Invocation
3+
category: Concurrency
4+
language: es
5+
tag:
6+
- Reactive
7+
---
8+
9+
## Propósito
10+
11+
Asynchronous method invocation (invocación de método asincrónico) es un patrón con el que el hilo o subproceso de llamada
12+
no se bloquea mientras espera resultados. El patrón proporciona pocesamiento en paralelo de múltiples tareas independientes y recupera los resultados a través de
13+
devoluciones de llamada (callbacks) o esperando hasta que termine el procedimiento.
14+
15+
## Explicación
16+
17+
Ejemplo cotidiano
18+
19+
> Lanzar cohetes espaciales es un negocio apasionante. El comandante de la misión da la orden de lanzamiento y
20+
> después de un tiempo indeterminado, el cohete se lanza con éxito o falla miserablemente.
21+
22+
En otras palabras
23+
24+
> La invocación del método asíncrono inicia el procedimiento y vuelve inmediatamente antes de que la tarea termine
25+
> Los resultados del procedimiento se devuelven a la llamada posteriormente (callback).
26+
27+
Según Wikipedia
28+
29+
> En la programación multiproceso, la invocación de método asíncrono (AMI), también conocida como
30+
> llamadas de método asíncrono o el patrón asíncrono es un patrón de diseño en el que el lugar de la llamada
31+
> no se bloquea mientras espera que termine el código llamado. En cambio, el hilo de llamada es
32+
> notificado cuando llega la respuesta. Sondear para obtener una respuesta es una opción no deseada.
33+
34+
**Ejemplo programático**
35+
36+
En este ejemplo, estamos lanzando cohetes espaciales y desplegando vehículos lunares.
37+
38+
La aplicación demuestra lo que hace el patrón de invocación del método asíncrono. Las partes clave del patrón son
39+
`AsyncResult` que es un contenedor intermedio para un valor evaluado de forma asíncrona,
40+
`AsyncCallback` que se puede proporcionar para que se ejecute al finalizar la tarea y `AsyncExecutor` que
41+
gestiona la ejecución de las tareas asíncronas.
42+
43+
```java
44+
public interface AsyncResult<T> {
45+
boolean isCompleted();
46+
T getValue() throws ExecutionException;
47+
void await() throws InterruptedException;
48+
}
49+
```
50+
51+
```java
52+
public interface AsyncCallback<T> {
53+
void onComplete(T value, Optional<Exception> ex);
54+
}
55+
```
56+
57+
```java
58+
public interface AsyncExecutor {
59+
<T> AsyncResult<T> startProcess(Callable<T> task);
60+
<T> AsyncResult<T> startProcess(Callable<T> task, AsyncCallback<T> callback);
61+
<T> T endProcess(AsyncResult<T> asyncResult) throws ExecutionException, InterruptedException;
62+
}
63+
```
64+
65+
`ThreadAsyncExecutor` es una implementación de `AsyncExecutor`. Se destacan algunas de sus partes clave a continuación.
66+
67+
```java
68+
public class ThreadAsyncExecutor implements AsyncExecutor {
69+
70+
@Override
71+
public <T> AsyncResult<T> startProcess(Callable<T> task) {
72+
return startProcess(task, null);
73+
}
74+
75+
@Override
76+
public <T> AsyncResult<T> startProcess(Callable<T> task, AsyncCallback<T> callback) {
77+
var result = new CompletableResult<>(callback);
78+
new Thread(
79+
() -> {
80+
try {
81+
result.setValue(task.call());
82+
} catch (Exception ex) {
83+
result.setException(ex);
84+
}
85+
},
86+
"executor-" + idx.incrementAndGet())
87+
.start();
88+
return result;
89+
}
90+
91+
@Override
92+
public <T> T endProcess(AsyncResult<T> asyncResult)
93+
throws ExecutionException, InterruptedException {
94+
if (!asyncResult.isCompleted()) {
95+
asyncResult.await();
96+
}
97+
return asyncResult.getValue();
98+
}
99+
}
100+
```
101+
102+
Ahora está todo preparado para lanzar algunos cohetes y así poder ver cómo funciona todo.
103+
104+
```java
105+
public static void main(String[] args) throws Exception {
106+
// construye un nuevo objeto executor que ejecutará tareas asíncronas
107+
var executor = new ThreadAsyncExecutor();
108+
109+
// inicia algunas tareas asíncronas con diferentes tiempos de procesamiento, las dos últimas con controladores de devolución de llamada
110+
final var asyncResult1 = executor.startProcess(lazyval(10, 500));
111+
final var asyncResult2 = executor.startProcess(lazyval("test", 300));
112+
final var asyncResult3 = executor.startProcess(lazyval(50L, 700));
113+
final var asyncResult4 = executor.startProcess(lazyval(20, 400), callback("Desplegando el rover lunar"));
114+
final var asyncResult5 =
115+
executor.startProcess(lazyval("devolución de llamada callback", 600), callback("Desplegando el rover lunar"));
116+
117+
// emula el procesamiento en el hilo o subproceso actual mientras las tareas asíncronas se ejecutan en sus propios hilos o subprocesos
118+
Subproceso.dormir(350); // Oye, estamos trabajando duro aquí
119+
log("El comandante de la misión está bebiendo café");
120+
121+
// espera a que se completen las tareas
122+
final var result1 = executor.endProcess(asyncResult1);
123+
final var result2 = executor.endProcess(asyncResult2);
124+
final var result3 = executor.endProcess(asyncResult3);
125+
asyncResult4.await();
126+
asyncResult5.await();
127+
128+
// registra los resultados de las tareas, las devoluciones de las llamadas se registran inmediatamente cuando se completan
129+
log("Cohete espacial <" + resultado1 + "> ha completado su lanzamiento");
130+
log("Cohete espacial <" + resultado2 + "> ha completado su lanzamiento");
131+
log("Cohete espacial <" + result3 + "> ha completado su lanzamiento");
132+
}
133+
```
134+
135+
Aquí está la salida de la consola del programa.
136+
137+
```java
138+
21:47:08.227 [executor-2] INFO com.iluwatar.async.method.invocation.App - Cohete espacial <prueba> lanzado con éxito
139+
21:47:08.269 [main] INFO com.iluwatar.async.method.invocation.App - El comandante de la misión está bebiendo café
140+
21:47:08.318 [executor-4] INFO com.iluwatar.async.method.invocation.App - Cohete espacial <20> lanzado con éxito
141+
21:47:08.335 [executor-4] INFO com.iluwatar.async.method.invocation.App Desplegando el rover lunar <20>
142+
21:47:08.414 [executor-1] INFO com.iluwatar.async.method.invocation.App - Cohete espacial <10> lanzado con éxito
143+
21:47:08.519 [executor-5] INFO com.iluwatar.async.method.invocation.App - Cohete espacial <devolución de llamada callback> lanzado con éxito
144+
21:47:08.519 [executor-5] INFO com.iluwatar.async.method.invocation.App - Implementando el vehículo lunar <devolución de llamada callback>
145+
21:47:08.616 [executor-3] INFO com.iluwatar.async.method.invocation.App - Cohete espacial <50> lanzado con éxito
146+
21:47:08.617 [main] INFO com.iluwatar.async.method.invocation.App - Lanzamiento del cohete espacial <10> completado
147+
21:47:08.617 [main] INFO com.iluwatar.async.method.invocation.App - Lanzamiento de cohete espacial <prueba> completado
148+
21:47:08.618 [main] INFO com.iluwatar.async.method.invocation.App - Lanzamiento del cohete espacial <50> completado
149+
```
150+
151+
# Diagrama de clase
152+
153+
![texto alternativo](./etc/async-method-invocation.png "Invocación de método asíncrono")
154+
155+
## Aplicabilidad
156+
157+
Utiliza el patrón de invocación del método asíncrono cuando
158+
159+
* Tienes múltiples tareas independientes que pueden ejecutarse en paralelo
160+
* Necesitas mejorar el desempeño de un grupo de tareas secuenciales
161+
* Tienes una cantidad limitada de capacidad de procesamiento o tareas de ejecución prolongada y la llamada no debe esperar a que las tareas estén listas
162+
163+
## Ejemplos cotidianos
164+
165+
* [FutureTask](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/FutureTask.html)
166+
* [CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html)
167+
* [ExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html)
168+
* [Patrón asíncrono basado en tareas](https://msdn.microsoft.com/en-us/library/hh873175.aspx)

0 commit comments

Comments
 (0)