¿Cómo accedería a las propiedades de objetos desde un método de objeto? [cerrado] -- java campo con php campo con oop campo con theory camp Relacionados El problema

How would you access Object properties from within an object method? [closed]


98
vote

problema

Español
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las respuestas sean apoyadas por hechos, referencias o experiencia, pero esta pregunta probablemente solicitará un debate, argumentos, sondeos o discusión extendida. Si cree que esta pregunta se puede mejorar y posiblemente reabierto, visite el centro de ayuda para la orientación.
cerrado 8 años .

¿Cuál es la forma "purista" o "correcta" de acceder a las propiedades de un objeto desde dentro de un método de objeto que no es un método de Getter / Setter?

Sé que desde fuera del objeto, debe usar un Getter / Setter, pero desde adentro, solo hará:

java:

  String property = this.property;   

PHP:

  $property = $this->property;   

o harías:

java:

  String property = this.getProperty();   

PHP:

  $property = $this->getProperty();   

Perdóname si mi Java está un poco apagado, ha pasado un año desde que programé en Java ...

Editar:

Parece que las personas están asumiendo que estoy hablando de variables / propiedades privadas o protegidas solamente. Cuando aprendí Oo, me enseñaron a usar Getters / Setters por cada propiedad, incluso si era público (y en realidad me dijeron que nunca hagas ninguna variable / propiedades pública). Por lo tanto, puedo estar comenzando desde un supuesto falso de la oportunidad de obtener. Parece que las personas que responden a esta pregunta son, tal vez diciendo que debe tener propiedades públicas y que aquellas no necesitan getters y planteros, lo que va en contra de lo que me enseñaron, y de lo que estaba hablando, aunque tal vez se debe discutir como bien. Probablemente sea un buen tema para una pregunta diferente, aunque ...

Original en ingles

What is the "purist" or "correct" way to access an object's properties from within an object method that is not a getter/setter method?

I know that from outside of the object you should use a getter/setter, but from within would you just do:

Java:

String property = this.property; 

PHP:

$property = $this->property; 

or would you do:

Java:

String property = this.getProperty(); 

PHP:

$property = $this->getProperty(); 

Forgive me if my Java is a little off, it's been a year since I programmed in Java...

EDIT:

It seems people are assuming I am talking about private or protected variables/properties only. When I learned OO I was taught to use getters/setters for every single property even if it was public (and actually I was told never to make any variable/property public). So, I may be starting off from a false assumption from the get go. It appears that people answering this question are maybe saying that you should have public properties and that those don't need getters and setters, which goes against what I was taught, and what I was talking about, although maybe that needs to be discussed as well. That's probably a good topic for a different question though...

</div
           

Lista de respuestas

62
 
vote
vote
La mejor respuesta
 

Esto tiene un potencial de guerra religiosa, pero me parece que si está usando un Getter / Setter, debe usarlo internamente también, usando ambos conducirá a problemas de mantenimiento en la carretera (por ejemplo, alguien agrega código a un Setter que necesita para ejecutarse cada vez que se establece la propiedad, y la propiedad se está configurando internamente sin ese ajuste que se le llame).

 

This has religious war potential, but it seems to me that if you're using a getter/setter, you should use it internally as well - using both will lead to maintenance problems down the road (e.g. somebody adds code to a setter that needs to run every time that property is set, and the property is being set internally w/o that setter being called).

</div
 
 
     
     
43
 
vote

Personalmente, siento que es importante permanecer consistente. Si tienes constates y colegios, úsalos. La única vez que accedería a un campo directamente es cuando el acceso tiene una gran cantidad de gastos generales. Puede sentir que está hinchando su código innecesariamente, pero ciertamente puede ahorrar una gran cantidad de dolor de cabeza en el futuro. El ejemplo clásico:

Más adelante, puede desear cambiar la forma en que funciona el campo. Tal vez debería calcularse sobre la marcha o quizás le gustaría usar un tipo diferente para la tienda de respaldo. Si está accediendo a propiedades directamente, un cambio así puede romper una gran cantidad de código en un halelo FOOP.

 

Personally, I feel like it's important to remain consistent. If you have getters and setters, use them. The only time I would access a field directly is when the accessor has a lot of overhead. It may feel like you're bloating your code unnecessarily, but it can certainly save a whole lot of headache in the future. The classic example:

Later on, you may desire to change the way that field works. Maybe it should be calculated on-the-fly or maybe you would like to use a different type for the backing store. If you are accessing properties directly, a change like that can break an awful lot of code in one swell foop.

