La domanda più ampia:
Hai mai sentito parlare di un simile standard imposto? In tal caso, qual era il motivo dietro?
Sì, ne ho sentito parlare e l'utilizzo di nomi di oggetti completi impedisce le collisioni di nomi. Sebbene rari, quando accadono, possono essere eccezionalmente spinosi da capire.
Un esempio:
quel tipo di scenario è probabilmente meglio spiegato con un esempio.
Diciamo che ne abbiamo due Lists<T>
appartenenti a due progetti separati.
System.Collections.Generic.List<T>
MyCorp.CustomCollections.Optimized.List<T>
Quando utilizziamo il nome oggetto completo, è chiaro su quale List<T>
viene utilizzato. Questa chiarezza ovviamente viene a scapito della verbosità.
E potresti dire: "Aspetta! Nessuno userebbe mai due liste del genere!" È qui che indicherò lo scenario di manutenzione.
Sei un modulo scritto Foo
per la tua società che utilizza la società approvata, ottimizzata List<T>
.
using MyCorp.CustomCollections.Optimized;
public class Foo {
List<object> myList = ...;
}
Più tardi, un nuovo sviluppatore decide di estendere il lavoro svolto. Non essendo a conoscenza degli standard dell'azienda, aggiornano il using
blocco:
using MyCorp.CustomCollections.Optimized;
using System.Collections.Generic;
E puoi vedere come le cose vanno male in fretta.
Dovrebbe essere banale sottolineare che potresti avere due classi proprietarie con lo stesso nome ma in spazi dei nomi diversi all'interno dello stesso progetto. Quindi non è solo una preoccupazione sulla collisione con le classi fornite da .NET framework.
MyCorp.WeightsAndLengths.Measurement();
MyCorp.TimeAndSpace.Measurement();
La realtà:
ora, è probabile che ciò accada nella maggior parte dei progetti? No, non proprio. Ma quando lavori su un grande progetto con molti input, fai del tuo meglio per ridurre al minimo le possibilità che le cose esplodano su di te.
I grandi progetti con più team che contribuiscono sono un tipo speciale di bestia nel mondo delle applicazioni. Regole che sembrano irragionevoli per altri progetti diventano più pertinenti a causa dei flussi di input al progetto e della probabilità che coloro che contribuiscono non abbiano letto le linee guida del progetto.
Ciò può verificarsi anche quando due grandi progetti vengono uniti. Se entrambi i progetti avevano classi con nomi simili, vedrai delle collisioni quando inizi a fare riferimento da un progetto all'altro. E i progetti potrebbero essere troppo grandi per essere sottoposti a refactoring o la direzione non approverà le spese per finanziare il tempo impiegato per il refactoring.
Alternative: anche
se non lo hai chiesto, vale la pena sottolineare che questa non è un'ottima soluzione al problema. Non è una buona idea creare classi che si scontreranno senza le loro dichiarazioni dello spazio dei nomi.
List<T>
, in particolare, dovrebbe essere trattato come una parola riservata e non utilizzato come nome per le tue classi.
Allo stesso modo, i singoli spazi dei nomi all'interno del progetto dovrebbero cercare di avere nomi di classe univoci. Dover cercare di ricordare con quale spazio dei nomi Foo()
stai lavorando è il sovraccarico mentale che è meglio evitare. Detto in altro modo: avere MyCorp.Bar.Foo()
e MyCorp.Baz.Foo()
farà triplicare i tuoi sviluppatori e evitarlo al meglio.
Se non altro, puoi usare spazi dei nomi parziali per risolvere l'ambiguità. Ad esempio, se non puoi assolutamente rinominare nessuna delle due Foo()
classi, puoi usare i loro spazi dei nomi parziali:
Bar.Foo()
Baz.Foo()
Motivi specifici del tuo attuale progetto:
Hai aggiornato la tua domanda con i motivi specifici che ti sono stati dati per il tuo progetto attuale seguendo quello standard. Diamo un'occhiata a loro e divagiamo davvero lungo il sentiero dei coniglietti.
È ingombrante passare il mouse sul nome per ottenere il tipo completo. È meglio avere sempre il tipo completo qualificato sempre visibile.
"Ingombrante?" Uhm, no. Forse fastidioso. Spostare qualche oncia di plastica per spostare un puntatore sullo schermo non è complicato . Ma sto divagando.
Questa linea di ragionamento sembra più un insabbiamento che altro. Direttamente, immagino che le classi all'interno dell'applicazione abbiano un nome debole e che tu debba fare affidamento sullo spazio dei nomi per raccogliere la quantità appropriata di informazioni semantiche che circondano il nome della classe.
Questa non è una giustificazione valida per i nomi di classe pienamente qualificati, forse è una giustificazione valida per l'utilizzo di nomi di classe parzialmente qualificati.
Gli snippet di codice inviati tramite email non hanno il nome completo e quindi possono essere difficili da capire.
Questa linea di ragionamento (continua?) Rafforza il mio sospetto che le classi siano attualmente scarsamente nominate. Ancora una volta, avere nomi di classe scadenti non è una buona giustificazione per richiedere a tutto di utilizzare un nome di classe completo. Se il nome della classe è difficile da capire, c'è molto di più di quello che possono essere corretti dai nomi di classe pienamente qualificati.
Quando si visualizza o si modifica il codice al di fuori di Visual Studio (Notepad ++, ad esempio), è impossibile ottenere il nome del tipo completo.
Di tutti i motivi, questo quasi mi ha fatto sputare il mio drink. Ma di nuovo, sto divagando.
Mi chiedo perché il team sta frequentemente modificando o visualizzando il codice al di fuori di Visual Studio? E ora stiamo esaminando una giustificazione che è abbastanza ben ortogonale a ciò che gli spazi dei nomi dovrebbero fornire. Questo è un argomento supportato da strumenti mentre gli spazi dei nomi sono lì per fornire una struttura organizzativa al codice.
Sembra che il tuo progetto soffra di scarse convenzioni di denominazione insieme a sviluppatori che non stanno sfruttando ciò che gli strumenti possono fornire loro. E piuttosto che risolvere quei problemi reali, hanno tentato di schiaffeggiare un cerotto su uno dei sintomi e richiedono nomi di classe pienamente qualificati. Penso che sia sicuro classificarlo come un approccio errato.
Dato che esistono classi con un nome mediocre e supponendo che non sia possibile effettuare il refactoring, la risposta corretta è utilizzare l'IDE di Visual Studio a proprio vantaggio. Forse prendere in considerazione l'aggiunta di un plug-in come il pacchetto VS PowerTools. Quindi, quando guardo, AtrociouslyNamedClass()
posso fare clic sul nome della classe, premere F12 ed essere portato direttamente alla definizione della classe per capire meglio cosa sta cercando di fare. Allo stesso modo, posso fare clic su Shift-F12 per trovare tutti i punti nel codice che attualmente soffrono di dover usare AtrociouslyNamedClass()
.
Per quanto riguarda le preoccupazioni esterne relative agli utensili, la cosa migliore da fare è semplicemente fermarlo. Non inviare e-mail snippet avanti e indietro se non sono immediatamente chiari a cosa si riferiscono. Non utilizzare altri strumenti al di fuori di Visual Studio poiché tali strumenti non dispongono dell'intelligenza che circonda il codice di cui il tuo team ha bisogno. Notepad ++ è uno strumento fantastico, ma non è adatto a questo compito.
Quindi sono d'accordo con la tua valutazione in merito alle tre giustificazioni specifiche che ti sono state presentate. Detto questo, ciò che penso ti sia stato detto è "Abbiamo problemi di fondo su questo progetto che non possono / non verranno affrontati ed è così che li abbiamo risolti". E questo ovviamente parla di problemi più profondi all'interno del team che possono servire come bandiere rosse per te.