0

私は現在、コースワーク用に作成しているアプリケーションのクラスを設計しています。ベースから派生したクラスペアであるかのように聞こえ、実際に2つのメンバー変数を共有する、2つのクラスがあります。私の問題は、それぞれに7つのメンバー変数があり、操作はありません。

これらのクラスの構造の理由は、RSSリーダーを構築しており、これら2つのクラスにフィードのデータを保持させる予定であるためです。1つ目は、フィード自体のデータ(たとえば、ソースURL、ローカルストレージ上のrss.xmlファイルの場所、フィードが最後に更新された日時など)を保持します。2つ目は、フィード内に含まれる記事に関する情報を保持します。記事を時系列で並べ替えるために使用される、発行日時や発行日に基づく整数インデックスなどのフィード。

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
}

上記のコードは完全ではありません。現在、変数と関数のみを識別しています。プライベート/パブリックビットは、それらが完成すると表示されます。上記のコードからわかるように、共有されている2つの変数はタイトル説明だけです。

それらをエンティティベースのペアにして、5つの無関係な変数を非アクティブ化するだけの価値があるのか​​、完全に別個のクラスにする方が効率的であるのか、それとも完全に状況に応じた懸念であるのか、そして議論できるのかどうかはわかりません。どちらにしても。私の懸念は、コードの保守とスケーリングの両方が困難になる可能性があることですが、いずれかの方法に固有の実行オーバーヘッドが存在する可能性があることです。これについての考えやアドバイスをいただければ幸いです。

4

3 に答える 3

2

feed_itemはフィードではないため、Liskov置換原則に失敗し、サブクラスであってはなりません。私はあなたの耳をチェックする必要があります—このクラスのペアは絶対にサブクラスである必要があるようには聞こえません。

ときどき(非常に、非常にまれに)実装の継承は良い考えですが、通常は、共有パーツを別のクラスに抽出し、両方の実装で使用することをお勧めします。ここでは、それは絶対にひどい考えです—コードの素晴らしい共有はないので、利点はせいぜい漠然としています。コードをシンプルにしてください!

于 2010-11-06T12:26:17.450 に答える
1

派生クラスは1つだけですか?そして、ほぼ間違いなく、継承は間違った設計です。

継承は制限されており、これらの制限は、後で決定をさらに高価にするまで表示されないことがよくあります。

私の経験則は、継承を使用するための明確で説得力のあるケースを作成できる場合を除いて、継承を回避することです。

于 2010-11-05T21:53:51.407 に答える
1

基本クラスが本当に必要な場合:

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

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

または、通常は好まれ、この場合はより適切に、封じ込めを使用します。

struct ItemInfo {
  string title;
  string description;
};

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

特に、最も派生した型を知らずに「NamedItem」をどのように使用するかわからない場合は、継承を使用する意味がありません。

于 2010-11-06T15:23:08.677 に答える