Dare a più classi in una singola libreria lo stesso nome

2

Il progetto che ha sollevato questa domanda è in C #, ma potrebbe essere applicato alla maggior parte delle lingue che utilizzano gli spazi dei nomi.

Ho letto molte cose sulle buone pratiche di denominazione:

  • "Non prefisso i nomi delle classi con il loro nome dello spazio dei nomi, creando solo duplicazioni inutili." (Smurf naming)

  • "Uno degli usi per gli spazi dei nomi è la separazione tra codice e collisioni di nomi. Usali in questo modo."

  • "Quando leggo il codice di un progetto e mi imbatto in un nome di classe, voglio sapere esattamente a quale classe si fa riferimento e non dover controllare quali spazi dei nomi sono stati importati."

Quello che non sono stato in grado di capire è il modo migliore per nominare le classi in spazi dei nomi che svolgono attività simili, ma sono completamente indipendenti l'una dall'altra.

Ad esempio, supponiamo di avere una libreria di codec audio. Il codice in ogni spazio dei nomi codec non dipende dagli altri, ma dipendono tutti da uno spazio dei nomi contenente codice generico comune.

Potrei avere lezioni come queste. (Non leggere troppo nei nomi, sono solo esempi.)

Vorbis codec:

Project.Vorbis.VorbisEncoder
Project.Vorbis.VorbisDecoder
Project.Vorbis.VorbisFrame
Project.Vorbis.VorbisChannel
Project.Vorbis.VorbisParameters

Codec ATRAC3 +:

Project.Atrac3P.Atrac3PEncoder
Project.Atrac3P.Atrac3PDecoder
Project.Atrac3P.Atrac3PFrame
Project.Atrac3P.Atrac3PChannel
Project.Atrac3P.Atrac3PParameters

codec IMA ADPCM:

Project.ImaAdpcm.ImaAdpcmEncoder
Project.ImaAdpcm.ImaAdpcmDecoder
Project.ImaAdpcm.ImaAdpcmFrame
Project.ImaAdpcm.ImaAdpcmChannel
Project.ImaAdpcm.ImaAdpcmParameters

Questo buon design è troppo ripetitivo? Non mi piace ripetere il nome del namespace nel nome della classe, ma non so se sia preferibile duplicare nomi di classi come questo:

Project.Vorbis.Encoder
Project.Atrac3P.Encoder
Project.ImaAdpcm.Encoder
    
posta ABarney 17.10.2017 - 19:14
fonte

2 risposte

3

Come al solito, dipende. Dipende dai luoghi in cui è possibile utilizzare i nomi delle classi non prefissati. [Disclaimer: Sono un maniaco di Java, ma penso che la mia esperienza sarà applicabile anche a C #.]

La mia regola empirica è che i simboli che sono visibili al di fuori del loro spazio dei nomi di casa dovrebbero avere un nome univoco su tutti gli spazi dei nomi del progetto.

Se i riferimenti a qualche Encoder verranno visualizzati solo nelle classi dallo stesso spazio dei nomi, quindi, come lettore del codice, mi aspetto che il nome Encoder rimanga per quello locale. In Java, darei alla classe Encoder una visibilità locale del pacchetto.

Ma se Encoders è visibile al di fuori del loro spazio dei nomi di casa, andrei a cercare i nomi lunghi.

es. Java ha un esempio negativo con le classi java.util.Date e java.sql.Date , che a volte ho dovuto usare nello stesso metodo (collegamento tra core e database) - che mi ha costretto a usare nomi di classe pienamente qualificati almeno per uno di loro : -. (

    
risposta data 17.10.2017 - 19:38
fonte
3

L'organizzazione di un progetto può essere in qualche modo soggettiva, ma:

Namespace
Project.Codec

Magari crea una cartella sotto codec chiamata \ Encoding

Classi e interfacce in \ Encoding

IEncoder
VorbisEncoder : IEncoder
Atrac3Encoder : IEncoder

... E così via. La sottocartella è facoltativa, ma se hai molte implementazioni di codificatori, decodificatori, ecc. Potrebbe essere utile come ulteriore livello organizzativo per il progetto.

Infine, per importare:

using Project.Codec.Encoding;

Questo ti darebbe accesso a tutti gli encoder.

    
risposta data 17.10.2017 - 19:40
fonte

Leggi altre domande sui tag