I parametri di un metodo dovrebbero essere nello stesso spazio dei nomi della classe?

5

Supponiamo di avere questo:

namespace Project.Services
{
   public class ClientService
   {
      public IEnumerable<Clients> Query(Project.Models.Builders.ClientQueryBuilder builder)
      {
           //...
      }
   }
}

Gli spazi dei nomi AFK ti aiutano ad organizzare il tuo progetto in modo minerario. Fornisce un contesto su come il modulo dovrebbe funzionare.

In questo caso il parametro builder è in Project.Models.Builders namespace ed è in uso in Project.Services namespace. Qui ci sono 2 diversi namespace con un contesto completamente diverso che lavora insieme.

La domanda è: la classe ClientQueryBuilder dovrebbe essere nello spazio dei nomi Service ?

    
posta Einer Santana 22.06.2017 - 21:12
fonte

3 risposte

9

Should I move ClientQueryBuilder class to Service namespace?

No. Finirai con uno spazio dei nomi gigante.

Ma penso che il difetto nella logica sia più profondo. Tu dici che i namespace sono un modo per organizzare il tuo progetto. Ma non sono d'accordo.

I progetti sono un modo per organizzare la tua soluzione.

Gli spazi dei nomi sono un modo per non duplicare i nomi delle classi tra i progetti.

Quindi qui fai riferimento al progetto Models nel tuo progetto di servizio. Non c'è niente di sbagliato in questo ed è perfettamente ragionevole, anzi forse normale! per un servizio per consumare oggetti da un progetto diverso come parametri.

Tuttavia, detto questo, data la denominazione della classe ClientQueryBuilder, forse i Modelli non sono il posto migliore per questo? Sto solo andando fuori dal nome della classe, anche se non il fatto che sia in un namespace diverso.

    
risposta data 23.06.2017 - 00:21
fonte
2

Diventerà difficile comunicare attraverso i namespace se lo fai ovunque. Se sei sicuro che non causerà conflitti di nome ambigui, puoi farlo:

namespace Project.Services
{
   using Project.Models.Builders;

   public class ClientService
   {
      public IEnumerable<Clients> Query(ClientQueryBuilder builder)
      {
           //...
      }
   }
}

Altrimenti fai questo:

namespace Project.Services
{
   using ClientQueryBuilder = Project.Models.Builders.ClientQueryBuilder;

   public class ClientService
   {
      public IEnumerable<Clients> Query(ClientQueryBuilder builder)
      {
           //...
      }
   }
}

Lì, ora lo hai "spostato" nello spazio dei nomi in cui ti serve, senza confondere tutto ciò che si aspetta che rimanga. Ciò significa che sei libero di organizzare le cose in base a dove le persone potrebbero aspettarsi di trovarle non in base a dove sono necessarie.

Una buona documentazione a riguardo può essere trovata qui .

    
risposta data 22.06.2017 - 22:00
fonte
0

Should ClientQueryBuilder class be in the Service namespace?

e no e tutto dipende da come tu definisci un Servizio e cosa vuoi che l'utente veda per primo. Per me, in generale, un servizio è una classe che fa qualcosa utile e non solo memorizza i dati. Se ClientQueryBuilder è una cosa del genere, questo aiuta a creare un ClientQuery , quindi potrebbe essere visto come un servizio.

Per lo più uso lo spazio dei nomi Services per inserire tipi che sono difficili da categorizzare con altri criteri. Se avessi un solo builder lo lascerei nello spazio dei nomi Services , ma se ne avessi di più, creerei un altro spazio dei nomi Builders nello spazio dei nomi Services e inseritelo lì.

namespaces help you to organize your project in a miningful way

Sì, lo fanno. Puoi usare gli spazi dei nomi per nascondere tipi più speciali e usati raramente direttamente e inserire tipi più comuni nello spazio dei nomi principale in modo che sia più facile trovarli e usarli.

Ad esempio, se disponi di un framework che fornisce classi per analizzare qualcosa, preferiresti non inserirli nello spazio dei nomi Parsers , in modo che dopo aver installato il pacchetto potresti utilizzarli immediatamente perché sono ciò di cui tratta questo pacchetto. D'altra parte se alcuni parser supportano solo il tuo framework / libreria, sarebbe meglio nasconderli nello spazio dei nomi Parsers in modo che non interferiscano con intellisense perché il loro uso è piuttosto improbabile in ogni caso .

Nel tuo caso il builder non è solo un parametro ... è uno strumento per creare una query in modo che abbia tutto il diritto di essere la parte dello spazio dei nomi dei servizi (supponendo che sia davvero un builder così come lo conosciamo).

    
risposta data 01.07.2017 - 17:46
fonte

Leggi altre domande sui tag