Dove devo mantenere i nomi delle stored procedure nel mio codice?

6

Ho preso in mano del codice al lavoro che ha un file di repository del database che mantiene costanti i nomi delle stored procedure. Il file ha il seguente aspetto:

class DatabaseRepository
{
    private const string SP_GET_EMPLOYEES = "GetEmployees";
    private const string SP_GET_DEPARTMENTS = "GetDepartments";
    private const string SP_GET_MANAGERS = "GetManagers";
    // Many more stored procedure constants ...

    public EmployeeList GetEmployees()
    {
        return RunCommand(DatabaseRepository.SP_GET_EMPLOYEES);
    }

    //more methods below that call the stored procedures
}

Trovo fastidioso trattare queste costanti quando sto lavorando sul confine tra il codice e le stored procedure.

  1. Se voglio sapere quale stored procedure sta usando un metodo, devo scorrere verso l'alto o go-to-definition per la costante. Di solito devo tornare indietro o cercare il metodo in questione perché potrei lavorare su quel metodo.

  2. Andando nella direzione opposta, se voglio sapere quale metodo chiama una determinata stored procedure (di solito c'è solo una), devo cercare il codice per il nome della stored procedure, copiare il nome della costante di stringa, e poi cerca il codice per quella costante di stringa.

In entrambi i casi # 1 e # 2, potrei impedire la ricerca e lo scorrimento e andare alla definizione se i nomi delle stored procedure non erano stringhe costanti ma erano effettivamente codificati come stringhe magiche nei metodi stessi.

Questo approccio mi piace di più:

class DatabaseRepository
{
    public EmployeeList GetEmployees()
    {
        return RunCommand("GetEmployees"); //magic string
    }

    //more methods below that call the stored procedures
}

Ci sono dei vantaggi che non vedo nel mantenere i nomi delle stored procedure nelle costanti? So che è utile se più di un metodo utilizza quella stored procedure. In questo modo, se il nome della stored procedure cambia, devo solo apportare una modifica anziché più modifiche. Nella mia esperienza, tuttavia, a causa della loro natura, i nomi delle stored procedure cambiano raramente.

È meglio avere i nomi delle stored procedure codificati in modo rigido in stringhe magiche anziché essere tenuti in stringhe costanti? Conosco tutti i motivi per cui dovremmo evitare le stringhe magiche, ma penso che questa sia un'eccezione.

    
posta user2023861 14.12.2015 - 17:01
fonte

1 risposta

2

Risposta breve: sei completamente corretto, l'uso delle costanti non è l'unica soluzione possibile per casi come questo, e il tuo è probabilmente migliore.

Risposta più lunga: l'intera idea delle costanti soddisfa tre obiettivi:

  1. creazione di una "singola fonte di informazioni" nel tuo programma, un solo luogo in cui i nomi sono definiti

  2. mappare una stringa in qualcosa di più typesafe, che il compilatore può controllare in fase di compilazione, e il "intellisense" nel tuo IDE può captare

  3. rendendo evidente dove cambiare il codice quando si aggiungono nuove stored procedure

Dato che hai esattamente un metodo nella classe DatabaseRepository che chiama l'SP, tutti questi metodi sono elencati uno dopo l'altro, ed è l'unico posto dove gli SP vengono chiamati, quindi tutti e tre gli scopi sono soddisfatti dal tuo suggerimento . Vedi questo come "un modo per definire le costanti per i tuoi nomi SP con diversi mezzi che la solita sintassi const ", e non come "stringhe magiche".

Si noti che il vero vantaggio dell'utilizzo dei metodi di wrapper invece delle costanti avviene quando il SP ha parametri. Quindi non usare le costanti manterrà l'intera mappatura delle firme SP in un'unica posizione, ovvero quella funzione, e non in due punti (una costante all'inizio della classe e diverse centinaia di righe dopo un metodo wrapper).

    
risposta data 14.12.2015 - 22:04
fonte

Leggi altre domande sui tag