2012-03-20 11 views
9

Se definisco un'interfaccia ITestInterface e immediatamente creo una classe che implementa quell'interfaccia per l'utilizzo all'interno di un'applicazione, è ok mantenere la classe e l'interfaccia nello stesso spazio dei nomi o dovrebbero essere separati. Ad esempio Test.Interfaces e Test.Interfaces.Implementation.Devo inserire la definizione dell'interfaccia nello stesso spazio dei nomi dell'implementazione

Sia la mia interfaccia e la sua attuazione sarà nella propria assemblea quindi non sono in cerca di creare un altro solo per contenere l'interfaccia stessa.

Questo è particolare in materia di C# tuttavia credo che può coprire qualsiasi lingua.

+1

Test.Interfaces.Implementation sembra piuttosto contraddittorio dato che le interfacce e le implementazioni si escludono a vicenda. – Robbie

+4

Non organizzerei gli spazi dei nomi in base al tipo di cosa che contengono, ma in base al loro scopo. – davisoa

risposta

13

Probabilmente è meglio utilizzare le convenzioni stabilite delle classi predefinite .NET. Ad esempio, guardando nello spazio dei nomi System.Collections.Generic possiamo vedere che ci sono sia IDictionary sia Dictionary. Quindi probabilmente metterli nello stesso spazio dei nomi è la migliore idea.

Inoltre, dal momento che sia l'interfaccia e l'implementazione molto probabilmente hanno lo stesso scopo, è meglio raggrupparli nello stesso namespace.

+0

Sì, questa è la conferma che stavo cercando, evviva. – dreza

2

System.Collections.ArrayList implementa System.Collections.IList. Se Microsoft lo fa, perché non dovresti?

+1

perché http: //en.wikipedia.org/wiki/Cargo_cult_programming –

+0

@Tim Non riesco a vedere la tua rilevanza. La domanda era dove mettere l'interfaccia, non se fosse affatto necessaria. –

1

È una domanda molto astratta. Qual è la ragione per l'interfaccia? È un API/framework pubblico o una semplice applicazione? Avrai più implementazioni della stessa interfaccia?

Se le interfacce sono nelle loro assemblee, allora è una buona pratica per i namespace di base per abbinare i nomi di assemblaggio. Ma sembra che tu intenda la classe e l'interfaccia nello stesso assembly.

2

Questo è in particolare correlato a C# ma credo che possa coprire qualsiasi lingua .

È tipico in Java avere i due nello stesso pacchetto. L'unica eccezione che posso pensare potrebbe essere un'interfaccia DAO in una persistenza del pacchetto e diverse implementazioni in sottopackages (es. Jdbc, hibernate, jdo, ecc.)

Si può pensare a un'interfaccia pubblica come l'API esposto dal pacchetto. Riesco a vedere dove le classi di implementazione potrebbero essere private di pacchetti, impedendo agli utenti di accedere all'implementazione tramite qualsiasi altra cosa che non sia l'interfaccia. Dovrebbero essere forniti metodi di produzione pubblica per garantire l'accesso.

+0

Cheers. Ciò sembra essere d'accordo con ciò che @Tudor ha detto anche sulle pratiche di Microsofts. – dreza

0

Qual è il tuo intento?

Se si desidera "nascondere" l'implementazione dal resto del codice e/o scegliere quale delle varie implementazioni disponibili "iniettare" in fase di esecuzione, la classe non dovrebbe essere comunque pubblica, quindi non 'importa davvero in quale spazio dei nomi risiede.

In caso contrario, non c'è nessun problema sia per l'interfaccia e la classe che risiedono nello stesso spazio dei nomi.

2

Che ne dici di assiemi separati, stesso spazio dei nomi? Mi piace.

+0

Ciò può causare un problema quando si aggiunge un riferimento all'assembly contenente la classe che implementa l'interfaccia. Il compilatore genera un errore se non si ha un riferimento all'assembly che contiene l'interfaccia. Il chiamante viene quindi lasciato al compito di rintracciare l'assieme contenente l'interfaccia. – Ben

+2

Penso che il problema sia la persona che aggiunge l'assembly di implementazione senza l'assembly dell'interfaccia. Non dovresti necessariamente progettare le tue soluzioni basandoti su ciò che qualcun altro potrebbe erroneamente fare con loro. – Chalky

Problemi correlati