Bueno, una consecuencia directa de este uso de la visibilidad es que se nos permite el uso de propiedades para dar mayor seguridad a los datos que suministramos a nuestros objetos.
El acceso a atributos o campos
Hasta ahora hemos venido declarando campos o atributos de forma pública, luego los ordenamos. Ahora una pregunta ¿De que sirve tener un atributo privado si no puedo acceder al mismo?
Uno diría, muy fácil: cambio su visibilidad a público y listo.
Esa es una opción. ¿Pero es la más adecuada? La respuesta es un depende.
Un peligro de hacer los campos y atributos de forma pública es que uno puede accidentalmente asignar un valor erróneo o no permitido sin ningún control. Por poner un ejemplo:
type TAuto = class(TVehiculo) public FVelocidad: double; // expresada en km/h end;
Supongamos que uno desea destinar el uso de FVelocidad para guardar el valor de la velocidad del auto. Como es de esperar, el valor de ésta no es ni negativo ni mayor a la velocidad del sonido (el día que exista un auto a la altura del bosillo de la clase media que brinde dicha velocidad me retracto ) por lo que la pregunta es ¿cómo uno puede controlar que el valor ingresado es permitido?
Una solución que uno puede elaborar es un método que realice algo como esto:
type TAuto = class(TVehiculo) public FVelocidad: double; // expresada en km/h function EsVelocidadValida: boolean; end;
La implementación podría ser de la forma:
function TAuto.EsVelocidadValida: boolean; begin result := (FVelocidad > 0.0) AND (FVelocidad < VEL_SONIDO) if NOT result then FVelocidad := 0.0; end;
Siendo VEL_SONIDO alguna constante numérica que represente a la velocidad del sonido (por si a alguien le interesa es de 1224 km/h o 340 m/s)
Como bien he dicho... es una opción. Pero para trabajar apropiadamente tenemos que recurrir a algo como:
var Auto: TAuto; valida: boolean; begin Auto := TAuto.Create; Auto.FVelocidad := 1224.555; valida := Auto.EsVelocidadValida; if valida then ....
Ahora bien, otro puede hacerse la idea de que el atributo sea privado y disponer de métodos para escribir y leer del mismo. Algo como:
type TAuto = class(TVehiculo) private FVelocidad: double; // expresada en km/h public procedure EstablecerVelocidad(Valor: double); function LeerVelocidad: double; end;
Ahora en este caso, las implementaciones podrían ser como las siguientes:
procedure TAuto.EstablecerVelocidad(Valor: double); begin if (Valor > 0.0) AND (Valor < VEL_SONIDO) then FVelocidad := Valor else FVelocidad := 0.0; end; function TAuto.LeerVelocidad: double; begin result := FVelocidad; end;
Esta concepción es más cercana al tema que vamos a hablar en este hilo, pero todavía tenemos una pequeña molestia. Ahora tanto para escribir y leer debemos hacer cosas como:
begin Auto := TAuto.Create; Auto.EstablecerVelocidad(1224.5555) ... variable := Auto.LeerVelocidad;
¿Un poco molesto no? Molesta la "vista" y complica al diseño y comprensión del problema. Imagínese que por cada atributo estaría haciendo 2 métodos...
¿Se podría tener algo como esto?:
Auto.Velocidad := 1224.555; variable := Auto.Velocidad;
Si, todo es posible gracias a las propiedades.
Las propiedades existen para brindar un acceso seguro a nuestros atributos. De este modo uno puede disponer de atributos privados y dejar que las propiedades se encarguen de la parte "sucia". Contar con propiedades nos permiten hacer más fácil las cosas, nos ahorramos lineas de código y nos esclarece el panorama.
Seguiremos el tema en el próximo post.
Saludos,