Domanda

Questa situazione probabilmente non è del tutto rara per alcuni di voi: hai alcune funzionalità da mettere in una classe ma il nome perfetto (*) per quella classe è preso da una delle classi in System spazio dei nomi o altri nomi/classe che non è tuo ma tu sei using/importing.

(*) Per perfetto intendo nomi piccoli, concisi e chiari.

Ad esempio, ho un Utils classe che ha un Diagnostics (per lo più debug utils) e a Drawing classe. Potrei:

  1. avere un DrawingUtils classe e a DiagnosticsUtils Classe, ma questo ha solo un odore di una cattiva struttura.
  2. Scegli un thesaurus e sii fatto con un nome peggiore, più lungo o imbarazzante che non è ancora preso.
  3. Scrivi nomi di classe nella mia lingua madre invece che in inglese.
  4. Chiedi ai ragazzi intelligenti di Stackoverflow.

Penso che le opzioni 1-3 non siano promettenti :(

MODIFICARE:

Dal momento che la mia risposta prescelta non affronta il problema in modo definitivo (nemmeno io), Cosa consiglierei alle persone che affrontano la stessa situazione è chiedertevi: userai spesso la classe/spazio dei nomi BCL in conflitto? Se no, lascia che il tuo nome sia in conflitto (come ho fatto con la diagnostica). Se sì, aggiungi una parola che limiti Le possibilità della tua classe/spazio dei nomi.

In pratica, questo significa:
"Drawing": Qualcosa che disegna.
"MyCustomControlDrawing": Qualcosa che disegna solo Su MyCustomControl. per esempio: "WidgetDrawing".

EDIT2:

Un'altra soluzione per dare un'occhiata la prossima volta: Metodi di estensione (per gentile concessione di Taglia erba).

È stato utile?

Soluzione

Usa gli spazi dei nomi per disprezzare le lezioni dalle classi in altri spazi dei nomi. Utilizzare nomi completamente qualificati o un'istruzione usando che indica la compilazione di cosa hai bisogno:

using Type = MyReallyCoolCustomReflector.Type;

Ora, se vuoi utilizzare ancora la classe di tipo dallo spazio dei nomi di sistema:

System.Type sysType = anObject.GetType();

Generalmente cerco di evitare i duplicati dei nomi, ma questo non sempre funziona in questo modo. Mi piace anche un codice semplice, leggibile e gestibile. Quindi, come spesso, è una decisione di compromesso.

Altri suggerimenti

Non vedo alcun problema nel mantenere i nomi Drawing, Diagnostics ecc. Questo è uno degli scopi degli spazi dei nomi, per risolvere i conflitti di denominazione.

La bellezza degli spazi dei nomi è che ti permettono di creare classi con nomi identici. Puoi assegnare un alias a uno spazio dei nomi quando lo si importa nel tuo file con a using dichiarazione.

using MyAlias = My.Custom.Namespace;

Ciò manterrà le tue classi separate da Microsoft.

Puoi quindi fare riferimento alle tue classi come

MyAlias.Diagnostics

Oppure potresti alternativamente assegnare un alias allo spazio dei nomi di Microsoft, ma non lo consiglierei perché confonderebbe altri sviluppatori.

Per me, non vale davvero la seccatura di scrivere nomi di classe in conflitto intenzionalmente. Confonderai altri sviluppatori che non hanno familiarità con la tua base di codice, perché si aspetteranno di utilizzare le classi BCL ma finiranno invece con i tuoi (o viceversa). Quindi, perdi il loro tempo quando devono scrivere specifici using alias.

Onestamente, arrivare a nomi di identificatore significativi è un'abilità utile, ma non vale la pena ritardare il tuo sviluppo. Se non riesci a trovare qualcosa di buono rapidamente, accontentarti di qualcosa di mediocre e andare avanti. C'è poco valore nella lavoratore per i nomi. Oserei dire che ci sono cose più produttive che potresti fare.

MODIFICARE: Inoltre non credo che "piccolo" sia un componente di un identificatore "perfetto". Conciso e chiaro, di sicuro, ma se ci vuole un nome più lungo per trasmettere lo scopo di un particolare costrutto, così sia. Dopotutto abbiamo Intellisense.

Bene, se vuoi evitare una collisione dello spazio dei nomi ci sono un paio di cose che puoi fare:


  • Non scontrarsi, invece scegli un nome univoco.

Esempio:

Se stai creando una lezione di matematica puoi nominare il tuo CamiloMartin.MathHelper


  • Usa lo spazio dei nomi lungo per distinguere tra le collisse.

Esempio:

public class MyClass
{
    public int SomeCalculation(int a, int b)
    {
        return MyNamespace.Math.SomeFunc(a, b);
    }
}

  • Usando un alias per differenziarsi.

Esempio:

using System.Math;
using SuperMath = MyNamespace.Math;

namespace MyNamespace
{
    public class MyClass
    {
        public int SomeCalc(int a, int b)
        {
             int result = Math.abs(a);
             result = SuperMath::SomeFunc(a, b);

             return result;
        }
    }
}

Solo per il record: .NET Framework non ha nessuno dei due UtilsDiagnostics classe. (Ma ha System.Diagnostics spazio dei nomi.)

Personalmente non mi piacciono le lezioni per lo scopo generale come Utils Poiché i loro metodi non sono molto rilevabili (e di solito troppo generali o troppo specifici), quindi giustificherei il loro uso solo come per le classi interne.

Per quanto riguarda il resto, sono d'accordo con gli altri su quegli spazi dei nomi sono convenienti. (Anche se avrei pensato due volte per nominare la classe se c'è già una classe in System Con lo stesso nome, non per i conflitti di nome, ma piuttosto perché il motivo per cui non posso usare la classe "originale" potrebbe significare che la classe che sto per creare è semanticamente diversa.)

Spesso è possibile scegliere un nome più specifico. Prendere Utils Per esempio. Assolutamente tutto può essere chiamato utilitiy. Per il lettore del tuo codice questo nome di classe è inutile.

Spesso le lezioni di utilità sono una raccolta di metodi che non si adattavano davvero altrove. Prova a metterli dove appartengono o raggrupparli secondo alcuni criteri, quindi usa il gruppo come nome di classe. Tale raggruppamento è sempre possibile nella mia esperienza.

In generale:

  1. Questo è quello che stiamo facendo (hey, possiamo refactoring più tardi)

  2. Lo usava una o due volte ma solo su classi importanti. Particolarmente utile se non conosci ancora il nome "perfetto".

  3. Non pensare nemmeno a questo ...

L'uso degli alias dello spazio dei nomi non è divertente. Quindi lo evito se posso.

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