Impedisci agli sviluppatori di usare le costanti

7

Ho un unico sistema software che consente agli sviluppatori di specificare un ID o un nome per creare NodeReferences . Entrambi funzionano bene, ma gli ID non sono garantiti per essere gli stessi in diversi ambienti. Ho provato nella documentazione e nelle conversazioni a sottolineare che gli ID non dovrebbero essere codificati (dato che si romperanno quando vengono distribuiti in ambienti diversi), ma alcuni sviluppatori li stanno ancora utilizzando.

Funziona solo in ambiente dev:

var level = LevelReference.ById(20);
var node = NodeReference.ByName(level, _patientGuid.ToString());

Funziona in tutti gli ambienti:

var app = ApplicationReference.ByName("Reporting");
var area = AreaReference.ByName(app, "Default");
var level = LevelReference.ByName(area, "Patient");
var node = NodeReference.ByName(level, _patientGuid.ToString());

Penso che l'appello sia solo che produce meno linee di codice. L'uso degli ID non è di per sé negativo (dal momento che ci sono casi d'uso validi come il caching dell'ID restituito dal server e il suo utilizzo in un secondo momento per una ricerca più rapida), ma gli ID hardcoded sono negativi. La maggior parte delle volte il primo codice genera un'eccezione, ma è possibile che possa essere un ID valido per un oggetto diverso da quello previsto dallo sviluppatore, e ciò potrebbe causare problemi molto gravi.

Qual è il modo migliore per scoraggiare l'uso di tali costanti nel codice? Idealmente mi piacerebbe lanciare qualche tipo di errore del compilatore quando vedo un codice come il primo esempio, o almeno lanciare un'eccezione prima che la chiamata arrivi al database.

    
posta p.s.w.g 06.03.2013 - 17:54
fonte

7 risposte

16

Nascondi gli ID int in oggetti / strutture opache;

var id = level.id;

Qui id è una tale struttura.

In questo modo puoi rimuovere il metodo ById(int) e sostituirlo con ById(Id) e ti consente comunque di mantenere la% incassata Id per un utilizzo futuro.

Puoi anche creare tipi di ID univoci per ciascun tipo di riferimento per garantire la sicurezza del tipo (quindi non puoi fare NodeReference.ById(level.id) ).

    
risposta data 06.03.2013 - 18:01
fonte
17

Fornisci un'API migliore:

var node = NodeReference.byName("Reporting", "Default", "Patient", _patientGuid.ToString());

O fornire funzioni di utilità per recuperare nodi importanti

var node = NodeReference.byName( theDefaultPatientNode(), _patientGuid.ToString() );

O hai i vari nodi in un enum, e fai qualcosa del tipo:

var node = NodeReference.byCategory( REPORT_PATIENT, _patientGuid.ToString() );

Non sarai in grado di vendere scrivendo 4 linee di codice per fare qualcosa di così semplice. Stanno cercando di usare ids perché è troppo difficile recuperare l'oggetto in questione altrimenti. Quindi rendilo più facile!

    
risposta data 06.03.2013 - 18:25
fonte
8

Codice come

var level = LevelReference.ById(20);

non dovrebbe mai passare una revisione del codice, perché contiene numeri magici . Solo questo dovrebbe essere una ragione sufficiente per vietare tali pratiche.

E se cercano di aggirare il problema creando costanti con nome, il revisore dovrebbe chiedere all'autore dove ha ottenuto la garanzia che il numero sia corretto per tutte le distribuzioni.

    
risposta data 06.03.2013 - 18:40
fonte
6

Datti la mano nella revisione del codice.

Detto questo, c'è una vera differenza tra LevelReference.ById() e LevelReference.ByName() ? Nel tuo esempio stai usando valori hard coded in entrambi.

In una base di codice su cui ho lavorato, abbiamo gestito una situazione simile, predefinendo i valori "hard coded" impostati con il nostro script di installazione del database e disponendo di un'enumerazione che associa un valore enumerato al valore del database.

    
risposta data 06.03.2013 - 18:01
fonte
3

Se ho capito bene, quegli ID sono le chiavi primarie (colonna identità) nel database. In questo caso, una soluzione alternativa non è vietare o tenere traccia delle costanti nel codice, ma semplicemente randomizzare quelle chiavi nello script di distribuzione.

Poiché gli ID non sono garantiti per rimanere lo stesso nei dati di test, l'unica soluzione per gli sviluppatori sarebbe quella di passare a qualcosa di più affidabile - nel tuo caso, i nomi.

    
risposta data 06.03.2013 - 18:01
fonte
3

Sembra che tu stia cercando una soluzione tecnica per un problema sociale. Dovresti chiamarlo nelle recensioni del codice. Fai qualcosa nel tuo ambiente di test / staging per assicurarti che i numeri di nodo mai corrispondano a un ambiente di sviluppo pulito - magari inserisci un numero casuale di righe di spazzatura su ogni installazione - e gettali indietro allo sviluppatore come rotto.

Se le persone insistono nel cercare di aggirare questo problema, li lasci andare.

    
risposta data 06.03.2013 - 21:23
fonte
1

Dottore! Medico! Fa male quando faccio questo!

Gli sviluppatori utilizzano in modo improprio la tua API perché te l'hai fornita. Se pensi che LevelReference.ById() non sia buono da usare, non dovresti fornirlo. Se lo porti via, smetteranno di usarlo: -)

Dato che stiamo parlando di C #, puoi anche contrassegnare ById() come [Obsolete] e riceveranno almeno un avviso di deprecazione. Per coloro che compilano con all-warnings-are-errors, è fatale.

    
risposta data 06.03.2013 - 23:46
fonte

Leggi altre domande sui tag