</div
 
 
26
 
vote

Estoy bastante sorprendido de lo unánime, el sentimiento es que getters y los colonos están bien y buenos. Sugiero el artículo incendiario de Allen Holub " Getters and Setters son Mal ". Por supuesto, el título es para el valor de shock, pero el autor hace puntos válidos.

Esencialmente, si tiene getters y setters Para cada campo privado, está haciendo esos campos tan buenos como los públicos. Estaría muy duro para cambiar el tipo de campo privado sin efectos de ondulación a cada clase que llama a ese getter .

Además, desde un punto de vista estrictamente OO, los objetos deben responder a los mensajes (métodos) que corresponden a su responsabilidad única (con suerte). La gran mayoría de getters y setters no tenga sentido para sus objetos constituyentes; Pen.dispenseInkOnto(Surface) tiene más sentido para mí que Pen.getColor() < / Código>.

Los Getters and Setters también alientan a los usuarios de la clase a solicitar algunos datos, realizar un cálculo y luego establecer algún otro valor en el objeto, mejor conocido como programación de procedimientos. Serías mejor servido para simplemente decirle al objeto que hagas lo que estabas yendo en primer lugar; También conocido como el Experto de información Idiom.

Los getters y los colonos, sin embargo, son los males necesarios en el límite de las capas, la PERSISTENCIA, la persistencia, etc. Acceso restringido a las internales de una clase, como la palabra clave amiga de C ++, el paquete de Java, el acceso protegido por el paquete, el acceso interno de .NET y el Patrón de clase de amigos puede ayudarlo a reducir la visibilidad de getters y los colonos para solo aquellos que los necesitan.

 

I'm fairly surprised at how unanimous the sentiment is that getters and setters are fine and good. I suggest the incendiary article by Allen Holub "Getters And Setters Are Evil". Granted, the title is for shock value, but the author makes valid points.

Essentially, if you have getters and setters for each and every private field, you are making those fields as good as public. You'd be very hard-pressed to change the type of a private field without ripple effects to every class that calls that getter.

Moreover, from a strictly OO point of view, objects should be responding to messages (methods) that correspond to their (hopefully) single responsibility. The vast majority of getters and setters don't make sense for their constituent objects;Pen.dispenseInkOnto(Surface) makes more sense to me than Pen.getColor().

Getters and setters also encourage users of the class to ask the object for some data, perform a calculation, and then set some other value in the object, better known as procedural programming. You'd be better served to simply tell the object to do what you were going to in the first place; also known as the Information Expert idiom.

Getters and setters, however, are necessary evils at the boundary of layers -- UI, persistence, and so forth. Restricted access to a class's internals, such as C++'s friend keyword, Java's package protected access, .NET's internal access, and the Friend Class Pattern can help you reduce the visibility of getters and setters to only those who need them.

</div
 
 
19
 
vote

Depende de cómo se use la propiedad. Por ejemplo, digamos que tiene un objeto estudiantil que tiene una propiedad de nombre. Puede usar su método Obtener para eliminar el nombre de la base de datos, si aún no se ha recuperado. De esta manera, usted está reduciendo las llamadas innecesarias a la base de datos.

Ahora digamos que tiene un mostrador de enteros privados en su objeto que cuenta la cantidad de veces que se ha llamado el nombre. Es posible que desee no usar el método Obtener desde el interior del objeto porque produciría un conteo no válido.

 

It depends on how the property is used. For example, say you have a student object that has a name property. You could use your Get method to pull the name from the database, if it hasn't been retrieved already. This way you are reducing unnecessary calls to the database.

Now let's say you have a private integer counter in your object that counts the number of times the name has been called. You may want to not use the Get method from inside the object because it would produce an invalid count.

</div
 
 
   
   
14
 
vote

PHP ofrece una gran variedad de formas de manejar esto, incluidos los métodos mágicos __get y getters0 , pero prefiero los constantes y los colonos explícitos. Aquí está por qué:

  1. Se puede colocar la validación en los colonos (y los constantes de la materia)
  2. IntelliSense trabaja con métodos explícitos
  3. No se pregunta si una propiedad solo se lee, escriba solamente o lectura-escritura
  4. Recuperación de propiedades virtuales (es decir, valores calculados) se ve igual que las propiedades regulares
  5. Puede configurar fácilmente una propiedad de objeto que nunca se define en ninguna parte, que luego se va indocumentada
 

