Hola a todos:
El motivo de usar getter y setters para acceder a variables internas de una
clase, no es mas que cumplir con las bases de la encapsulaci�n.
Una norma dentro de la encapsulaci�n es que todo clase que acceda a otra, no
debe saber mas que una interfaz de uso b�sica, obligando a desconocer el
contenido interno de la clase o su funcionamiento.
Esto garantiza el bajo acoplamiento entre clases, una explicaci�n sobre el
concepto de acoplamiento est� en el post de www.code4net.com
llamado "Patrones?".
El acoplamiento, en resumen, es una manera de medir que conocimiento de una
clase ha de tener otra para poder usarla. Lo ideal en la programaci�n
orientado a objetos es que siempre haya el mas bajo acoplamiento posible entre
clases, de manera que usando un juego de m�todos fijo se permita la
utilizaci�n del objeto sin necesidad de conocer m�s, por ello el control de
acceso a propiedades, si una clase tiene acceso a las propiedades de otra,
esto obliga a que cualquier modificaci�n en la clase, tenga que llevarse a la
otra clase, aparte est�, claro, la validaci�n de datos dentro de una clase, de
manera que podemos, usando getter y setters, avalar la consistencia de datos,
adem�s, si dentro de la clase que tiene getter y setter se modifica "la
apariencia interna de los datos", controlas la devoluci�n de los mismos
igualandolos a la anterior representaci�n.
Imaginemos como ejemplo una clase Tiempo, esta sin comentar por que no tengo
mucho tiempo:
<code>
Tiempo = function (hora, minuto, segundo) {
this.estableceHora(hora, minuto, segundo);
};
Tiempo.prototype.estableceHora = function(hora, minuto, segundo) {
if (hora<24 && hora>0)
{
this.$hora = hora;
}
else
{
this.$hora = 0;
}
if (minuto<60 && minuto>0)
{
this.$minuto = minuto;
}
else
{
this.$minuto = 0;
}
if (segundo<60 && segundo>0)
{
this.$segundo = segundo;
}
else
{
this.$segundo = 0;
}
};
Tiempo.prototype.getHoraUniversal = function() {
if (this.$hora<10)
{
var texto = "0"+this.$hora+":";
}
else
{
var texto = this.$hora+":";
}
if (this.$minuto<10)
{
texto += "0"+this.$minuto+":";
}
else
{
texto += this.$minuto+":";
}
if (this.$segundo<10)
{
texto += "0"+this.$segundo;
}
else
{
texto += this.$segundo;
}
return texto;
};
Tiempo.prototype.getHoraEstandard = function() {
if (this.$hora == 0 || this.$hora == 12)
{
var texto = 12+":";
}
else
{
var texto = (this.$hora%12)+":";
}
if (this.$minuto<10)
{
texto += "0"+this.$minuto+":";
}
else
{
texto += this.$minuto+":";
}
if (this.$segundo<10)
{
texto += "0"+this.$segundo;
}
else
{
texto += this.$segundo;
}
if (this.$hora<12)
{
texto += " AM";
}
else
{
texto += " PM";
}
return texto;
};
prueba = new Tiempo(10, 13, 6);
trace(prueba.getHoraUniversal());
trace(prueba.getHoraEstandard());
</code>
Y ahora una clase Fecha, que usa la clase tiempo.
<code>
Fecha = function (dia, mes, anio, hora, minuto, segundo) {
this.estableceFecha(dia, mes, anio, hora, minuto, segundo);
};
Fecha.prototype.estableceFecha = function(dia, mes, anio, hora, minuto,
segundo) {
if (mes>1 && mes<12)
{
this.$mes = mes;
}
else
{
this.$mes = 1;
}
this.$anio = anio;
this.$dia = this.verificaDia(dia);
this.$hora = new Tiempo(hora, minuto, segundo);
};
Fecha.prototype.verificaDia = function(dia) {
var diasPorMes = new Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31);
if (dia>0 && dia<=diaPorMes[this.$mes])
{
return dia;
}
if (this.$mes == 2 && dia == 29 && (this.$anio%400 == 0 || this.$anio%
4 == 0 && this.$anio%100 != 0))
{
return dia;
}
return 1;
};
Fecha.prototype.getUniversal = function() {
var mes = new Array
(0,"Enero", "Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiemb
re","Octubre","Noviembre","Diciembre");
var texto = this.$dia+" de "+mes[this.$mes]+"
de "+this.$anio+" "+this.$hora.getHoraUniversal();
return texto;
};
Fecha.prototype.getEstandard = function() {
var texto =
this.$dia+"/"+this.$mes+"/"+this.$anio+" "+this.$hora.getHoraEstandard();
return texto;
};
prueba = new Fecha (22,2,2003);
trace (prueba.getEstandard());
trace (prueba.getUniversal());
</code>
Si despues quisieramos almacenar tanto la clase tiempo, como la clase fecha en
milisegundos para ahorrar memoria en variables internas, s�lo tendriamos que
cambiar la implementaci�n interna, mientras que nuestras clases que la
utilizan, no deben cambiar en nada. (La implementaci�n en milisegundos se la
dejo a alguien que tenga ganas).
Evidentemente en proyectos peque�os, quiz�s no sea necesario.
Pero si nuestras clases son algo complejas internamente y tenemos clases
relaccionadas, cualquier modificaci�n en un futuro medio lejano, nos obliga
primero a recordar que clases enlazaban con ella, y desde luego, como lo hacia
para poder modificar tambi�n todas las clases que la utilizan. Si adem�s,
creas clases con el afan de reutilizarlas en tus proyectos, lo recomendable es
un bajo acoplamiento de todas ellas.
Sixto
-------------------------------------------------
This mail sent through IMP: http://horde.org/imp/
<!-------------------------------
Lista ASNativos:
subscripciones/desubscripciones
http://www.sidedev.net/asnativos
-------------------------------->