¿Se debe usar bajo ninguna circunstancia getters-setters de una clase dentro de la clase?Uso de getter-setter dentro de la clase
Respuesta
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
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.
+ 1.Es útil gracias y org.life tiene razón.Intensivamente no agregué una etiqueta específica de idioma –
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.
Creo que ha descrito el ejemplo no para getters/setters sino encapsulación –
Getters y setters * son * encapsulación: ese es su propósito. –
"Getters y setters son encapsulación" no :) getters y setters rompen la encapsulación. Encapsulation == object no da sus datos (propiedades) afuera. – smentek
@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 ...
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. –
Puedes darme el punto que quieras solo por favor lee el libro ... – smentek
+ 1.Aunque eres un poco nervioso, estás presentando un punto de vista interesante. Tengo que leer un poco más sobre esto. Gracias –
- 1. ¿Cómo uso std.functional.memoize dentro de una clase?
- 2. ¿Qué significa el uso de C++ dentro de una clase?
- 3. ¿Para qué sirve crear una clase dentro de la interfaz e interfaz dentro de la clase
- 4. `With` uso dentro de la función (contenedor)
- 5. Uso de la clase Exception en C#
- 6. clase interna dentro de la interfaz
- 7. Alcance variable Dentro de la clase PHP
- 8. Python 2.6: ¿clase dentro de una clase?
- 9. clase jQuery dentro del selector de clase
- 10. Uso de la clase java HttpsURLConnection
- 11. Uso exacto de la clase abstracta
- 12. Uso de la instrucción CASE dentro de la cláusula IN
- 13. PHP dentro de otra clase
- 14. el puntero "this" dentro de una clase
- 15. Uso de punto y coma dentro timeit
- 16. recursión dentro de una clase
- 17. Clase anidada dentro de una interfaz
- 18. ¿Debo usar `this` dentro de una clase?
- 19. El uso de un puntero de función miembro dentro de una clase
- 20. operador de sobrecarga = dentro de la clase de plantilla
- 21. Generadores de prueba de nariz dentro de la clase
- 22. Inicialización de variable de clase estática dentro de la principal
- 23. ¿Por qué no puedo poner una declaración de "uso" dentro de una declaración de clase?
- 24. Uso de NSDate dentro de NSPredicate
- 25. Uso de la lista dentro de un mapa C++
- 26. Excepción de captura dentro Uso de la instrucción
- 27. Uso de CDATA dentro de otro CDATA
- 28. Uso de instrucciones condicionales dentro de 'esperar'
- 29. Uso de métodos de extensión dentro de clase extendida en sí
- 30. Uso de "Clase" en C#
enlace a otro artículo explica esto muy bien. – Knubo
La sugerencia de tipo int no funciona en PHP. – GolezTrol
@Geolez No veo PHP tag por OP, es el concepto de OOP descrito aquí no específico para ningún idioma –