PHP offers a myriad of ways to handle this, including magic methods __get and __set, but I prefer explicit getters and setters. Here's why:

  1. Validation can be placed in setters (and getters for that matter)
  2. Intellisense works with explicit methods
  3. No question whether a property is read only, write only or read-write
  4. Retrieving virtual properties (ie, calculated values) looks the same as regular properties
  5. You can easily set an object property that is never actually defined anywhere, which then goes undocumented
</div
 
 
13
 
vote

¿Estoy pasando por la borda aquí?

Tal vez;)

Otro enfoque sería utilizar un método privado / protegido para hacer la obtención (caching / db / etc), y una envoltura pública para ella que incrementa el conteo:

PHP:

  getters111  

y luego desde dentro del propio objeto:

PHP:

  getters2  

De esta manera, todavía puede usar ese primer argumento para otra cosa (como enviar una bandera para que quizás haya o no datos en caché aquí).

 

Am I just going overboard here?

Perhaps ;)

Another approach would be to utilize a private/protected method to actually do the getting (caching/db/etc), and a public wrapper for it that increments the count:

PHP:

public function getName() {     $this->incrementNameCalled();     return $this->_getName(); }  protected function _getName() {     return $this->name; } 

and then from within the object itself:

PHP:

$name = $this->_getName(); 

This way you can still use that first argument for something else (like sending a flag for whether or not to used cached data here perhaps).

</div
 
 
12
 
vote

Debe estar perdiendo el punto aquí, ¿por qué usaría un Getter dentro de un objeto para acceder a una propiedad de ese objeto?

Tomando esto a su conclusión El Getter debe llamar a un Getter, que debe llamar a un Getter.

Entonces, diría que dentro de un método de objeto Acceda a una propiedad directamente, especialmente al ver que llamando a otro método en ese objeto (que simplemente accederá a la propiedad directamente de todos modos, de todos modos, devolverlo) es solo un ejercicio inútil y inútil (o tengo i malinterpretó la pregunta).

 

I must be missing the point here, why would you use a getter inside an object to access a property of that object?

Taking this to its conclusion the getter should call a getter, which should call a getter.

So I'd say inside an object method access a property directly, especially seeing as calling another method in that object (which will just access the property directly anyway then return it) is just a pointless, wasteful exercise (or have I misunderstood the question).

</div
 
 
 
 
8
 
vote

La forma de OO purista es evitar tanto y seguir la Ley de Demeter mediante el uso de la Dile a No preguntes Enfoque.

en lugar de obtener el valor de la propiedad del objeto, que Muy parejas La clase dos, use el objeto como un parámetro, por ejemplo,

    doSomethingWithProperty() {      doSomethingWith( this.property ) ;   }   

Donde la propiedad fue un tipo nativo, por ejemplo. INT, use un método de acceso, llame para el dominio problemático, no el dominio de programación.

    doSomethingWithProperty( this.daysPerWeek() ) ;   

Estos le permitirán mantener la encapsulación y las invariantes de posteriores a las condiciones o dependientes. También puede usar el método de ajuste para mantener las invariantes de pre-condiciones o dependientes, sin embargo, no caigan en la trampa de nombrarles los colonos, regrese al principio de Hollywood para nombrar cuando se usa el IDIOM.

 

The purist OO way is to avoid both and follow the Law of Demeter by using the Tell Don't Ask approach.

Instead of getting the value of the object's property, which tightly couples the two class, use the object as a parameter e.g.

  doSomethingWithProperty() {      doSomethingWith( this.property ) ;   } 

Where the property was a native type, e.g. int, use an access method, name it for problem domain not the programming domain.

  doSomethingWithProperty( this.daysPerWeek() ) ; 

These will allow you to maintain encapsulation and any post-conditions or dependent invariants. You can also use the setter method to maintain any pre-conditions or dependent invariants, however don't fall into the trap of naming them setters, go back to the Hollywood Principle for naming when using the idiom.

</div
 
 
8
 
vote

Es mejor usar los métodos de accesorios, incluso dentro del objeto. Aquí están los puntos que vienen a mi mente inmediatamente:

  1. Se debe hacer en interés de mantener la consistencia con los accesos hechos de fuera del objeto.

  2. En algunos casos, estos métodos de accesorios podrían estar haciendo más que simplemente acceder al campo; Podrían estar haciendo algún procesamiento adicional (esto es raro). Si este es el caso, acceder a el campo directamente significaría que le está perdiendo ese procesamiento adicional, y su programa podría pasar por error si este procesamiento siempre debe realizarse durante esos accesos.

 

