Skip to content

Commit 5f6cb01

Browse files
committed
#24 - java, javascript, php y typescript
1 parent da67532 commit 5f6cb01

File tree

4 files changed

+479
-0
lines changed

4 files changed

+479
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
* TEORÍA DE DECORADORES (ANOTACIONES) EN JAVA
3+
*
4+
* En Java, los decoradores se llaman "anotaciones" y se definen usando @interface.
5+
* Las anotaciones permiten añadir metadatos a:
6+
* - Clases
7+
* - Métodos
8+
* - Campos
9+
* - Parámetros
10+
*
11+
* Características principales:
12+
* - Se definen con @interface
13+
* - Pueden tener elementos con valores por defecto
14+
* - Se procesan en tiempo de compilación o ejecución
15+
* - Se pueden consultar mediante Reflection
16+
*/
17+
18+
import java.lang.annotation.*;
19+
import java.lang.reflect.*;
20+
21+
// Definición del decorador para clases
22+
@Retention(RetentionPolicy.RUNTIME)
23+
@Target(ElementType.TYPE)
24+
@interface LogClass {
25+
String value() default ""; // Mensaje personalizado
26+
}
27+
28+
// Definición del decorador para métodos
29+
@Retention(RetentionPolicy.RUNTIME)
30+
@Target(ElementType.METHOD)
31+
@interface LogMethod {
32+
String value() default ""; // Mensaje personalizado
33+
}
34+
35+
// Definición del decorador contador para el ejercicio extra
36+
@Retention(RetentionPolicy.RUNTIME)
37+
@Target(ElementType.METHOD)
38+
@interface ContadorLlamadas {
39+
}
40+
41+
public class eulogioep {
42+
// Clase principal que contiene el método main
43+
public static void main(String[] args) {
44+
try {
45+
System.out.println("=== Pruebas de los decoradores ===");
46+
47+
// Prueba del decorador de clase
48+
Ejemplo ejemplo = new Ejemplo();
49+
procesarDecoradoresClase(ejemplo.getClass());
50+
51+
// Prueba del decorador de método
52+
ejemplo.saludar("Java");
53+
54+
// Prueba del decorador contador
55+
Calculadora calc = new Calculadora();
56+
System.out.println("Resultado suma: " + calc.sumar(5, 3)); // Primera llamada
57+
System.out.println("Resultado suma: " + calc.sumar(2, 4)); // Segunda llamada
58+
System.out.println("Resultado multiplicación: " + calc.multiplicar(3, 4)); // Primera llamada
59+
System.out.println("Resultado suma: " + calc.sumar(1, 1)); // Tercera llamada
60+
61+
} catch (Exception e) {
62+
e.printStackTrace();
63+
}
64+
}
65+
66+
// Clase de ejemplo con decoradores
67+
@LogClass("Esta es una clase de ejemplo")
68+
static class Ejemplo {
69+
@LogMethod("Método de saludo")
70+
public String saludar(String nombre) {
71+
return "¡Hola " + nombre + "!";
72+
}
73+
}
74+
75+
// Clase Calculadora con el decorador contador
76+
static class Calculadora {
77+
private static java.util.Map<String, Integer> contadores = new java.util.HashMap<>();
78+
79+
@ContadorLlamadas
80+
public int sumar(int a, int b) {
81+
contarLlamada("sumar");
82+
return a + b;
83+
}
84+
85+
@ContadorLlamadas
86+
public int multiplicar(int a, int b) {
87+
contarLlamada("multiplicar");
88+
return a * b;
89+
}
90+
91+
private void contarLlamada(String metodo) {
92+
int contador = contadores.getOrDefault(metodo, 0) + 1;
93+
contadores.put(metodo, contador);
94+
System.out.println("El método " + metodo + " ha sido llamado " + contador + " veces");
95+
}
96+
}
97+
98+
// Método para procesar decoradores de clase
99+
private static void procesarDecoradoresClase(Class<?> clase) {
100+
if (clase.isAnnotationPresent(LogClass.class)) {
101+
LogClass anotacion = clase.getAnnotation(LogClass.class);
102+
System.out.println("Clase creada: " + clase.getSimpleName() +
103+
" - Mensaje: " + anotacion.value());
104+
}
105+
}
106+
107+
// Método para procesar decoradores de método
108+
private static void procesarDecoradoresMetodo(Method metodo) {
109+
if (metodo.isAnnotationPresent(LogMethod.class)) {
110+
LogMethod anotacion = metodo.getAnnotation(LogMethod.class);
111+
System.out.println("Método llamado: " + metodo.getName() +
112+
" - Mensaje: " + anotacion.value());
113+
}
114+
}
115+
116+
// Procesador de aspectos (simulado con Reflection)
117+
static {
118+
// Interceptamos los métodos con decoradores usando Reflection
119+
try {
120+
Method[] metodos = Ejemplo.class.getDeclaredMethods();
121+
for (Method metodo : metodos) {
122+
if (metodo.isAnnotationPresent(LogMethod.class)) {
123+
// Aquí normalmente usaríamos un framework como AspectJ
124+
// Esta es una simulación simplificada
125+
procesarDecoradoresMetodo(metodo);
126+
}
127+
}
128+
} catch (Exception e) {
129+
e.printStackTrace();
130+
}
131+
}
132+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/*
2+
* TEORÍA DE DECORADORES EN JAVASCRIPT
3+
*
4+
* Los decoradores son funciones especiales que pueden modificar el comportamiento
5+
* de clases, métodos y propiedades. En JavaScript, son una característica que
6+
* permite añadir funcionalidad adicional de manera declarativa.
7+
*
8+
* Tipos principales de decoradores:
9+
* 1. Decoradores de clase
10+
* 2. Decoradores de método
11+
* 3. Decoradores de propiedad
12+
*
13+
* Para usar decoradores necesitas:
14+
* 1. Un entorno que soporte la sintaxis de decoradores (Node.js moderno o Babel)
15+
* 2. Configurar el compilador para soportar decoradores
16+
*/
17+
18+
// Ejemplo 1: Decorador de clase
19+
function logClass(target) {
20+
// Este decorador registra cuando se crea una instancia de la clase
21+
console.log(`Clase creada: ${target.name}`);
22+
return target;
23+
}
24+
25+
// Ejemplo 2: Decorador de método
26+
function logMethod(target, key, descriptor) {
27+
// Guardamos la función original
28+
const originalMethod = descriptor.value;
29+
30+
// Reemplazamos el método con una nueva función
31+
descriptor.value = function(...args) {
32+
console.log(`Llamando al método ${key}`);
33+
return originalMethod.apply(this, args);
34+
}
35+
36+
return descriptor;
37+
}
38+
39+
// Ejercicio Extra: Decorador contador de llamadas
40+
function contadorLlamadas(target, key, descriptor) {
41+
// Creamos un mapa para almacenar los contadores de cada método
42+
if (!target.constructor._contadores) {
43+
target.constructor._contadores = new Map();
44+
}
45+
46+
// Guardamos la función original
47+
const originalMethod = descriptor.value;
48+
49+
// Reemplazamos el método con una nueva función que incluye el contador
50+
descriptor.value = function(...args) {
51+
// Obtenemos el contador actual o inicializamos en 0
52+
const contador = (target.constructor._contadores.get(key) || 0) + 1;
53+
target.constructor._contadores.set(key, contador);
54+
55+
console.log(`La función ${key} ha sido llamada ${contador} veces`);
56+
57+
// Llamamos a la función original
58+
return originalMethod.apply(this, args);
59+
}
60+
61+
return descriptor;
62+
}
63+
64+
// Aplicamos el decorador a una clase
65+
@logClass
66+
class Ejemplo {
67+
constructor() {
68+
console.log('Constructor de Ejemplo ejecutado');
69+
}
70+
71+
@logMethod
72+
saludar(nombre) {
73+
return `¡Hola ${nombre}!`;
74+
}
75+
}
76+
77+
// Clase con el decorador contador
78+
class Calculadora {
79+
@contadorLlamadas
80+
sumar(a, b) {
81+
return a + b;
82+
}
83+
84+
@contadorLlamadas
85+
multiplicar(a, b) {
86+
return a * b;
87+
}
88+
}
89+
90+
// Código de prueba
91+
console.log("=== Pruebas de los decoradores ===");
92+
93+
// Prueba del decorador de clase y método
94+
const ejemplo = new Ejemplo();
95+
console.log(ejemplo.saludar("JavaScript"));
96+
97+
// Prueba del decorador contador
98+
const calc = new Calculadora();
99+
console.log("Resultado suma:", calc.sumar(5, 3)); // Primera llamada a sumar
100+
console.log("Resultado suma:", calc.sumar(2, 4)); // Segunda llamada a sumar
101+
console.log("Resultado multiplicación:", calc.multiplicar(3, 4)); // Primera llamada a multiplicar
102+
console.log("Resultado suma:", calc.sumar(1, 1)); // Tercera llamada a sumar
103+
104+
// Ejemplo de uso de decoradores con clases ES6 modernas
105+
// Decorador que añade un método a la clase
106+
function añadirMetodo(target) {
107+
target.prototype.nuevoMetodo = function() {
108+
return "Este es un método añadido por el decorador";
109+
}
110+
return target;
111+
}
112+
113+
@añadirMetodo
114+
class EjemploModerno {
115+
constructor() {
116+
console.log("Clase moderna creada");
117+
}
118+
}
119+
120+
const ejemploModerno = new EjemploModerno();
121+
console.log(ejemploModerno.nuevoMetodo());
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?php
2+
3+
/**
4+
* TEORÍA DE DECORADORES (ATRIBUTOS) EN PHP
5+
*
6+
* En PHP 8.0+ los decoradores se implementan como "Atributos" y permiten añadir
7+
* metadatos a las clases, métodos, propiedades y parámetros.
8+
*
9+
* Los atributos en PHP:
10+
* - Se definen como clases con el atributo #[Attribute]
11+
* - Se aplican usando la sintaxis #[NombreAtributo]
12+
* - Pueden recibir parámetros en su constructor
13+
* - Se pueden consultar usando la API de Reflection
14+
*/
15+
16+
// Ejemplo 1: Decorador simple para una clase
17+
#[Attribute]
18+
class LogClass {
19+
public function __construct(public string $message = "") {}
20+
}
21+
22+
// Ejemplo 2: Decorador para métodos que registra la ejecución
23+
#[Attribute]
24+
class LogMethod {
25+
public function __construct(public string $message = "") {}
26+
}
27+
28+
// Ejemplo 3: Decorador contador de llamadas (para el ejercicio extra)
29+
#[Attribute]
30+
class ContadorLlamadas {
31+
private static array $contadores = [];
32+
33+
public static function incrementar(string $metodo): int {
34+
if (!isset(self::$contadores[$metodo])) {
35+
self::$contadores[$metodo] = 0;
36+
}
37+
self::$contadores[$metodo]++;
38+
return self::$contadores[$metodo];
39+
}
40+
}
41+
42+
// Clase de ejemplo con decoradores
43+
#[LogClass("Esta es una clase de ejemplo")]
44+
class Ejemplo {
45+
#[LogMethod("Método de saludo")]
46+
public function saludar(string $nombre): string {
47+
return "¡Hola $nombre!";
48+
}
49+
}
50+
51+
// Clase Calculadora con el decorador contador
52+
class Calculadora {
53+
#[ContadorLlamadas]
54+
public function sumar(int $a, int $b): int {
55+
return $a + $b;
56+
}
57+
58+
#[ContadorLlamadas]
59+
public function multiplicar(int $a, int $b): int {
60+
return $a * $b;
61+
}
62+
}
63+
64+
// Clase Helper para procesar los decoradores
65+
class DecoratorHelper {
66+
// Método para procesar decoradores de clase
67+
public static function processClassDecorators(string $className): void {
68+
$reflection = new ReflectionClass($className);
69+
$attributes = $reflection->getAttributes();
70+
71+
foreach ($attributes as $attribute) {
72+
if ($attribute->getName() === LogClass::class) {
73+
$instance = $attribute->newInstance();
74+
echo "Clase {$className} creada: {$instance->message}\n";
75+
}
76+
}
77+
}
78+
79+
// Método para procesar decoradores de método
80+
public static function processMethodDecorators(string $className, string $methodName): void {
81+
$reflection = new ReflectionMethod($className, $methodName);
82+
$attributes = $reflection->getAttributes();
83+
84+
foreach ($attributes as $attribute) {
85+
if ($attribute->getName() === LogMethod::class) {
86+
$instance = $attribute->newInstance();
87+
echo "Método {$methodName} llamado: {$instance->message}\n";
88+
} elseif ($attribute->getName() === ContadorLlamadas::class) {
89+
$contador = ContadorLlamadas::incrementar($className . "::" . $methodName);
90+
echo "El método {$methodName} ha sido llamado {$contador} veces\n";
91+
}
92+
}
93+
}
94+
}
95+
96+
// Clase Proxy para interceptar llamadas y procesar decoradores
97+
class CalculadoraProxy {
98+
private Calculadora $calculadora;
99+
100+
public function __construct() {
101+
$this->calculadora = new Calculadora();
102+
}
103+
104+
public function __call(string $method, array $arguments) {
105+
DecoratorHelper::processMethodDecorators(Calculadora::class, $method);
106+
return $this->calculadora->$method(...$arguments);
107+
}
108+
}
109+
110+
// Código de prueba
111+
echo "=== Pruebas de los decoradores ===\n";
112+
113+
// Prueba del decorador de clase
114+
DecoratorHelper::processClassDecorators(Ejemplo::class);
115+
116+
// Prueba del decorador de método
117+
$ejemplo = new Ejemplo();
118+
DecoratorHelper::processMethodDecorators(Ejemplo::class, 'saludar');
119+
echo $ejemplo->saludar("PHP") . "\n";
120+
121+
// Prueba del decorador contador
122+
$calc = new CalculadoraProxy();
123+
echo "Resultado suma: " . $calc->sumar(5, 3) . "\n"; // Primera llamada a sumar
124+
echo "Resultado suma: " . $calc->sumar(2, 4) . "\n"; // Segunda llamada a sumar
125+
echo "Resultado multiplicación: " . $calc->multiplicar(3, 4) . "\n"; // Primera llamada a multiplicar
126+
echo "Resultado suma: " . $calc->sumar(1, 1) . "\n"; // Tercera llamada a sumar

0 commit comments

Comments
 (0)