2012-01-24 11 views
8

En las clases, las variables a menudo se vuelven privadas para la encapsulación, y limitar las variables a un cierto alcance permite un mejor control de errores y menos errores. Esto tiene sentido, ya que a menos lugares se puede acceder a una variable, menos lugares puede ocurrir un error con esa variable.¿Cuál es el punto de acceso a las variables privadas a través de las funciones getter y setter (acceso)?

Sin embargo, siempre veo las variables hechas en privado, y luego una función getter y setter usada para recuperar ese valor (¡a veces incluso un puntero a esa variable!). Por ejemplo, int a es privado para evitar el acceso público, pero luego getA() y setA() permiten el acceso directo a ellos.

Por lo tanto, ¿las funciones del captador y las funciones del colocador no pueden ser privadas? Quiero decir que las variables privadas con función de acceso son las mismas que las públicas, solo cambia el código para acceder a ellas. (object.variable vs object.getVariable())

¿Hay alguna razón por la que las personas hagan que las variables sean privadas con funciones de acceso? ¿Hay alguna ventaja en comparación con hacerlo público?

Estoy hablando de programación en general, pero sobre todo en las lenguas C (es decir, C, C++, C#, Obj-C).

+1

Eso realmente depende del idioma. En lenguajes OO restrictivos (C#, Java), los getters/setters son una expresión común, mientras que en un lenguaje más libre como C++ generalmente son de estilo pobre. –

Respuesta

11

La palabra clave y la etiqueta aquí es "encapsulación". Está ocultando los detalles de a, sin dejar de hacerlo utilizable. Me gustan los motivos ya enumerados, hay muchos más. Aquí hay otra, estás depurando, y encuentras que a tiene un valor incorrecto. Si a es público, debe verificar cada lugar al que se accede al a. Si a es privado con un método de selección, se conoce el único lugar a podrían haber cambiado es en una llamada a setA() - sería un gran lugar para poner un punto de interrupción;)

+0

+1 para la depuración –

+0

Entendido perfectamente, gracias :) – fdh

+0

Dependiendo del procesador (como X86), un depurador podría establecer un punto de interrupción de datos (o punto de referencia) en cualquier escritura a una variable, lo que lograría lo mismo. – rcgldr

2

Porque si cambia la representación interna de esa variable o desea hacer más cuando está configurada o recuperada, no romperá todas las otras clases que la usan (y si es una biblioteca, no tiene que cambia tu API).

También significa que puede establecer fácilmente un punto de interrupción para ver cuándo se usa (aunque la mayoría de los lenguajes/depuradores tienen puntos de interrupción de datos de algún tipo).

2

Quizás desee agregar algunos controles a la próxima versión de la biblioteca (o hacer algo cuando alguien lea el valor), y si la variable será pública en la versión actual, actualizar la versión de la biblioteca costará un mucho trabajo.

0

clase define el comportamiento y los miembros son el estado del objeto ... así que tener un setter y un getter define el comportamiento de encapsulación de la clase de dejar que otros encuentren/cambien el estado de los objetos.

En otros términos, la diferencia es algo así como dejar que su vecino entre a su casa y tomar lo que quiera (haciendo público todo el objeto de la clase) ... o asegurarse de que el vecino me pregunte qué quiere y le doy (teniendo un getter/setter ....)

0

¿Por qué se requirió encapsulación? ¿Por qué se requirió oop? ¿El lenguaje de programación Wasnt C no podía hacer lo que hacemos hoy? Pregúntele esto a usted mismo. O si ha trabajado en sistemas enormes que tienen millones de líneas de código. Y todo lo que utilizó fueron variables públicas de una estructura de datos crucial accesible desde cada módulo del programa.

+0

pregunta en respuesta? – manetsus

0

Tenía la misma pregunta en mente cuando empecé a aprender programación orientada a objetos porque en la mayoría de los libros solo hacen variables privadas y agregan métodos públicos (Getter/Setters) para acceder a ellos, así que estaba pensando si puedo acceder esa variable por métodos que son públicos, entonces cuál es el punto para hacer que esa variable sea privada.

Recibo la respuesta Cuando empiezo a implementar la aplicación comercial real.

Vamos a considerar un estudiante de clase que contiene el nombre del estudiante, rodar no, marcas de 3 sujetos

Class Student { 

    private int rollno; 
    private int java_marks; 
    private int cpp_marks; 
    private int unix_marks; 
    private int percentage; 


    public int getJava_marks() { 
     return java_marks; 
    } 
    public void setJava_marks(int java_marks) { 
     if (java_marks > 100) { 
      System.out.println("Marks value should be less than 100"); 
      //throw exception 
     } 
     this.java_marks = java_marks; 
    } 
    public int getCpp_marks() { 
     return cpp_marks; 
    } 
    public void setCpp_marks(int cpp_marks) { 
     if (cpp_marks > 100) { 
      System.out.println("Marks value should be less than 100"); 
      //throw exception 
     } 
     this.cpp_marks = cpp_marks; 
    } 
    public int getUnix_marks() { 

     return unix_marks; 
    } 
    public void setUnix_marks(int unix_marks) { 
     if (unix_marks > 100) { 
      System.out.println("Marks value should be less than 100"); 
      //throw exception 
     } 
     this.unix_marks = unix_marks; 
    } 
    public int getPercentage() { 
     this.percentage = (this.cpp_marks + this.unix_marks + this.java_marks) /3; 
     return percentage; 
    } 

    public int getRollno() { 
     return rollno; 
    } 
    public void setRollno(int rollno) { 
     this.rollno = rollno; 
    } 

} 

Aquí hacen las variables privadas debido a 2 razones

  1. Validación: si un usuario proporciona valor no válido para las marcas, entonces el objeto del alumno no debe crear con datos no válidos y arrojar el error/excepción correspondiente. En el caso de las marcas como variables públicas, el usuario puede establecer cualquier valor para ellas, así que agregué validación/seguridad para asegurar que cada objeto de estudiante creado tenga datos correctos.

  2. Seguridad En el caso de porcentaje, el usuario no puede establecer su propio porcentaje. el porcentaje se calcula y se establece internamente. Aquí no proporciono el método setter para el porcentaje, por lo que el usuario solo puede obtener/leer el valor porcentual mediante el método getter.

Esto lleva a la seguridad en la abstracción que es solo un acceso limitado (de solo lectura) a la variable de clase.

Cuestiones relacionadas