2017-08-31 2 views
-2

Y at-il un bon modèle de développement que je peux utiliser pour organiser mon code?Comment créer une bonne interface pour ma classe?

J'utilise C++.

  1. J'ai une classe de base de commandement
  2. Des dizaines de classes dérivées de la classe de commande
  3. classe de transaction, qui stocke l'ensemble des commandes (peut être modifiée)

Avec l'approche actuelle de l'utilisateur de l'interface transaction doit faire quelque chose comme

template <typename Base, typename T> 
    inline bool instanceof(const T *ptr) { 
    return typeid(Base) == typeid(*ptr); 
    } 

Transaction tx; 

// here I want to process all commands 
for(int i=0; i < N; i++){ 
    if(instanceof<AddPeer>(tx.get(i)) { 
    // ... process 
    } 
    if(instanceof<TransferAsset>(tx.get(i)) { 
    // ... process 
    } 
    ... for every type of command, but I have dozens of them 
} 

class Command; 
class TransferAsset: public Command {} 
class AddPeer: public Command {} 
// dozens of command types 

class Transaction{ 
public: 
    // get i-th command 
    Command& get(int i) { return c[i]; } 
private: 
    // arbitrary collection (of commands) 
    std::vector<Command> c; 
} 

Répondre

1

Pourquoi, simplement, la commande n'a pas de méthode pure virtuelle à implémenter dans les classes dérivées? Quelque chose comme ceci:

class Command 
{ virtual void process() =0;}; 
class TransferAsset: public Command 
{ 
    void process() 
    { 
    //do something 
    } 
}; 
class AddPeer: public Command  
{ 
    void process() 
    { 
    //do something 
    } 
}; 

Code Vous pourriez être alors:

Transaction tx; 
// here I want to process all commands 
for(int i=0; i < N; i++) 
{ 
    tx.get(i)->process(); 
} 
+0

Si le traitement d'une commande est difficile (beaucoup de code), alors il est probablement mauvais de donner à cette logique de traitement directement ' la méthode du processus. Je pense à 'class Processor', qui sera passé à' void process (Processor & e) '. Est-ce bon design? – warchantua