Extension Methods

Una de las características más interesantes de .NET (C#) es la posibilidad de implementar Extension Methods. La extensión methods son funciones que extienden una clase ya definida dentro o fuera del código accesible. Esto quiere decir que luego de definir uno de estos métodos, podemos acceder a el desde el contexto base de una clase no accesible. Esto es extremadamente útil si queremos agregar funcionalidades customizadas en clases que ya existen sin aumentar la complejidad ciclomatica de nuestros scripts.

Como ejemplo tenemos una de mis funciones favoritas, la funcion PickOne(). PickOne nació de un escenario muy común en el desarrollo de juegos, poder tomar un ítem al azar de una colección de objetos. Realmente no quería tener que escribir siempre el famoso array[Random.Range(0, array.Length)];
Así que decidí hacer un extensión method que actué sobre la interfaz IEnumerable. Esto me asegura que todo lo que implemente esta interfaz (incluyendo arrays, listas y demases) pueda tener la función de PickOne.

PickOne()
La funcion PickOne extiende todos los IEnumerable permitiendo que sea accesible desde una colección.

 

Consumiendo PickOne()
Como se puede ver, PickOne() extiende todos los IEnumerable, logrando que la función sea accesible desde un array.

Mejor aún, he visto que mucha gente se queja de los “random que no son muy random”, esto básicamente viene por la cantidad de repeticiones que se obtienen. El tema es mas bien matemático, si tienes 3 elementos y estas obteniendo uno al azar, hay GRANDES chances de repetición, cuando tienes 8 o más, empezas a entrar en la zona de la no repetición. De todas maneras, podemos intervenir en la “randomness” alterando un poquito la funcion PickOne. Digamos una PickOneNoRepeat(T lastPick).
Esta función tiene una lógica adicional, va a seguir llamando al PickOne hasta que el resultado sea diferente al anterior.

 

PickOneNoRepeat(T lastPick)
PickOneNoRepeat se asegura de que el elemento devuelto no sea igual al parámetro dado
PickOneNoRepeat
De esta manera podemos asegurarnos que 2 elementos no salgan continuados en nuestra generación aleatoria

 

¿Cómo hago mi Extension Method?

Hay que cumplir algunos requisitos para esto:

  • Los extension methods solo pueden ser definidos en una clase estatica.
  • Los ExMethods solo pueden ser estáticos.
  • El primer parámetro en la firma del método tiene que ser this seguido por la clase a extender.

Por ende, si por ejemplo queremos tener una funcionalidad en todos nuestros sprites que setee los sprites como “fantasmas” podemos definir algo así:

 

SetAsGhost
A modo ejemplo, este método extiende la clase SpriteRenderer de Unity para ofrecer funcionalidad personalizada.
Autocomplete
Instantáneamente podemos ver la función como si fuera parte de la clase extendida.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s