Estrae tutti gli alias e gli enum del tipo di classe correlati in un file o no

0

Ho molti modelli nel mio progetto, e alcune altre classi hanno solo bisogno della dichiarazione della classe e dell'aliasing del tipo di puntatore. Non è necessario conoscere la definizione della classe , quindi non voglio includere il file di intestazione del modello. Estraggo tutte le dichiarazioni del modello in un unico file per far sì che ogni classe faccia riferimento a un file.

model_forward.h

class Cat;
typedef std::shared_ptr<Cat> CatPointerType;
typedef std::shared_ptr<const Cat> CatConstPointerType;

class Dog;
typedef std::shared_ptr<Dog> DogPointerType;
typedef std::shared_ptr<const Dog> DogConstPointerType;


class Fish;
typedef std::shared_ptr<Fish> FishPointerType;
typedef std::shared_ptr<const Fish> FishConstPointerType;

enum CatType{RED_CAT, YELLOW_CAT, GREEN_CAT, PURPLE_CAT}

enum DogType{HATE_CAT_DOG, HUSKY, GOLDEN_RETRIEVER}

enum FishType{SHARK, OCTOPUS, SALMON}

È una pratica accettabile? Devo fare in modo che ogni unità, che ha bisogno di una dichiarazione di classe , dipenda da un file? Causa un alto accoppiamento?

O dovrei mettere questi pointer di tipo aliasing e enum definizione all'interno della classe?

cat.h

class Cat
{
    typedef std::shared_ptr<Cat> PointerType;
    typedef std::shared_ptr<const Cat> ConstPointerType;

    enum Type{RED_CAT, YELLOW_CAT, GREEN_CAT, PURPLE_CAT}
    ...
};

dog.h

class Dog
{
    typedef std::shared_ptr<Dog> PointerType;
    typedef std::shared_ptr<const Dog> ConstPointerType;

    enum Type{HATE_CAT_DOG, HUSKY, GOLDEN_RETRIEVER}
    ...
}

fish.h

class Fish
{ ... };

Qualsiasi suggerimento sarà utile.

    
posta Chen OT 20.05.2014 - 09:31
fonte

2 risposte

1

Avere un singolo file con tutte le dichiarazioni di classe mi sembra un problema. Ci sono ragioni architettoniche e basate su strumenti per la mia affermazione.

Diamo prima uno sguardo agli strumenti. La maggior parte dei compilatori può generare file parzialmente compilati (come .pch) in base ai file di intestazione inclusi. Questi file vengono ricreati solo quando questi file di intestazione cambiano. Per i progetti di grandi imprese, ciò può significare la differenza tra una build di 5 minuti e una di 1 ora. Se metti tutte le tue dichiarazioni in un file, l'aggiunta di una singola classe attiverà una compilazione completa, non troppo desiderabile. Ci sono intensi dibattiti sul fatto di utilizzare i file precompilati in primo luogo, ma questo punto è sicuramente da tenere a mente.

Molti strumenti come gli IDE usano anche l'intestazione per determinare il livello di completamento automatico, ecc. Con un file di intestazione globale, ho visto gli IDE lenti a una scansione mentre tentano di elaborare l'enorme albero di inclusione.

In secondo luogo, man mano che il progetto cresce e inizi a utilizzare centinaia di classi, farle dichiarare tutte in un singolo file causerà un sacco di accoppiamenti non necessari. L'intero punto dei file di intestazione è specificare l'ambito di compilazione / ricerca per i propri oggetti. È meglio per ogni classe sapere solo ciò di cui ha strettamente bisogno. Ciò consente la futura modularizzazione ed estensibilità.

    
risposta data 20.05.2014 - 21:26
fonte
0

La mia risposta immediata è: non farlo! Quando mischiate le dichiarazioni di classi nello stesso file, introducete dipendenze e accoppiamenti che torneranno a mordervi.

Ma al di sotto di questo scopro un altro problema. Hai file CPP e file H, e i file H contengono dettagli dell'implementazione privata (penso che sia l'intestazione del modello, penso). Giustamente non vuoi esporre i dettagli dell'implementazione a tutti i chiamanti, e questa è la soluzione che stai prendendo in considerazione.

Questo è un problema ben noto in C ++, e ci sono soluzioni ad esso (anche se hanno tutti i loro problemi). Probabilmente il più noto in PIMPL (per implementazione privata).

Quindi il mio consiglio è di concentrarsi sull'affrontare il problema di nascondere l'implementazione da utenti occasionali delle tue classi, magari usando PIMPL, e resisti alla tentazione di creare un'intestazione per domarli tutti .

    
risposta data 08.06.2014 - 17:50
fonte

Leggi altre domande sui tag