Se una determinata parte membri essere condivisa tra la base e classi derivate?
-
29-09-2019 - |
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.
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à.