7.4 Clases

Casi todos los lenguajes de programación tienen tipos de datos incorporados. Por ejemplo, un tipo de dato entero (int) está predefinido en varios lenguajes, y si así se desea se pueden declarar tantas variables de tipo int como sea necesario en su programa:

  • int día
  • int mes
  • int divisor
  • int salario

De modo similar se pueden definir muchos objetos de la misma clase. En una clase se especifica que datos (atributos) y funciones (métodos) tendrán los objetos de esa clase. La definición de la clase no crea objetos, al igual que la simple existencia de tipos de datos no crea ninguna variable. Una clase es por consiguiente una descripción de un número determinado de objetos similares. Ricky Martin, Chayanne y Shakira son miembros de la clase “cantante latino”. No hay ninguna persona llamada “cantante latino” sin embargo hay personas específicas con nombres específicos que son miembros de esta clase si poseen unas características determinadas.

7.4.1 Identificación y responsabilidad de una clase

Cinco grandes categorías facilitan la identificación de qué tipos de cosas son clases:

Cosas tangibles

Avión Fuente de alimentación Libro Auto
Reactor nuclear Circuito de frenos Perro Moto
Caballo de carreras Parque nacional Gato Banco
Curso Grupo de clase Fotocopia Barco

Roles jugados por personas o instituciones

Doctor Empleado Supervisor
Paciente Gerente Jefe Departamento
Enfermero Cliente Ingeniero de Sistemas
Director Socio Analista

Incidentes/Eventos

Vuelo Accidente Rendimiento
Suceso Rotura de un sistema Llamada telefónica
Salida de un tren Despegue de un avión Llegada de un avión

Interacciones

Compra Arco (entre dos nodos)
Cargo en tarjeta de crédito Reunión
Intersección Contrato

Especificaciones

Producto de seguros Artículo de un libro
Tipo de tarjeta de crédito Tipo de crédito

Cada clase de un sistema debe ser responsable de un aspecto del mismo. Las propiedades localizadas en una misma área de responsabilidad se deben agrupar en una única clase y no dividirse en diversas clases. Cada responsabilidad se asigna a una única clase. El principio de coherencia exige que todas las propiedades de una clase deben formar una conexión lógica. Si por ejemplo se desea crear una clase Cliente se debe determinar primero su responsabilidad: ¿sobre qué elementos es responsable esta clase?.

Ejemplo:

7.4.2 Representación gráfica de una clase

Una clase se representa en UML (Unified Modeling Language) con un rectángulo que se divide horizontalmente en tres bandas. La banda superior contiene el nombre de la clase; la banda central los atributos de la clase; y la banda inferior contiene las operaciones/métodos de la clase. Los atributos con un signo más (+) delante de ellos son públicos, que significa que otras clases pueden acceder a ellos. Los atributos precedidos con un signo menos (-) son privados, lo que indica que sólo la clase y sus objetos pueden acceder a ellos. Por último, los atributos protegidos rotulados con el número de signo numeral (#) pueden ser utilizados únicamente por la clase y por cualquier descendiente de la clase.

7.4.2.1 Atributos

Un atributo es una propiedad de una clase. Describe el rango de valores que la propiedad puede tener en los objetos de esa clase. Una clase puede tener cero o más atributos. Los atributos pueden mostrar su tipo así como su valor por defecto.

7.4.2.2 Operaciones/Métodos

Una operación es algo que una clase puede hacer o que otra clase hace que haga. Se nombra de igual forma que los atributos.

Ejemplos

  • Clase Motocicleta (atributos y operaciones/métodos).

  • Clase Factura (atributos).

  • Clase Cuenta Corriente (atributos y operaciones/métodos).

7.4.3 Declaración de clases

clase <nombre_de_clase>
  //Declaración de atributos
  //Declaración de operaciones (métodos y constructores)
fin_clase

<nombre_de_clase> tiene que ser un identificador válido.

Ejemplo:

clase auto
  
  var
    privado entero: añoDeFabricación
    privado real: mileage
    privado cadena: licenciaConducir
    
  público entero función obtenerAñoFabricación()
    ...
  inicio
    ...
    devolver(...)
  fin_función
  
  público procedimiento obtenerKilometraje()
    ...
  inicio
    ...
  fin_procedimiento
    
    ...

  público constructor auto()
  inicio
    ...
  fin_constructor
  
fin_clase

7.4.4 Los miembros de una clase y de un objeto

Los miembros de una clase son los elementos dato/atributos (a los que también se puede denominar variables de instancia) y los métodos. Los métodos son acciones que se realizan por un objeto de una clase. Una invocación a un método es una petición que llega al método para que ejecute su acción y lo haga con el objeto mencionado (más los parámetros que reciba el método). La invocación de un método se denominaría también llamar a un método o pasar un mensaje a un objeto.

Existen dos tipos de métodos, aquellos que devuelven un valor único y aquellos que ejecutan alguna acción distinta de devolver un único valor. La diferencia entre unos y otros en pseudocódigo se destacará mediante el empleo de las palabras reservadas procedimiento y funcion. El paso de parámetros se regirá por las normas habituales descritas al tratar procedimientos y funciones. Por ejemplo en una clase CuentaCorriente el método depositar, que no devuelve ningún valor, se declararía:

público procedimiento depositar(real cantidad)
  ...
inicio
  ...
fin_procedimiento

El método obtenerSaldo, también de la clase CuentaCorriente, se supone devuelve el saldo y su declaración será:

público real función obtenerSaldo()
  ...
  inicio
  ...
  devolver(...)
fin_función

7.4.4.1 Constructor

Un constructor es un método que tiene el mismo nombre que la clase, cuyo propósito es inicializar los miembros datos de un nuevo objeto y que se ejecuta automáticamente cuando se crea un objeto de una clase. Sintácticamente es similar a un método. Dependiendo del número y tipos de los argumentos proporcionados, una función o método constructor se llama automáticamente cada vez que se crea un objeto. Si no se ha definido ningún constructor en la clase, el compilador proporciona un constructor por defecto. Cuando se define un constructor no se puede especificar un valor de retorno, un constructor nunca devuelve un valor. Un constructor puede, sin embargo, tomar cualquier número de parámetros (cero o más). A su rol como inicializador, un constructor puede también añadir otras tareas cuando es llamado.

constructor <nombre_de_clase>[(<lista_parámetros_formales>)]
//declaración de variables locales
inicio
  //código del constructor
fin_constructor

En el pseudocódigo utilizado se supone que, cuando un objeto ya no se necesita y se queda sin referencias, la memoria ocupada por ese objeto se libera automáticamente, sin necesidad de una destrucción explícita.