Blog gratis
Reportar
Editar
¡Crea tu blog!
Compartir
¡Sorpréndeme!
Blog de la Escuela de Educación Secundaria Técnica N 8 de Quilmes
Administrador Prof. Claudio Enrique Alonso Alvite
img
02 de Julio, 2015    General

Encapsulación,Getters,Setters y Delegación


Sin Titulo

Una de las dudas más habituales cuando trabajamos con Programación Orientada a Objeto es como se manejan los métodos set/get de una clase. En ocasiones pueden parecer superfluos pero siempre se acaban implementando.

Encapsulación y reglas de negocio

Normalmente la encapsulación sirve para tener un mayor control sobre el acceso a cada una de las propiedades de un objeto determinado. Por ejemplo en la clase Cliente se valida el CIF antes de asignarlo a través de un método set.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package es.genbetadev;
 
 
    public class Cliente {
 
        private String cif;
        private String  nombre;
        private String calle;
        private int codigoPostal;
         
         
         
        public Cliente(String cif, String nombre, String calle, int codigoPostal) {
            super();
            this.cif = cif;
            this.nombre = nombre;
            this.calle = calle;
            this.codigoPostal = codigoPostal;
        }
        public String getCif() {
            return cif;
        }
        public void setCif(String cif) {
             
            if (Utilidades.formato(cif)) {
                 
                this.cif = cif;
            }else {
                 
                throw new RuntimeException("el formato no es adecuado");
            }
        }
        public String getNombre() {
            return nombre;
        }
        public void setNombre(String nombre) {
            this.nombre = nombre;
        }
        public String getCalle() {
            return calle;
        }
        public void setCalle(String calle) {
            this.calle = calle;
        }
        public int getCodigoPostal() {
            return codigoPostal;
        }
        public void setCodigoPostal(int codigoPostal) {
            this.codigoPostal = codigoPostal;
        }
    }

El concepto de delegación y la encapsulación

Sin embargo no es para lo único que se usan los métodos set/get. Si en el modelo apareciera la clase Edificio existiría un problema.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package es.genbetadev;
 
    public class Edificio {
 
        private int id;
        private String calle;
        private int codigoPostal;
         
         
         
        public Edificio(int id, String calle, int codigoPostal) {
            super();
            this.id = id;
            this.calle = calle;
            this.codigoPostal = codigoPostal;
        }
         
         
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getCalle() {
            return calle;
        }
        public void setCalle(String calle) {
            this.calle = calle;
        }
        public int getCodigoPostal() {
            return codigoPostal;
        }
        public void setCodigoPostal(int codigoPostal) {
            this.codigoPostal = codigoPostal;
        }
 
         
    }

Ambas clases tienen el concepto de Dirección asociado a ellas y hay un problema de repetición de código.

Delegacion1

Por lo tanto se creará una nueva clase "Dirección" para almacenar esa lógica de negocio.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package es.genbetadev2;
 
    public class Direccion {
 
        private String calle;
        private int codigoPostal;
         
         
        public String getCalle() {
            return calle;
        }
        public void setCalle(String calle) {
            this.calle = calle;
        }
        public int getCodigoPostal() {
            return codigoPostal;
        }
        public void setCodigoPostal(int codigoPostal) {
            this.codigoPostal = codigoPostal;
        }
        public Direccion(String calle, int codigoPostal) {
            super();
            this.calle = calle;
            this.codigoPostal = codigoPostal;
        }
         
         
    }

Tanto la clase Cliente como la clase Edificio delegarán en la clase Dirección a la hora de gestionar esa información.

Delegacion2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package es.genbetadev1;
 
 
    public class Cliente {
 
        private String cif;
        private String  nombre;
        private Direccion direccion;
         
         
         
        public Cliente(String cif, String nombre, Direccion direccion) {
            super();
            this.cif = cif;
            this.nombre = nombre;
            this.direccion = direccion;
        }
        public Direccion getDireccion() {
            return direccion;
        }
        public void setDireccion(Direccion direccion) {
            this.direccion = direccion;
        }
        public String getCif() {
            return cif;
        }
        public void setCif(String cif) {
             
            if (Utilidades.formato(cif)) {
                 
                this.cif = cif;
            }else {
                 
                throw new RuntimeException("el formato no es adecuado");
            }
        }
        public String getNombre() {
            return nombre;
        }
        public void setNombre(String nombre) {
            this.nombre = nombre;
        }
    }

Esto hará más complicado trabajar con las clases ya que habrá que acceder al código postal usando c.getDireccion().getCodigoPostal() ya que se ha usado composición. Para eliminar este problema se usa el patrón delegación que ayuda a encapsular la clase Dirección apoyandose en los métodos set/get.

