Clases en PowerShell

En programación orientada a objetos, aunque suene un redundante, se utilizan objetos. Y estos objetos se pueden agrupar en las llamadas clases. Las clases dan forma a un objeto, como si fuese un template, definiendo como debe verse un objeto y potencialmente lo que se necesita para crear uno nuevo.

Es recomendable tener en cuenta la siguiente afirmación:

Un objeto no es una clase, ni una clase es un objeto. Un objeto es una instancia de una clase.

Por qué usar clases?

En repetidas ocasiones nos encontramos escribiendo módulos y funciones por ahí tratando de automatizar el mundo que nos rodea. Es ahí uno de los grandes usos de las clases en PowerShell. Con las clases vamos a poder representar estructuras de datos complejas y más aún al utilizar múltiples funciones que necesitan pasar los mismos datos.

El otro gran punto para usar clases es al momento de trabajar con DSC. Ya en el blog hemos tenido varias entradas hablando sobre DSC (aquí y aquí). DSC está ganando más y más tracción todos los días y con esta adpoción, hay una brecha aún mayor para los nuevos recursos. Los recursos DSC Class-based son simplemente más fáciles de desarrollar y mantener.

Creando nuestra primer clase

Para definir una clase es necesario utilizar la keyword class:

class Alien {

  }

Como mencionamos anteriormente, ahora que tenemos nuestra clase definida, podemos crear instancias de ella. Tenemos a disposición varias maneras diferentes de hacer esto. La primera es usar New-Object con el parámetro -TypeName.

$greenMan = New-Object -TypeName Alien

La segunda manera de instanciar una clase es llamar al constructor estático de la clase. Por más información sobre constructores y los tipos existentes acceder al siguiente enlace. Para invocarlo es necesario utilizar los dos puntos de la siguiente manera:

$greenMan = [Alien]::New()

Describiendo las clases

Propiedades

Las propiedades son cosas sobre un objeto, cosas que lo representan y definen. Si describiéramos un alien como el ejemplo, las propiedades podrían ser altura y peso. Agregamos propiedades a una clase agregando variables dentro de la clase. Si bien no es obligatorio, es una buena idea definir el tipo de variable para determinar el tipo de dato a ingresar:

class Alien {
    [string]$Nombre
    
    [int]$Altura

    [int]$Peso
  }

Validación de las propiedades

Como indica el título, PowerShell permite la validación de las propiedades. Esto permite que los datos que se ingresan cumplan con lo que se requiere para cada propiedad:

class Alien {
    [ValidatePattern('^[a-z]')][ValidateLength(3,15)][string]$Nombre
    
    [ValidateRange(0,200)][int]$Altura

    [ValidateRange(0,300)][int]$Peso
  }

Propiedades ocultas

Las clases de PowerShell también admiten propiedades ocultas. Para ocultar una propiedad, se debe usar la keyword hidden justo antes del nombre de la propiedad. Para el siguiente ejemplo vamos a ocultar la propiedad ID sea del tipo GUID y esté oculta para el usuario.

class Alien {
    [Guid]hidden $ID

    [ValidatePattern('^[a-z]')][ValidateLength(3,15)][string]$Nombre
    
    [ValidateRange(0,200)][int]$Altura

    [ValidateRange(0,300)][int]$Peso
  }

Y para comprobar esto vamos a ejecutar el código que genera la clase, junto una instancia de la misma llamada $greenMan:

Generar una instancia de la clase 'Alien'

En donde se utilizó:

$greenMan | Get-Member -MemberType Properties

Para ver las propiedades disponibles dentro del objeto generado.

Happy scripting!

Comments