It is better to use the accessor methods, even within the object. Here are the points that come to my mind immediately:

  1. It should be done in the interest of maintaining consistency with accesses made from outside the object.

  2. In some cases, these accessor methods could be doing more than just accessing the field; they could be doing some additional processing (this is rare though). If this is the case, accessing the field directly would mean that you are missing that additional processing, and your program could go awry if this processing is always to be done during those accesses.

</div
 
 
8
 
vote

Si te refiere "la mayoría de la encapsulación" por "purista", entonces típicamente declaro todos mis campos como privados y luego use "este.field" desde la clase en sí. Para otras clases, incluidas las subclases, accede a la instancia de estado utilizando los Getters.

 

If you mean "most encapsulation" by "purist", then I typically declare all my fields as private and then use "this.field" from within the class itself. For other classes, including subclasses, I access instance state using the getters.

</div
 
 
7
 
vote

He encontrado usando Setters / Getters hizo que mi código sea más fácil de leer. También me gusta el control que da cuando otras clases usan los métodos y, si cambio los datos, la propiedad almacenará.

 

i've found using setters/getters made my code easier to read. I also like the control it gives when other classes use the methods and if i change the data the property will store.

</div
 
 
7
 
vote

campos privados con propiedades públicas o protegidas. El acceso a los valores debe pasar por las propiedades y copiarse a una variable local si se utilizarán más de una vez en un método. Si y solo si tiene el resto de su solicitud, así que se modifica totalmente, se meció y, de lo contrario, se optimiza cuando acceder a los valores pasando a través de sus propiedades assoscadas se ha convertido en un cuello de botella (y que nunca sucederá, lo garantizo) si empiece Para considerar dejar algo más que las propiedades, toquen sus variables de respaldo directamente.

.NET Los desarrolladores pueden usar propiedades automáticas para hacer cumplir esto, ya que ni siquiera puede ver las variables de respaldo en el tiempo de diseño.

 

Private fields with public or protected properties. Access to the values should go through the properties, and be copied to a local variable if they will be used more than once in a method. If and ONLY if you have the rest of your application so totally tweaked, rocked out, and otherwise optimized to where accessing values by going through their assosciated properties has become a bottleneck (And that will never EVER happen, I guarantee) should you even begin to consider letting anything other than the properties touch their backing variables directly.

.NET developers can use automatic properties to enforce this since you can't even see the backing variables at design time.

</div
 
 
7
 
vote

depende. Es más un problema de estilo que cualquier otra cosa, y no hay una regla difícil.

 

It depends. It's more a style issue than anything else, and there is no hard rule.

</div
 
 
7
 
vote

Puedo estar equivocado porque soy autodidact, pero nunca los usuarios de los usuarios en mis clases de Java, siempre son privadas o protegidas, de modo que el código externo debe acceder por FETTERS / SONTTERS. Es mejor para fines de mantenimiento / modificación. Y para el código de clase interior ... Si el método de Getter es trivial, utilizo la propiedad directamente, pero siempre uso los métodos del programa, ya que puedo agregar código para incendiar los eventos si deseo.

 

I can be wrong because I'm autodidact, but I NEVER user public properties in my Java classes, they are always private or protected, so that outside code must access by getters/setters. It's better for maintenance / modification purposes. And for inside class code... If getter method is trivial I use the property directly, but I always use the setter methods because I could easily add code to fire events if I wish.

</div
 
 
7
 
vote

Si no edito la propiedad, usaré un método público get_property() a menos que sea una ocasión especial, como un objeto MySQLI dentro de otro objeto en qué caso solo haré la propiedad público y consulte ello como $obj->object_property .

Dentro del objeto, siempre es $ este- & gt; propiedad para mí.

 

If I don't edit the property, I'll use a public method get_property() unless it's a special occasion such as a MySQLi object inside another object in which case I'll just make the property public and refer to it as $obj->object_property.

Inside the object it's always $this->property for me.

</div
 
 
5
 
vote

Bueno, parece con la implementación predeterminada de las propiedades de C # 3.0, la decisión se toma para usted; Tienes que configurar la propiedad usando el (posiblemente privado) establecido en la propiedad.

Solo uso personalmente el miembro privado, detrás al no hacerlo, lo que el objeto causaría caer en un estado menos que deseable, como cuando se inicia o cuando la carga de caché / perezosa está involucrada.

 

Well, it seems with C# 3.0 properties' default implementation, the decision is taken for you; you HAVE to set the property using the (possibly private) property setter.