Delegacion3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package es.genbetadev2;
 
 
    public class Cliente {
 
        private String cif;
        private String  nombre;
        private Direccion direccion;
         
         
         
        public Cliente(String cif,String nombre,String calle,int  codigoPostal ) {
            super();
            this.cif = cif;
            this.nombre = nombre;
            this.direccion = new Direccion(calle,codigoPostal);
        }
         
        public String getCalle() {
            return direccion.getCalle();
        }
 
        public void setCalle(String calle) {
            direccion.setCalle(calle);
        }
 
        public int getCodigoPostal() {
            return direccion.getCodigoPostal();
        }
 
        public void setCodigoPostal(int codigoPostal) {
            direccion.setCodigoPostal(codigoPostal);
        }
 
        public String getCif() {
            return cif;
        }
        public void setCif(String cif) {
             
            if (Utilidades.formato(cif)) {
                 
                this.cif = cif;
            }else {
                 
                throw new RuntimeException("el formato no es adecuado");
            }
        }
        public String getNombre() {
            return nombre;
        }
        public void setNombre(String nombre) {
            this.nombre = nombre;
        }
    }

De esta forma el Programador podrá volver a invocar c.getCodigoPostal() y el método devolverá la calle del objeto Cliente. Se habrán usado los métodos get/set para encapsular una clase. Si existiera un programa main su código sería el siguiente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package es.genbetadev2;
 
    public class Principal {
 
        public static void main(String[] args) {
         
             
            Cliente c= new Cliente ("12345678A","pepe","calle1",2000);
            System.out.println(c.getCodigoPostal());
             
 
        }
 
    }

Como se puede observar el desarrollador ni siquiera es consciente de que la clase Dirección existe en el modelo. Se ha usado la encapsulación para ocultar clases y la delegación para mantener el modelo sencillo de cara a los desarrolladores. Muchos IDEs soportan el concepto de delegación a través de sus opciones de refactoring. Eclipse es uno de ellos :

Delegacion4

Palabras claves , , , ,
publicado por alonsoclaudio a las 21:05 · Sin comentarios  ·  Recomendar
 
Más sobre este tema ·  Participar
Comentarios (0) ·  Enviar comentario
Enviar comentario

Nombre:

E-Mail (no será publicado):

Sitio Web (opcional):

Recordar mis datos.
Escriba el código que visualiza en la imagen Escriba el código [Regenerar]:
Formato de texto permitido: <b>Negrita</b>, <i>Cursiva</i>, <u>Subrayado</u>,
<li>· Lista</li>
CALENDARIO
Ver mes anterior Octubre 2024 Ver mes siguiente
DOLUMAMIJUVISA
12345
6789101112
13141516171819
20212223242526
2728293031
BUSCADOR
Blog   Web
TÓPICOS
» General (2606)
NUBE DE TAGS  [?]
SECCIONES
» Inicio
ENLACES
MÁS LEÍDOS
» Analizando el LiveBox 2.1 de Orange
» Cómo espiar WhatsApp
» Cómo usar Metashield protector for Client y por qué utilizarlo
» Detectando tráfico de conexiones HTTP inversas de Meterpreter (Snort)
» Ejecución remota de código arbitrario en OpenSSH
» Ganar dinero con 1.200 Millones de identidades robadas
» Hardware y sus 4 Funcionamientos Basicos y Principales en una Computadora
» Redes de la Deep Web: CJDNS y la Red Hyperboria
» Unidad Central de Procesamiento CPU
» Wassap, la aplicación que permite usar WhatsApp desde la PC
SE COMENTA...
» Cómo espiar WhatsApp
595 Comentarios: Scott, Scott, Jarlinson mercy, [...] ...
» Qué hacer ante el robo de un teléfono móvil o una tableta
2 Comentarios: best buy security cameras swann, best buy security cameras swann
» Espiando usuarios gracias a la vulnerabilidad en cámaras TRENDnet
1 Comentario: Coin
» Recopilatorio de aplicaciones y sistemas vulnerables para practicar
2 Comentarios: vera rodrigez ...
» SoftPerfect WiFi Guard permite saber quién esta conectado a mi WiFi
2 Comentarios: firdous ...
SOBRE MÍ
FOTO

Prof. Claudio Enrique Alonso Alvite



» Ver perfil

AL MARGEN
Escuela de Educacion Secundaria Tecnica N 8 de Quilmes
(Técnicos en Informática Personal y Profesional)
FULLServices Network | Blogger | Privacidad