Sollte ein bestimmte Anteil der Mitglieder zwischen Basis und abgeleiteten Klassen geteilt werden?

StackOverflow https://stackoverflow.com/questions/4110317

Frage

Ich bin die Gestaltung derzeit die Klassen für eine Anwendung, die ich für meinen Kurs mich schreibe, und ich habe zwei Klassen, die klingen, als ob sie eine Basis abgeleitete Klasse Paar sein sollen, und in der Tat zwei Membervariablen teilen, und meine Problem ist, dass sie jeweils sieben Mitgliedsvariablen und keine Operationen.

Der Grund für die Struktur dieser Klassen ist, dass ich einen RSS-Reader bin Gebäude und ich beabsichtige, diese beiden Klassen auf die Feeds halten Daten zu haben. Die erste wird die Daten auf dem Futter selbst, zum Beispiel die Quell-URL, die Lage der rss.xml Datei auf dem lokalen Speicher halten, wenn die Beschickung zuletzt aktualisiert wurde, usw. Die zweite Informationen zu den Artikeln halten, die innerhalb der Futtermittel wie die Veröffentlichung Datum / Uhrzeit und einen ganzzahligen Index zum Zeitpunkt der Publikation basiert, die Art zu chronologisch verwendet werden die Artikel.

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
}

Der obige Code ist nicht vollständig, bin ich zur Zeit nur Variablen und Funktionen zu identifizieren, und die privaten / öffentlichen Bits werden kommen, sobald sie fertig sind. Wie Sie aus dem obigen Code sehen können, die nur zwei Variablen, die gemeinsam genutzt werden, sind title und Beschreibung.

Ich bin nicht sicher, ob es wert ist sie eine Einheit-Basenpaar zu machen und nur die fünf irrelevanten Variablen zu deaktivieren, wenn es effizienter ist, nur sie völlig getrennte Klassen zu machen, oder wenn es sich um eine völlig situations Sorge, und dass es kann so oder so argumentiert werden. Meine Bedenken sind, dass der Code sowohl pflegen und Maßstab schwierig werden kann, sondern dass es möglicherweise Ausführung Kopf inhärente in einem Verfahren oder der anderen Seite. Alle Gedanken und Ratschläge zu diesem Thema würden die meisten geschätzt werden.

War es hilfreich?

Lösung

Ein feed_item ist kein Futter, so dass es das Liskov Substitutionsprinzip und shouldn‘ t eine Unterklasse sein. Ich soll die Ohren überprüfen -. Dieses Paar Klassen absolut nicht klingen wie sie Subklassen sein sollten

Gelegentlich (sehr, sehr gelegentlich) Implementierungsvererbung ist eine gute Idee, aber es ist in der Regel besser gemacht durch gemeinsame Teile in eine separate Klasse zu extrahieren und es in beiden Implementierungen verwenden. Hier ist es absolut eine schreckliche Idee - es gibt keine große gemeinsame Nutzung von Code, so dass die Vorteile bestenfalls vage sind. Halten Sie Ihren Code einfach!

Andere Tipps

Nur eine Klasse abgeleitet? Dann mit ziemlicher Sicherheit Vererbung ist das falsche Design.

Die Vererbung ist die Begrenzung, und diese Grenzen oft nicht erscheinen erst später die Entscheidung noch teurer.

Meine Faustregel ist die Vererbung zu vermeiden, solange ich ein klares und überzeugendes Argument machen, es zu benutzen.

Wenn Sie wirklich eine Basisklasse gesucht:

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

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

Oder, in der Regel bevorzugt, und eine bessere Passform in diesem Fall Verwendung Haltung:

struct ItemInfo {
  string title;
  string description;
};

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

Insbesondere dann, wenn Sie keine Ahnung haben, wie man ein „namedItem“ verwenden wird, die am meisten abgeleiteten Typen, ohne zu wissen, es macht keinen Sinn für die Verwendung Vererbung machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top