I nomi delle classi dovrebbero riflettere il nome del namespace?

1

È generalmente considerato una buona pratica per un nome class per riflettere il nome namespace in cui esiste, oppure il nome namespace dovrebbe essere considerato parte del nome class ?

Ad esempio, supponiamo di avere una raccolta di classi che agiscono tutte per filtrare un class Foo :

class FooFilter
{
    public virtual bool operator()(const Foo& obj) const = 0;
};

I sottotipi potrebbero essere chiamati HappyFooFilter , SadFooFilter , ... ecc.

Ora se li avvolgiamo in uno spazio dei nomi, abbiamo qualcosa del tipo:

namespace fooFilter
{
    class FooFilter ...
    class HappyFooFilter ....
    class SadFooFilter ...
    etc ....
}

Ma questo contiene una ridondanza nei nomi delle classi (ad esempio fooFilter::HappFooFilter ). Quindi, con l'introduzione di namespace fooFilter , i nomi delle classi dovrebbero cambiare per riflettere questa nuova struttura?

namespace fooFilter
{
    class Base ...
    class Happy ....
    class Sad ...
    etc ....
}
    
posta Daniel 29.07.2016 - 13:55
fonte

3 risposte

2

Il problema è che il tuo esempio è vago e i tuoi nomi sono anemici. Se li rendiamo buoni nomi robusti, la scelta non diventa ovvia?

namespace ImageFilter
{
     class BasicFace ...
     class HappyFace ...
     class SadFace ...
}

versi

namespace ImageFilter
{
     class BasicFaceImageFilter ...
     class HappyFaceImageFilter ...
     class SadFaceImageFilter ...
}

Questo smurfing naming anti pattern mi ha tentato anche in passato. Sono arrivato a sentire che è il risultato del tentativo di mantenere nomi anemici su supporto vitale. Ripensa tutti i nomi e riprova. È un pain da fare ma rende per un codice migliore.

    
risposta data 29.07.2016 - 15:25
fonte
1

Assegnare nomi alle cose è difficile, e parte di prendere la decisione giusta è capire che specificamente esprime la parte del nome ripetuto.

Un prefisso che è semplicemente un nome di società è in genere ridondante, ad es. non vi è alcun motivo per dichiarare una classe ACMEString all'interno di un pacchetto ACMEUtil.

Un prefisso che influisce in modo pervasivo su tutto ciò che fai nel dominio può talvolta meritare la ripetizione, ad es. se hai un modulo parallel_search , potrebbe avere senso avere una routine parallel_index al suo interno per distinguerlo dall'indicizzazione normale che il progetto contiene anche.

Ma Foo è semplicemente un segnaposto generico, quindi è difficile giudicare quale situazione regge. Ho paura che abbiamo bisogno di maggiori dettagli sul tuo caso specifico per dare una raccomandazione.

    
risposta data 29.07.2016 - 14:46
fonte
1

Dato che non ho familiarità con c ++ sto rispondendo in un modo più specifico del design.

Il nome della classe descrive la sua funzionalità, mentre uno spazio dei nomi include uno spettro più ampio di classi che condividono un tipo di funzione o caso d'uso.

Quindi all'inizio sembra che tu possa refactoring le tue * Filter-classes e che tutte le tue classi funzionino bene. Ora stai implementando un'altra classe denominata Happy contenuta in uno spazio dei nomi chiamato moods .

namespace moods
{
    class Happy...
}

Se un'altra classe Bar utilizza entrambe le tue classi, quali delle tue classi Happy verranno utilizzate? Come fai a sapere quali dei tuoi corsi stai attualmente utilizzando?

Quindi, dato che i tuoi precedenti nomi di classe descrivono la funzione delle tue classi che, ad esempio Happy , non rimarrebbe con la tua denominazione corrente. Anche se sembra ridondante nel tuo stato attuale, non sai mai cosa succederà dopo.

    
risposta data 29.07.2016 - 14:55
fonte

Leggi altre domande sui tag