Domanda

Attualmente sto progettando le classi per un'applicazione che sto scrivendo per il mio corsi, e ho due classi che suono come se essi dovrebbero essere un paio classe base di derivazione, e effettivamente condividere due variabili membro, e la mia problema è che ognuno ha sette variabili membro e nessuna operazione.

La ragione per la struttura di queste classi è che sto costruendo un lettore RSS e ho intenzione di avere queste due classi contengono dati sui feed. Il primo conterrà i dati sul feed stesso, ad esempio l'URL di origine, la posizione del file rss.xml sullo storage locale, quando il feed è stato aggiornato l'ultima volta, etc. La seconda conterrà informazioni sugli articoli contenuti all'interno del alimentare come la data di pubblicazione / ora e un indice intero in base alla data di pubblicazione che verrà utilizzato per cronologicamente ordinamento degli articoli.

class feed
{
    string title;
    string description;
    string feed_url;
    string local_location;
    string channel;
    bool feed_is_changed; // This is a flag that will be raised and lowered
      // when the feeds are being refreshed
    double last_updated; // The last update date/time will be converted to a
      //standardised double value
}

class feed_item
{
    string title;
    string description;
    double pub_time;
    double pub_time_in_sec; // I'm separating the seconds so they can be used
      // for a 'sub-index' when there are multiple feeds with the same pubtime
      // (there are restrictions on the data types we are allowed to use
      // (concocting work-arounds will aid in understanding, etc))
    double pub_date;
    int pub_year;
    int order_in_list; // The index that will be calculated from pub_time,
      // pub_date, etc
}

Il codice di cui sopra non è completo, attualmente sto identificando solo variabili e funzioni, e le / bit pubblico-privato verrò una volta che sono finalizzati. Come si può vedere dal codice di cui sopra, gli unici due variabili che vengono condivisi sono titolo e descrizione.

Non sono sicuro se vale la pena che li rende una coppia entità-base e solo disattivando le cinque variabili irrilevanti, se è più efficiente di fare solo loro classi completamente separati, o se si tratta di una preoccupazione del tutto situazionale, e che può essere sostenuto in entrambi i modi. Mie preoccupazioni sono che il codice può diventare difficile da mantenere e sia scala, ma che non può essere esecuzione sovraccarico inerente a un metodo o l'altro. Ogni pensiero suggerimenti su questo sarebbero apprezzate.

È stato utile?

Soluzione

A feed_item non è un feed e quindi fallisce la Liskov principio di sostituzione e shouldn' t essere una sottoclasse. Dovrei controllare le vostre orecchie -. Questo paio di classi assolutamente non suona come dovrebbero essere sottoclassi

Di tanto in tanto (molto, molto occasionalmente) implementazione di successione è una buona idea, ma di solito è meglio fatto estraendo parti condivise in una classe separata e di utilizzarlo in entrambe le implementazioni. Qui, è assolutamente una pessima idea - non c'è grande condivisione di codice, in modo che i benefici sono nella migliore delle ipotesi vaghe. Mantenete il vostro codice semplice!

Altri suggerimenti

Una sola classe derivata? Poi quasi certamente l'ereditarietà è il disegno sbagliato.

L'ereditarietà è limitante, e questi limiti, spesso non appaiono solo più tardi di prendere la decisione ancora più costoso.

La mia regola è quella di evitare l'ereditarietà meno che e fino posso fare un caso chiaro e convincente per utilizzarlo.

Se davvero si voleva una classe di base:

struct NamedItem {  // or maybe just "Item"
  string title;
  string description;
};

struct Feed : NamedItem {/*...*/};
struct FeedItem : NamedItem {/*...*/};

In alternativa, di solito preferito e una migliore vestibilità, in questo caso, l'uso di contenimento:

struct ItemInfo {
  string title;
  string description;
};

struct Feed {
  ItemInfo info;
  //...
};
struct FeedItem {
  ItemInfo info;
  //...
};

In particolare, se non avete idea di come viene utilizzato un "namedItem" senza conoscere il tipo più derivata, non ha senso utilizzare l'ereditarietà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top