Quale modello di progettazione utilizzare durante la progettazione del distretto?

2

Diciamo che sto cercando di progettare un distretto.   Ho

         1) house
         2) community (groups of 2 or more then 2 house)
         3) city (group of more then two community)
         4) district (groups of 2 or more then 2 city) 

Quello che ho finora:

class house{
   public: 
    house(std::string name, std::string id);
    std::string get_name();
    std::string get_id();
  private:
   std::string name;
   std::string id;

};

class community{
   public:
      community();
      // get house names
     std::vector<std::string> get_all_house_in_community();
   private:
     std::string name;
     std::vector<house> p_houses; // vector of house 
};

class city{
   public:
      city();
      // get house names by collecting from communities
      std::vector<std::string> get_all_house_in_city();
   private:
     std::string name;
     std::vector<community> p_communities; // vector of community
}

class district{
   public:
     district();

     // get house names from city
     std::vector<std::string> get_all_house_in_district();
   private:
     std::string name;
      std::vector<city> p_cities; 

};

Quando viene chiamata la funzione get_all_house_in_district () deve chiamare tutte le get_all_housexxxx delle classi. È una buona idea distribuire i dati tra le classi in questo modo o il distretto dovrebbe tenere tutte le case (se permetto al distretto di tenere tutte le case, allora la classe distrettuale si complica davvero molto rapidamente)?

domanda secondaria: dovrei usare l'ereditarietà qui, non vedo alcuna ragione ma ero solo curioso.

Con queste classi ho voluto creare un semplice sistema di basi di dati.

Esiste un modello di progettazione per rappresentare questo scenario?

    
posta pokche 20.07.2017 - 17:53
fonte

1 risposta

4

In generale, ci sono due modi per esaminare i dati: logico e fisico. In un database, tutte le tue case si troverebbero in una tabella con chiavi esterne per capire a cosa apparteneva la casa. Tuttavia, questo è più di un layout "fisico" di come i dati vengono archiviati. Non rappresenta il dominio molto bene.

Nella programmazione orientata agli oggetti, di solito le classi si comportano come se fossero state scritte usando il modello logico. Internamente, possono utilizzare qualsiasi ottimizzazione ritenuta appropriata. È meglio iniziare con tutto modellato logicamente. Puoi sempre modificarlo più tardi.

Quello che stai descrivendo è una gerarchia compositiva di dati. Ha senso quindi usare la composizione per rappresentare i diversi tipi di oggetti. Se aiuta, puoi pensare alle relazioni di ereditarietà e composizione in questo modo:

  • Eredità: è una relazione (SingleFamilyHouse è una casa)
  • Composizione: ha una relazione o una relazione contiene (la comunità ha case)
  • Interfaccia (pura classe virtuale in C ++): funge da relazione (Joe funge da Polizia)

Per essere onesti, la composizione fornisce il codice più riutilizzabile, ma c'è un posto per ogni approccio.

In questo approccio dovrai scrivere il metodo get_all_houses_in_district per chiamare i metodi appropriati sui figli diretti, e fanno lo stesso per i loro figli.

    
risposta data 20.07.2017 - 18:15
fonte

Leggi altre domande sui tag