Responsabilidad de clase, ¿a mi clase de 'Objeto móvil' realmente le importa que se esté moviendo?

Me gustaría alguna orientación sobre qué clase debe contener cierta información. Si tengo un 'Objeto móvil' que se mueve dentro de un 'Objeto espacial', ¿realmente le importa al Objeto móvil dónde está dentro del Objeto espacial, qué tan rápido se mueve y en qué dirección?

Ciertamente, parece conveniente asignar una propiedad al objeto móvil para 'Ubicación', pero no creo que realmente tenga ninguna preocupación por eso. Así que se me ocurrió:

class Mobile
    {        
        //some properties/fields/etc

        event EventHandler<MovementEventArgs> move;

        public void Move(Vector direction)
        {
            raiseMove(direction);
        }

        private raiseMove(Vector direction)
        {
            EventHandler<MovementEventArgs> handler = move;
            if (move != null)
                handler(this, New MovementEventArgs(direction));
        }
    }

class Space
    {
        Mobile someObject;
        Vector someObjectLocation;

        public Space()
        {
            someObject = new someObject();
            someObject.Move += HandleMobileMove;
        }

        public void MoveSomeObject(Vector direction)
        {
            someObject.Move(new Vector(1,0));
        }

        private void HandleMobileMove(object sender, MovementEventArgs e)
        {
            someObjectLocation += e.Direction;
        }
    }

Eso está escrito un poco apresuradamente... pero espero que me entienda. En resumen: ¿debe el Móvil tener una ubicación, o el Espacio? ¿Quién debe controlar el movimiento?

preguntado el 12 de junio de 12 a las 19:06

3 Respuestas

En WPF, el objeto Canvas es responsable de conocer la ubicación de sus hijos. Eso le daría credibilidad a su enfoque (que usa una estructura similar a la de una propiedad adjunta).

Si no se siente cómodo con la ubicación almacenada en el objeto espacial, también puede usar el Decorador patrón para adjuntar información adicional a los objetos móviles. Esto le daría la opción de posicionar un objeto o no, sin que le importe al objeto en sí.

Al obtener la colección de niños, puede filtrar solo aquellos objetos que emplean su decorador de ubicación (quizás usando el método de extensión OfType) y hacer lo que necesita con ellos. Tendrás que convertirte al uso de interfaces en lugar de referencias de clases estrictas. Eso probablemente sería algo bueno, sin embargo.

Sin embargo, al final, depende de lo que estén haciendo sus objetos Space y Mobile. Si el objeto espacial muestra los objetos móviles (como el lienzo), necesita conocer la información de ubicación, pero los móviles no. Por otro lado, si los propios móviles están utilizando su información de ubicación para rastrear algo o realizar alguna tarea (y al objeto espacial no le importa, tal vez solo proporcione límites, etc.), entonces puede ser mejor almacenar esa información con ellos.

Para llevar el punto a casa un poco más, hágase esta pregunta: si cambio la ubicación, ¿a quién le importa? Un Control es WPF generalmente no se ve afectado por sus coordenadas Superior e Izquierda, pero su control de contenedor sí, por lo que tiene sentido almacenar esa información en el contenedor. Si cambia la ubicación de un móvil, ¿tiene algún efecto en el móvil o en cómo hace su trabajo? ¿Se comporta diferente Space si Mobile X se mueve de Y a Z?

Respondido el 12 de junio de 12 a las 19:06

Pensando en términos puramente OOP, diría que estas deberían ser propiedades del objeto móvil de la misma manera que mi posición y velocidad son propiedades mías mientras me muevo por el espacio. Si su objeto espacial necesita acceder a estas propiedades para verificar los límites, puede recuperarlas de los métodos de obtención públicos en las instancias móviles.

Respondido el 13 de junio de 12 a las 00:06

Aquí es precisamente donde me quedo colgado, y quizás demasiado filosófico. Estoy completamente de acuerdo en que la velocidad es una propiedad del objeto móvil, lo que contribuyó a que permitiera que el objeto móvil se moviera solo. Moverse a x pies/s es constante. La posición, sin embargo, es un concepto muy relativo. En un vacío total donde sólo existo yo, puedo tener una velocidad. Sin embargo, mi posición no se puede definir, ya que es un concepto relativo. Entonces, desde mi percepción de un punto de vista purista, un objeto no puede tener una posición en sí mismo, debe requerir otro objeto para proporcionar el contexto necesario para la definición. - Michael

@Michael: definitivamente lo estás pensando demasiado, una aflicción que a menudo sufro. Al final del día, este es el código que necesita mantener. Colóquelo donde pueda encontrarlo más fácilmente y donde tendrá los recursos (variables, propiedades, funciones, etc.) disponibles para realizar el trabajo. - JDB

Tu argumento es lógico, pero piensa en el despilfarro de someObject.Move += HandleMobileMove; y su implementación (someObjectLocation +=): esencialmente estás desperdiciando el this puntero. Tu Mobile ciertamente tiene una relación 1:1 con su Location y esperaría un Space clase para tener una relación 1:M con Mobile (a menos que solo tenga 1 objeto en el espacio). En su diseño, eso requiere su Space para mantener la asociación de Mobile a Location, lo cual es engorroso, especialmente porque la alternativa es simplemente hacer Location un elemento de tu Mobile.

Respondido el 13 de junio de 12 a las 00:06

Estoy de acuerdo, todo se siente pesado. En este caso, incluso si decidiera que el objeto móvil 'no debería' mantener su posición, probablemente lo dejaría de todos modos. Obsesionarse con la teoría mientras se ignoran las implicaciones prácticas rara vez es algo bueno. - Michael

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.