¿Podemos decir que los objetos tienen atributos, estados y comportamientos?

15

Estaba leyendo la introducción de Oracle a los conceptos de OOP y encontré esta descripción:

  

Los objetos del mundo real comparten dos características: todos tienen estado y   comportamiento. Los perros tienen estado (nombre, color, raza, hambre) y comportamiento   (ladrando, recogiendo, moviendo la cola). Los objetos de software son conceptualmente.   similares a los objetos del mundo real: también consisten de estado y relacionados   comportamiento.

Mi problema con ese pasaje es que al describir estado , también se mezclan atributos . Por ejemplo, el nombre y el color de un perro son sus atributos, mientras que el hambre o la sensación son sus estados.

En mi opinión, es más preciso dividir las características de los objetos en tres partes: atributos, estados y comportamientos .

Claro, al traducir esto a un lenguaje de programación puedo ver que la partición triple se convierte en una doble, porque tanto los atributos como los estados se almacenarán en campos / variables, mientras que los comportamientos se almacenarán en métodos / funciones .

Pero, hablando conceptualmente, tiene más sentido tener las 3 cosas separadas.

Aquí hay otro ejemplo: considera una lámpara. En mi opinión, decir que tanto el tamaño de la lámpara como si está encendida o no son estados es una exageración. El tamaño de la lámpara es un atributo, no un estado, mientras que la activación o desactivación es un estado.

¿O me perdí algo?

    
pregunta Daniel Scocco 05.01.2012 - 17:37
fuente

6 respuestas

13

Tiene razón en que los objetos consisten en atributos, estados y comportamiento, si define atributos para significar características no cambiantes de una instancia. De hecho, es importante hacer esta distinción, porque existen objetos que contienen atributos solo (en su sentido) y ningún estado; se denominan inmutable y son muy útiles para la programación.

Esta definición de tres partes está representada en los lenguajes de programación, por ejemplo, usando la palabra clave final en Java o la palabra clave readonly en C # para denotar datos de instancia que pueden no cambiar durante la vida útil de la instancia.

Sin embargo, tengo que agregar que los datos de la instancia que no cambian generalmente no se llaman atributos. Tendemos a hablar de ellos como "final" o "solo lectura" o "datos constantes" según el idioma que utilicemos. El término apropiado para ellos sería "invariantes", pero entonces esta palabra no se usa con frecuencia en este sentido; se usa más a menudo para otras cosas.

    
respondido por el Mike Nakis 05.01.2012 - 18:05
fuente
4

Creo que es más exacto decir que los objetos tienen solo dos características. Tomando el ejemplo de Oracle:

  

Los perros tienen estado (nombre, color, raza, hambre) y comportamiento (ladrar, ir a buscar, mover la cola). Los objetos de software son conceptualmente similares a los objetos del mundo real: también consisten en estado y comportamiento relacionado.

El hecho de que los valores (estado) para nombre, color, raza y hambre estén almacenados en el objeto en los atributos es un detalle de la implementación. Realmente no necesitas atributos en absoluto.

Si vas a incluir atributos como una tercera característica, entonces también deberías incluir métodos como una cuarta, ya que los comportamientos (como el estado) de los objetos también pueden cambiar. Estado y comportamiento son dos características abstractas de los objetos. Los atributos y métodos son implementaciones concretas de esos conceptos.

    
respondido por el Bill the Lizard 05.01.2012 - 18:38
fuente
1

El estado es un conjunto de atributos y valores correspondientes, por lo que, desde mi punto de vista, no tienes razón (y estás creando una complejidad adicional innecesaria a la definición simple).

    
respondido por el Pavel Bucek 05.01.2012 - 17:42
fuente
0

Podemos clasificar las cosas de innumerables maneras y cada clasificación no tendría una "respuesta correcta". Hay un beneficio en clasificar las cosas solo si la clasificación conduce a un entendimiento más profundo o a mejorar la comunicación. Si su equipo prefiere usar los términos atributos, estados y funciones y tiene buenas definiciones de trabajo, esto ayudará a mejorar la comunicación interna, pero debe ser flexible cuando se comunique fuera de este grupo.

