Inizializza oggetto da SqlDataReader

0

A partire da ora, abbiamo due diversi stili di intializzazioni dell'oggetto basate sulla riga SQL nella nostra base di codice:

public Config(SqlDataReader sdr) {
    for (int i = 0; i < sdr.FieldCount; i++) if (!sdr.IsDBNull(i)) {
        switch (sdr.GetName(i)) {
            case 'Id': Id = sdr.GetInt32(i); break;
            ...
        }
    }
}

e

public User(SqlDataReader sdr)
{
    UserId = sdr.GetInt32(0);
    if (!sdr.IsDBNull(1)) Name = sdr.GetString(1);
    ...
}

Sono chiamati così:

while(sdr.Read()) users.Add(new User(sdr));

La guida alla codifica C # dice che lo stile deve essere coerente, quindi uno di loro deve passare all'altro, se non troviamo una ragione per tenerli diversi. Quindi, prima di implementare l'intero progetto con i suoi oltre 50 modelli, abbiamo bisogno di una linea guida di progettazione per questo.

Entrambi i design hanno i loro svantaggi, ma non so come renderlo migliore:

  • Nel primo caso, nessuno se ne accorgerà fino a più tardi nel codice se i campi richiesti vengono eliminati dalla query.
  • Il secondo fallirà ogni volta che i campi nella query saranno riordinati.

Quale preferiremmo o come potremmo migliorarli per ovviare agli inconvenienti? Sono davvero degli svantaggi, in termini di manutenzione / riutilizzo del codice?

    
posta Alexander 02.03.2015 - 11:44
fonte

1 risposta

1

Entrambe le opzioni presentano degli svantaggi: la prima dipende dalla "stringa magica" del nome della colonna, la seconda dipende dal "numero magico" dell'indice della colonna. Una buona suite di strumenti automatici può coprire l'utilizzo e aiutare molto a prevenire i cambiamenti improvvisi ...

Personalmente preferirei il primo per una serie di motivi, ma probabilmente sono molto personali. (In realtà, preferirei NON scrivere questo tipo di codice e usare un OR / M, ma questo non rende questa domanda meno valida)

Nomi dei campi ricercabili

I nomi dei campi possono essere trovati usando Trova nei file. 'Id' è ovviamente molto generico, ma immagino che se vuoi rimuovere una colonna chiamata 'OrderPaymentTerm' puoi facilmente cercare gli usi nel codice. O ancora meglio, inserisci i nomi dei campi in costanti che fanno parte della classe che crea la query. In questo modo, i nomi dei campi e gli usi sono uno accanto all'altro.

La convalida dei campi obbligatori è semplice

Se vuoi assicurarti che tutti i campi siano presenti nella query, tieni semplicemente un elenco di campi che leggi da SqlDataReader e genera un'eccezione se manca un campo.

L'ordine delle colonne non dovrebbe importare

Nessuno si aspetta che una modifica nell'ordinamento delle colonne in una clausola SELECT sia una modifica irrisolta. E se usi SELECT * FROM, non puoi comunque controllare l'ordinamento delle colonne.

La rimozione di una colonna è meno dolorosa

Se si rimuove la sesta colonna in una SELECT a dieci colonne, è necessario aggiornare tutti gli indici nel secondo caso. Doloroso e soggetto a errori.

    
risposta data 02.03.2015 - 14:44
fonte

Leggi altre domande sui tag