Devuelva un vector Saber que siempre contendrá un registro único para ser consistente con el resto de la interfaz?

StackOverflow https://stackoverflow.com/questions/4980383

  •  12-11-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una pequeña aplicación de la libreta de direcciones y tengo un dilema de diseño con respecto a la interfaz para la fuente de datos / backend.

Tengo la siguiente clase de base abstracta para las clases de origen de datos:

class DataSource
{
    private:

    public:
        virtual std::auto_ptr<Contact> getContact(int id) = 0;
        virtual ContactRecordSet getAllContacts() = 0;
        virtual bool addContact(const Contact& c) = 0;
        virtual bool updateContact(int id, const Contact& c) = 0;
        virtual bool deleteContact(int id)=0;
        virtual ~DataSource() {};

};

A continuación se muestra mi estructura discográfica y el conjunto de grabaciones TMY es un TypedeF a un vector de STL de estos objetos.

class Contact 
{
    public:
        std::string firstName;
        std::string lastName;
        std::string phoneNumber;
        std::string address;
        std::string email;

};

typedef std::vector<Contact> ContactRecordSet;

Mi pregunta implica el tipo de valor de retorno utilizado para el método de DataSource :: GetContact () y el método de DataSource :: getAltContacts () y el método de búsqueda que se agregará pronto que obtendrá registros según una consulta.

DataSource :: GetContact () devolverá cero o 1 registros desde que estoy buscando una identificación única. DataSource :: GetallContacts () devolverá cero o más contactos. El próximo método de búsqueda devolverá cero o más contactos.

Como lo tengo ahora, el método GetContact () está devolviendo un auto_ptr a un contacto porque parecía desperdicio devolver un contactrecordset si sé seguro que nunca serán más de uno y me permite regresar a NULL si allí No hay registro que tenga esa identificación.

¿Sería mejor para GetContact () para devolver un contactrecordSet también, simplemente para que la interfaz permanezca consistente?

Parte de mí Chafes a la idea de devolver una estructura de datos como esa para un solo objeto, pero por otro lado es más consistente y la semántica para verificar si se encontró un valor para que la identificación parezca más en línea con el Abstracción general del diseño (verifique la duración del conjunto de registros devueltos vs. cheque para un null auto_ptr).

¿Qué piensan todos ustedes?

(Nota: soy consciente de que probablemente esté en exceso de ingeniería para una aplicación simple de la libreta de direcciones, pero quiero que sea fácil intercambiar diferentes extremos traseros (archivo plano, SQL, etc.) siempre que Implementar la interfaz común. El objetivo es practicar un buen diseño modular y una separación de preocupaciones.)

actualización

Supongo que podría mirar desde la perspectiva opuesta y hacer que los múltiples métodos de registro devuelvan AUTO_PTRS a los objetos de contactrecordset. De esa manera, a) es consistente en que siempre está obteniendo un puntero a un objeto y b) no tiene la sobrecarga de devolver un STD :: Vector si el conjunto de registros está vacío, simplemente devuelva un puntero nulo.

¿Fue útil?

Solución

Siempre sigo el principio de diseño de devuelve la cosa menos compleja que define su objeto. vectores están destinados a mantener las listas de cosas que no son un elemento único y, mientras que puede hacer que la semántica sea simétrica, sin duda seráNo juisivo para otro desarrollador.

Otros consejos

¿Qué es consistente acerca de devolver un tipo plural para una función no plural?

Creo que necesita estar trabajando con una definición diferente de "consistencia".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top