Los conceptos "hambriento" y "sediento" pueden derivarse de atributos básicos (p. ej., glucosa en la sangre, nivel de hidratación), por lo que podríamos pensar en el estado como un meta-atributo que se deriva de los atributos básicos que podemos cambiar a True o Falso basado en el estado de atributos base relevantes. Para el ejemplo de la luz, podríamos pensar que la luz tiene los atributos applied_voltage y resistance y las funciones voltage_switch() y shine() . El voltage_swich() es entonces una función de alguna entrada (por ejemplo, interruptor manual, luz, temporizador, etc.) y shine() es una función de applied_voltage y resistance . Podríamos declarar un meta-atributo llamado light_state que es Verdadero o Falso para ayudar a construir mentalmente el objeto, pero al final estas ideas son solo construcciones mentales que utilizamos para organizar nuestro trabajo.

    
respondido por el Blane 04.05.2017 - 22:17
fuente
-2

El estado de un objeto está codificado en sus atributos, ya sea directa o indirectamente. Por ejemplo, si quieres que tu perro tenga sed, puedes dejar que tenga un

private boolean thirsty;

Alternativamente, puedes dejar que tenga algo como

private Date lastDrinkAt;

y concluye si tu instancia de perro tiene sed comparando la hora actual con la hora en que bebió algo.

De cualquier manera, el estado de sus objetos se encuentra dentro de sus atributos.

Luego hay clases que no tienen atributos, principalmente clases de utilidad. Pero, por lo general, tampoco desea crear una instancia de ellos en este caso.

Para poder razonar sobre las afirmaciones, los científicos generalmente se atienen al principio de minimalidad. Creo que por eso Oracle no mencionó explícitamente el estado. Se puede derivar del valor de los atributos.

    
respondido por el Raku 05.01.2012 - 17:44
fuente
-3

Las conexiones del mundo real son erróneas. Así es como lo enseñaría (enfoque de c ++):

  1. Las computadoras admiten dos formatos de almacenamiento diferentes: datos y código
  2. los datos se parecen a los bits 010101010101
  3. el código se parece a las instrucciones de asm
  4. los bits de datos tienen dos valores diferentes, es 0 o 1
  5. los datos se resumen en tipos de datos: int i = 1; es solo una notación corta a algunos bits 0000001
  6. el código se verá como una función: int f (int a) {return a + a + a; } es una notación corta para algunas instrucciones de asm
  7. cuando tiene varias variables, las combina en una estructura: int a; flotar b; se puede colocar en una estructura AB {int a; flotar b; };
  8. cuando combinas algunos fragmentos de código, obtienes una clase: class ABf {int a; flotar b; suma flotante (float c) const {return a + b + c; }};
  9. Luego, para los datos tenemos nombres de variables que se pueden usar para encontrar el valor:    a + b + c para acceder a los datos.
  10. Y luego tenemos llamadas de función normales:  int k = f (10); para acceder a las instrucciones de ASM "almacenadas" dentro de la función f.
  11. Luego hay instancias de objetos:  ABf var;
  12. Y la función miembro llama:  int k2 = var.sum (10.0);
  13. las funciones tienen tipos int f (int);
  14. las funciones miembro tienen tipos int ABf :: sum (float);
  15. Hay un puntero con el tipo ABf *
  16. las variables como ayb y c dependen del contexto, si están dentro de la función miembro, podrían significar esto - > b, o simplemente b.
  17. Funciones miembro int ABf :: sum (float c) es solo una notación corta para int sum (ABf * this, float c);
  18. la palabra "estado" simplemente significa lo mismo que datos
  19. la palabra "comportamiento" significa lo mismo que código
  20. la palabra "atributo" significa lo mismo que datos.

Así que realmente no hay nada diferente entre el estado y el atributo. Es solo una colección aleatoria de bits. Es solo una distinción arbitraria para separarlos. Solo necesito saber para qué sirve el alias.

    
respondido por el tp1 05.01.2012 - 19:00
fuente

Lea otras preguntas en las etiquetas