I personally only use the private member-behind when not doing so would cause the object to fall in an less than desirable state, such as when initializing or when caching/lazy loading is involved.

</div
 
 
5
 
vote

Me gusta la respuesta por cmcculoh , pero parece que la más correcta es la respuesta por GREG HURLMAN . Use GETTER / SETTER todo el tiempo si comenzó a usarlos desde el acceso y / o usted está acostumbrado a trabajar con ellos.

Como aparte, personalmente encuentro que el uso de Getter / Setter hace que el código sea más fácil de leer y depurar más tarde.

 

I like the answer by cmcculloh, but it seems like the most correct one is the answer by Greg Hurlman. Use getter/setter all the time if you started using them from the get-go and/or you are used to working with them.

As an aside, I personally find that using getter/setter makes the code easier to read and to debug later on.

</div
 
 
4
 
vote

Como se indica en algunos de los comentarios: a veces deberías, a veces no deberías. La gran parte de las variables privadas es que puedes ver todos los lugares a los que se usan cuando cambias algo. Si su Getter / Setter hace algo que necesita, utilícelo. Si no importa, decida.

Se podría hacer que el caso opuesto se podría hacer que si usa el Getter / Setter y alguien cambia el Getter / Setter, tienen que analizar todos los lugares, el Getter y el Setter se usan internamente para ver si se limita a algo.

 

As stated in some of the comments: Sometimes you should, sometimes you shouldn't. The great part about private variables is that you are able to see all the places they are used when you change something. If your getter/setter does something you need, use it. If it doesn't matter you decide.

The opposite case could be made that if you use the getter/setter and somebody changes the getter/setter they have to analyze all the places the getter and setter is used internally to see if it messes something up.

</div
 
 

Relacionados problema

0  ¿Cuáles son los componentes correctos de los componentes de JavaScript Léxical Environment Object?  ( What are javascript lexical environment objects correct components ) 
Cuando leo sobre el objeto de entorno léxico en este enlace https://blog.bitsrc.io/understion-execution-context-and-execution-stack-in-javascript-1c9ea8642dd...

98  ¿Cómo accedería a las propiedades de objetos desde un método de objeto? [cerrado]  ( How would you access object properties from within an object method ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

10  Generando 'vecinos' para los usuarios basados ​​en la calificación  ( Generating neighbours for users based on rating ) 
Estoy buscando técnicas para generar 'vecinos' (personas con gusto similar) para usuarios en un sitio en el que estoy trabajando; Algo similar a la forma en q...

1  Teoría de la asamblea  ( Assembly theory ) 
Estamos trabajando con la Asamblea. Estoy un poco perdido. Esta es una pregunta de práctica en una guía de estudio: usando máquinas hipotéticas (dirección ...

7  Conceptos clave para aprender en el montaje  ( Key concepts to learn in assembly ) 
Soy un firme creyente en la idea de que una de las cosas más importantes que obtiene de aprender un nuevo idioma no es cómo usar un nuevo idioma, sino el cono...

415  Almacenamiento de imágenes en DB - ¿Sí o Nay?  ( Storing images in db yea or nay ) 
Bloqueado . Esta pregunta y sus respuestas son bloqueadas porque la pregunta es off-topic pero tiene importancia histórica. Actualmente no está a...

1  Cómo convertir un CFG a una máquina de Turing  ( How to convert a cfg to a turing machine ) 
¿Cómo convertir un CFG a un TM? Tengo una idea básica de cómo convertir un DFA a un TM, pero no puedo pensar en una manera de hacerlo correctamente. ¿Puedo ...

56  ¿Podría generarse un número verdaderamente aleatorio utilizando pings a las direcciones IP seleccionadas a pseudo aleatorias?  ( Could a truly random number be generated using pings to pseudo randomly selected ) 
La pregunta planteada se produjo durante una conferencia de ciencia comp para 2 años mientras discutía la imposibilidad de generar números en un dispositivo c...

3  TRABAJO DE TEXTO DE CIENCIA DE COMPUTADORA DE TEXTO / XML / CUALQUIER PERSONAL  ( Computer science text book way to do text xml whatever parsing ) 
ha estado ratificando en mi cerebro por un tiempo. He tenido alguna investigación sobre los compiladores / Flex / BYSON y las cosas, pero nunca encontré una...

1  ¿Hay formularios canónicos para consultas de la base de datos?  ( Are there canonical forms for database queries ) 
Di que quiero hacer un "generador de consulta optimizado". Básicamente, un optimizador de consultas SQL que es mucho mejor de lo que se puede colocar en un se...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos