Skip to content

Commit ea62815

Browse files
translation(#2277): add spanish translation to balking pattern (#2656)
1 parent 01aba88 commit ea62815

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed

localization/es/balking/README.md

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
---
2+
title: Balking
3+
category: Concurrency
4+
language: es
5+
tag:
6+
- Decoupling
7+
---
8+
9+
## Propósito
10+
11+
El patrón _Balking_ se utiliza para prevenir que un objeto ejecute un código determinado si
12+
este se encuentra en un estado incompleto o inapropiado.
13+
14+
## Explicación
15+
16+
Ejemplo del mundo real
17+
18+
> En una lavadora hay un botón de arranque para iniciar el lavado de ropa. Cuando la lavadora
19+
> está inactiva el botón funciona como se espera, pero si ya está lavando entonces el botón no hace
20+
> nada.
21+
22+
En otras palabras
23+
24+
> Usando el patrón _Balking_, un código determinado se ejecuta solo si el objeto está en un estado concreto.
25+
26+
Wikipedia dice
27+
28+
> El patrón _Balking_ es un patrón de diseño de software que ejecuta una acción en un objeto solamente cuando
29+
> el objeto está en un estado concreto. Por ejemplo, si un objeto lee archivos ZIP y un método de llamada
30+
> invoca un método _get_ en el objeto cuando el archivo ZIP no está abierto, el objeto "rechazaría" (_balk_)
31+
> la petición.
32+
33+
**Ejemplo Programático**
34+
35+
En este ejemplo de implementación, `WashingMachine` es un objeto que tiene dos estados los cuales pueden
36+
ser: _ENABLED_ y _WASHING_ (ACTIVADA y LAVANDO respectivamente). Si la máquina está _ENABLED_, el estado
37+
cambia a _WASHING_ usando un método thread-safe a prueba de hilos. Por otra parte, si ya está lavando y
38+
cualquier otro hilo ejecuta `wash()` entonces no hará ningún cambio de estado y finalizará la ejecución del
39+
método sin hacer nada.
40+
41+
Aquí están las partes relevantes de la clase `WashingMachine`.
42+
43+
```java
44+
@Slf4j
45+
public class WashingMachine {
46+
47+
private final DelayProvider delayProvider;
48+
private WashingMachineState washingMachineState;
49+
50+
public WashingMachine(DelayProvider delayProvider) {
51+
this.delayProvider = delayProvider;
52+
this.washingMachineState = WashingMachineState.ENABLED;
53+
}
54+
55+
public WashingMachineState getWashingMachineState() {
56+
return washingMachineState;
57+
}
58+
59+
public void wash() {
60+
synchronized (this) {
61+
var machineState = getWashingMachineState();
62+
LOGGER.info("{}: Actual machine state: {}", Thread.currentThread().getName(), machineState);
63+
if (this.washingMachineState == WashingMachineState.WASHING) {
64+
LOGGER.error("Cannot wash if the machine has been already washing!");
65+
return;
66+
}
67+
this.washingMachineState = WashingMachineState.WASHING;
68+
}
69+
LOGGER.info("{}: Doing the washing", Thread.currentThread().getName());
70+
this.delayProvider.executeAfterDelay(50, TimeUnit.MILLISECONDS, this::endOfWashing);
71+
}
72+
73+
public synchronized void endOfWashing() {
74+
washingMachineState = WashingMachineState.ENABLED;
75+
LOGGER.info("{}: Washing completed.", Thread.currentThread().getId());
76+
}
77+
}
78+
```
79+
80+
Aquí la sencilla interfaz `DelayProvider` utilizada por `WashingMachine`.
81+
82+
```java
83+
public interface DelayProvider {
84+
void executeAfterDelay(long interval, TimeUnit timeUnit, Runnable task);
85+
}
86+
```
87+
88+
Ahora introducimos la aplicación utilizando `WashingMachine`.
89+
90+
```java
91+
public static void main(String... args) {
92+
final var washingMachine = new WashingMachine();
93+
var executorService = Executors.newFixedThreadPool(3);
94+
for (int i = 0; i < 3; i++) {
95+
executorService.execute(washingMachine::wash);
96+
}
97+
executorService.shutdown();
98+
try {
99+
executorService.awaitTermination(10, TimeUnit.SECONDS);
100+
} catch (InterruptedException ie) {
101+
LOGGER.error("ERROR: Waiting on executor service shutdown!");
102+
Thread.currentThread().interrupt();
103+
}
104+
}
105+
```
106+
107+
Aquí está la salida en consola de la aplicación.
108+
109+
```
110+
14:02:52.268 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-2: Actual machine state: ENABLED
111+
14:02:52.272 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-2: Doing the washing
112+
14:02:52.272 [pool-1-thread-3] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-3: Actual machine state: WASHING
113+
14:02:52.273 [pool-1-thread-3] ERROR com.iluwatar.balking.WashingMachine - Cannot wash if the machine has been already washing!
114+
14:02:52.273 [pool-1-thread-1] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-1: Actual machine state: WASHING
115+
14:02:52.273 [pool-1-thread-1] ERROR com.iluwatar.balking.WashingMachine - Cannot wash if the machine has been already washing!
116+
14:02:52.324 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - 14: Washing completed.
117+
```
118+
119+
## Diagrama de clases
120+
121+
![alt text](../../../balking/etc/balking.png "Balking")
122+
123+
## Aplicabilidad
124+
125+
Usa el patrón _Balking_ cuando
126+
127+
* Un objeto debe ejecutar un código determinado sólo cuando se encuentra en un estado concreto.
128+
* Los objetos están en un estado que es propenso a bloquearse temporalmente, pero durante una cantidad de tiempo indeterminada.
129+
130+
## Patrones relacionados
131+
132+
* [Guarded Suspension Pattern](https://java-design-patterns.com/patterns/guarded-suspension/)
133+
* [Double Checked Locking Pattern](https://java-design-patterns.com/patterns/double-checked-locking/)
134+
135+
## Referencias
136+
137+
* [Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML, 2nd Edition, Volume 1](https://www.amazon.com/gp/product/0471227293/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0471227293&linkId=0e39a59ffaab93fb476036fecb637b99)

0 commit comments

Comments
 (0)