2011-01-22 24 views

Respuesta

7

Los setters de Getters se usan generalmente desde fuera de la clase desde dentro para acceder directamente a los campos. La principal ventaja /propósito es encapsulación de los que elaboran getter,

Si sus getters set tiene un código lógico luego usarlo.

por ejemplo:

public void setValue(int val){ 
    if(val > 100) 
    this.val = 0; 
    else 
    this.val = val; 
    } 

Véase también

+0

enlace a otro artículo explica esto muy bien. – Knubo

+0

La sugerencia de tipo int no funciona en PHP. – GolezTrol

+0

@Geolez No veo PHP tag por OP, es el concepto de OOP descrito aquí no específico para ningún idioma –

5

Sí, captadores y definidores son útiles. Debido a que PHP no es compatible con la sugerencia de tipo para tipos simples como int o string, no puede forzar que un valor sea del tipo correcto.

Al usar un setter, siempre tiene la posibilidad de verificar el valor establecido. Cuando un valor establecido en una propiedad int no es un int, puede elegir encasillarlo o generar un error, en lugar de simplemente aceptar el valor incorrecto.

Eso hará que la depuración y el mantenimiento de su aplicación sean mucho más fáciles. Por lo tanto, es una buena idea utilizar getters y setters, incluso si no contienen mucha lógica además de estas verificaciones.

+0

+ 1.Es útil gracias y org.life tiene razón.Intensivamente no agregué una etiqueta específica de idioma –

0

Se supone que debes utilizar getters y setter en casi todas partes, incluso dentro de la clase. Si no lo hace, entonces potencialmente está rompiendo la encapsulación, y lo que es peor, podría invalidar sus invariantes.

Como un simple ejemplo en C++:

class BankAccount 
{ 
public: 
    void withdraw(int amount) 
    { 
     m_balance -= amount; 
     m_withdrawals++; 
    } 

    void transfer(BankAcount& other, int amount) 
    { 
     m_balance -= amount; 
     other.m_balance += amount; 
    } 

private: 
    int m_balance; 
    int m_withdrawals; 
}; 

Ver el error? transfer retira dinero, pero no incrementa m_withdrawals. Esto podría haberse evitado si simplemente llama al withdraw en lugar de disminuir manualmente el saldo.

Lo mismo se aplica a getters y setters. Por ejemplo, es bastante común tener captadores que inicializan perezosamente sus valores. Si otra función miembro intenta acceder al miembro no inicializado directamente, obtendrá una desreferencia de puntero nulo.

Básicamente, siempre debe intentar utilizar los getters y setters siempre que proporcionen la funcionalidad que desean. Mientras más cosas de bajo nivel haga, más errores de bajo nivel tendrá. No tiene sentido escribir getters y setters si no los va a usar.

+1

Creo que ha descrito el ejemplo no para getters/setters sino encapsulación –

+0

Getters y setters * son * encapsulación: ese es su propósito. –

+0

"Getters y setters son encapsulación" no :) getters y setters rompen la encapsulación. Encapsulation == object no da sus datos (propiedades) afuera. – smentek

1

@GolezTrol

No hay insignia PHP dentro del tema y que están equivocados. Lo que describes no tiene nada que ver con setters. Puede forzar el tipo de parámetro (en PHP) utilizando cualquier método, no solo un setter.

Se puede escribir:

setX(X $x){ ...} 
setY(Y $y){ ...} 

o simplemente:

iAmMethodNotASetter(X $x, Y $y){ 

    //20lines of code here end then: 

    $this->x = $x; 
    $this->y = $y; 
    } 

como se ve que no necesitaba para hacer cumplir los emisores tipo de propiedades del objeto.

Y el error de lanzamiento en setter después de comprobar el tipo de variable es una mala idea de todos modos. Es un error común de los programadores que hicieron la transición del idioma estáticamente tipado al tipo de lenguaje dinámico.

Setters y geters son CONVENCIÓN y no hacen cumplir nada! Hoy usualmente los usamos para la creación de Plain Old Java Objects. (POJO - en php palabra POPO) Por lo tanto, es solo una convección (estándar) para la creación de objetos que puede usarse entre bibliotecas o proyectos.

Puede combinar arregladores con comprobación de tipos o lo que sea, pero no los hace un poco más de lo que realmente son.

Acerca de encapsulación:

@ org.life.java - Jigar Joshi

"La principal ventaja/propósito es encapsulación de los que elaboran getter,"

@Peter Alexander

"Se supone que debes usar los captadores y setter en casi todas partes, incluyendo dentro "la clase. Si no lo hace, entonces usted es potencialmente romper la encapsulación" 'getters y setters son encapsulación'

Mal, mal, mal. encapsulación no tiene nada que ver con los captadores y definidores y se es un error muy común. Sé que hay muchos artículos que se repiten una y otra vez ...
Los getters y setters no ayudan a la encapsulación aún peor, pueden romper la encapsulación. Lo hacen cuando los usas para obtener un poco datos del objeto en lugar de pedirle al objeto que haga algo por usted con sus propios datos.

Encapsulation == object asume total responsabilidad por sus datos y no le da los datos de fila. Y obtener una propiedad privada no es más que hacer que esa propiedad sea pública de manera complicada ===================================

Chceck párrafo encapsulación: http://en.wikipedia.org/wiki/C%2B%2B o http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 Ni siquiera una palabra sobre los emisores o captadores ...

+0

Del wiki: "[Encapsulación es] Un constructo de lenguaje que facilita la agrupación de datos con los métodos (u otras funciones) que operan en esos datos". Getters y setters son los métodos que se incluyen en una clase para operar en sus datos. De todos modos, te di un -1 porque no respondiste la pregunta y solo publicaste para hostigar a los otros que respondieron. Use comentarios para eso. –

+0

Puedes darme el punto que quieras solo por favor lee el libro ... – smentek

+0

+ 1.Aunque eres un poco nervioso, estás presentando un punto de vista interesante. Tengo que leer un poco más sobre esto. Gracias –

Cuestiones relacionadas