Restituire un vettore sapendo che conterrà sempre un singolo record per essere coerente con il resto dell'interfaccia?

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

  •  12-11-2019
  •  | 
  •  

Domanda

Sto scrivendo una piccola applicazione del libro di indirizzo e hai un dilemna di progettazione per quanto riguarda l'interfaccia per l'origine dati / backend.

Ho la seguente classe di base astratta per le classi di origine dati:

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() {};

};
.

Di seguito è riportato il mio set di record e il set di record TMY è un typedef su un vettore STL di questi oggetti.

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

};

typedef std::vector<Contact> ContactRecordSet;
.

La mia domanda comporta il tipo di valore di ritorno utilizzato per il metodo DataSource :: getContact () e il metodo DataSource :: getallContacts () e il metodo di ricerca e il metodo di ricerca da aggiungere presto che otterrà i record in base a una query.

DataSource :: getcontact () restituirà zero o 1 record da quando sto guardando da un ID univoco. DataSource :: getallcontacts () restituirà zero o più contatti. Il prossimo metodo di ricerca restituirà zero o più contatti.

Come ho ora il metodo GetContact () sta restituendo un Auto_ptr a un contatto perché sembrava sprecato restituire un contactrecordset se lo so per certo che non saranno mai più di uno e mi permette di restituire nulla se là non è un record che ha quell'ID.

Sarebbe meglio per getcontact () per restituire un contactrecordset, semplicemente per l'interfaccia per rimanere coerente?

parte di me ACQUE all'idea di restituire una struttura dati come quella per un singolo oggetto, ma d'altra parte è più coerente e la semantica per il controllo se è stato trovato un valore per quell'ID sembra più in linea con il Astrazione complessiva del design (Controllare la lunghezza del recordset restituito vs. Controllare un NULL AUTO_PTR).

Cosa ne pensi?

(Nota - Sono consapevole di essere probabilmente l'eccesso di ingegneria per una semplice applicazione di rubrica, ma voglio che sia facile scambiare diverse estremità secondarie (file flat, sql, ecc ...) Implementare l'interfaccia comune. L'obiettivo è praticare il buon design modulare e la separazione delle preoccupazioni.)

Aggiornamento

Suppongo di poter guardare dalla prospettiva opposta e fare i metodi di registrazione multipli restituire AUTO_PTRS a Contactrecordset Objectcs. In questo modo A) è coerente in quanto stai sempre ricevendo un puntatore a un oggetto e B) non hai il sovraccarico di restituire un STD :: Vector se il set di record è vuoto, restituisce semplicemente un puntatore NULL. .

È stato utile?

Soluzione

Seguo sempre il principio di progettazione di restituisce la cosa meno complessa che definisce il tuo oggetto. I vettori sono pensati per contenere elenchi di cose non singoli e mentre potrebbe rendere la semantica simmetrica sarà indubbiamenteNon intuitivo per un altro sviluppatore.

Altri suggerimenti

Cosa è coerente di restituire un tipo plurale per una funzione non plurale?

Penso che tu abbia bisogno di lavorare con una definizione diversa di "coerenza".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top