Duda de diseño.

Iniciado por DanteInfernum, 23 Julio 2013, 21:41 PM

0 Miembros y 4 Visitantes están viendo este tema.

DanteInfernum

Estoy haciendo un ejercicio, el cual pide crear el sitio web de una empresa de seguros. Tengo una clase Empresa, la cual implementa métodos para gestionar las clases CorredorSeguros y Cliente. Estas dos últimas clases no tienen nada en común, salvo el atributo nombre.

Ahora, mi preguta: ¿Qué es mas conveniente? ¿Utilizar dos listas genéricas en mi clase Empresa para coleccionar por separado objetos de las clases CorredorSeguros y Cliente? ¿O en cambio, utilizar sólo una lista para coleccionar instancias de ambas clases?

Si colecciono los objetos de cada una de las clases por separado, tendría que implementar métodos específicos para cada una de las dos colecciones; en cambio, si los colecciono en una única lista, me ahorro implementar algunos métodos, pero en cambio debería hacer unos cuantos casteos. Y esta única lista sería de tipo Persona, una clase base que la crearía únicamente para derivar de ella mis clases CorredorSeguro y Cliente. Pero como dije, no tienen nada en común, sería una herencia forzosa, ya que la clase base (Persona) sería prácticamente una clase vacía.

Pongo un ejemplo para que todo sea más entendible:

Coleccionando por separado.

class Empresa
    {
        List<CorredorSeguros> listaCorredores;
        List<Cliente> listaClientes;

        public void AgregarCorredor(CorredorSeguros c)
        { }

        public CorredorSeguros BuscarCorredor(string nombre)
        { }

        public void AgregarCliente(Cliente c)
        { }

        public Cliente BuscarClientes(double ci)
        { }
    }

    class CorredorSeguros
    {
        string usuario;
    }

    class Cliente
    {
        double cedulaIdentidad;
    }


Coleccionando en una única lista genérica de tipo Persona.

class Empresa
    {
        List<Persona> lista;

        public void Agregar(Persona p)
        { }

        public Persona Buscar(string usuario)
        { }

        public Persona Buscar(double ci)
        { }
    }

    class Persona
    { }

    abstract class CorredorSeguros : Persona
    {
        string Usuario;
    }

    class Cliente : Persona
    {
         double cedulaIdentidad;
    }



O sea, lo que gano por un lado lo pierdo por el otro... En el ejemplo, me ahorro implementar dos veces el método Agregar(). Por otra parte, en cuanto al método Buscar(), debo andar verificando si cada elemento de la lista es del tipo que estoy buscando,y después tengo que castear lo que me devuelve el método.

Novlucker

Lo haría por separado, incluso los métodos "Buscar" son diferentes, así que no me parece que valga la pena forzar una herencia solo para acumular todo en el mismo sitio.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Keyen Night

No vale la pena que implementes una herencia nada más con una propiedad de por medio, además el código tiende a complejidad cuando combinas varios tipos herederos en una lista, la lógica que tienes que aplicar termina siendo absurda, es mejor que tengas tus dos listas separadas, más fácil, más comprensible y de mejor practica que forzar una herencia de una sola propiedad...
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

DanteInfernum

Ok. Muchísimas gracias a ambos por la pronta respuesta.
Conclusión: Evitando esta herencia innecesaria, en un primer momento debo implementar algunos métodos más, pero de esta forma me ahorro muchos problemas de cabeza a futuro.

Saludos.

DanteInfernum

Tengo otra pequeña consulta (aunque ya no tiene mucho que ver con el título del tema...):

Ahora tengo una clase con dos listas genéricas, y me gustaría acceder a los elementos de cada una de ellas a través de un indizador. El problema está en que cada clase no permite tener más de un indizador. Lo que se puede hacer es sobrecargarlo, pero el parámetro sería el mismo, un entero que indique la posición dentro de la lista, así que esto tampoco me sirve.

¿Puede ser que la única forma de conseguir un comportamiento parecido al de un indizador sea implementando funciones tales como GetCorredor(int i) y GetCliente(int i) para que me devuelvan los elementos de cada lista?

Keyen Night

La clase forma una capa sobre el objeto list, cualquier función, propiedad o método que quieras exponer tienes que hacerlo tu mismo, ya que no puedes acceder a ningún miembro del objeto list externamente, debido a que este es privado.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

DanteInfernum

Sí, eso lo entiendo bien. Pero por razones de practicidad, quiero acceder a las listas desde afuera de la clase, pero manteniendo la misma notación que uso para acceder a los elementos de cada lista dentro de la clase misma (esto es, acceder a los elementos de cada lista a través de un índice encerrado entre paréntesis rectos [int i]). Esto lo logro a través de un indizador.
El problema es que necesitaría implementar dos en una misma clase.

Sería algo así:

class Empresa
    {
        List<CorredorSeguros> listaCorredores;
        List<Cliente> listaClientes;

        public CorredorSeguros this[int i]
        {
            get { return listaCorredores[i]; }
        }

        public Cliente this[int i]
        {
            get { return listaClientes[i]; }
        }
    }


Esto no es posible en C#, el compilador me va a tirar un error por ambos índices tener el mismo parámetro.

Y mi pregunta era cual sería una solución alternativa para conseguir un comportamiento similar.

Lo más parecido que se me ocurre hacer es:

class Empresa
    {
        List<CorredorSeguros> listaCorredores;
        List<Cliente> listaClientes;

        public CorredorSeguros getCorredorSeguros(int i)
        {
            return listaCorredores[i];
        }

        public Cliente getCliente(int i)
        {
            return listaClientes[i];
        }
    }


O sea, hacer una función para cada lista que me devuelva sus elementos.
Pero quería saber si hay alguna otra opción, o que sería lo más recomendado.


Novlucker

Hacer una función para cada lista que te devuelva sus elementos

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

DanteInfernum

Bien. Gracias por las respuestas.

Saludos.