Должна ли определенная доля членов распределяться между базовым и производным классами?

В настоящее время я разрабатываю классы для приложения, которое я пишу для своей курсовой работы, и у меня есть два класса, которые звучат так, как будто они должны быть парой базовых классов, и действительно имеют две общие переменные-члены, и моя проблема в том, что каждая из них имеет семь переменных-членов и не имеет операций.

Причина структуры этих классов заключается в том, что я создаю программу для чтения RSS, и я намереваюсь, чтобы эти два класса хранили данные о каналах. В первом будут храниться данные о самом канале, например URL-адрес источника, расположение файла rss.xml в локальном хранилище, дата последнего обновления канала и т. д. Второй будет содержать информацию о статьях, содержащихся в фид, такой как дата/время публикации и целочисленный индекс, основанный на дате публикации, который будет использоваться для хронологической сортировки статей.

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
}

Приведенный выше код не завершен, в настоящее время я только идентифицирую переменные и функции, а частные/общедоступные биты появятся после их завершения. Как видно из приведенного выше кода, общими являются только две переменные: title и description.

Я не уверен, стоит ли сделать их парой сущность-база и просто деактивировать пять нерелевантных переменных, эффективнее ли просто сделать их полностью отдельными классами, или это полностью ситуационная проблема, и что это можно утверждать так или иначе. Меня беспокоит то, что код может стать трудным для поддержки и масштабирования, но могут возникнуть накладные расходы на выполнение, присущие тому или иному методу. Любые мысли и советы по этому поводу будут высоко оценены.


person Community    schedule 05.11.2010    source источник
comment
Дайте определение «стоимости» и «эффективности». Для чего вы оптимизируете?   -  person    schedule 06.11.2010
comment
Могу я спросить, какова цель класса с 7 переменными-членами и без операций?   -  person quentin-starin    schedule 06.11.2010
comment
@Paul Hankin Когда я говорю «стоит» и «эффективен», я имею в виду ремонтопригодность и масштабируемость кода, а также эффективность выполнения. Извините, я должен был указать это в вопросе.   -  person    schedule 06.11.2010
comment
@qstarin Это классы сущностей (я создаю программу для чтения RSS-каналов, и они содержат переменную, которая будет содержать как каналы, так и составляющие статьи (и их метаданные) соответственно. Извините, я должен был указать это. Я обновил вопрос чтобы ответить на вопросы Пола Хэнкина и qstarin.   -  person    schedule 06.11.2010
comment
У меня возникли проблемы с тем, чтобы точно следовать вашему описанию цели классов. Если бы вы добавили код для них, я бы чувствовал себя более уверенно, рекомендуя тот или иной способ. Кроме того, здесь нет абсолютно никаких соображений времени выполнения - это было бы слишком преждевременной микрооптимизацией.   -  person quentin-starin    schedule 06.11.2010
comment
Я добавил код, который у меня есть, и расширил описание, чтобы содержать больше деталей.   -  person    schedule 06.11.2010
comment
Какой язык вы используете? Это почти похоже на С++...   -  person    schedule 06.11.2010
comment
Это С++. Как я уже сказал выше, код не завершен (я еще не начал его писать и только знакомлюсь с ООП и классами, поэтому вполне могут быть ошибки выше, так как он был быстро собран по просьбе другого комментатора.   -  person    schedule 06.11.2010


Ответы (3)


Элемент feed_item не является фидом, поэтому он не соответствует принципу замены Лисков и не должен быть подкласс. Я должен проверить ваши уши — эта пара классов совершенно не звучит так, как будто они должны быть подклассами.

Иногда (очень, очень редко) наследование реализации является хорошей идеей, но обычно это лучше сделать, извлекая общие части в отдельный класс и используя его в обеих реализациях. Здесь это абсолютно ужасная идея — нет возможности поделиться кодом, поэтому преимущества в лучшем случае туманны. Держите свой код простым!

person Community    schedule 06.11.2010

Только один производный класс? Тогда почти наверняка наследование — это неправильный замысел.

Наследование ограничивает, и эти ограничения часто не проявляются до тех пор, пока решение не становится еще дороже.

Мое эмпирическое правило состоит в том, чтобы избегать наследования до тех пор, пока я не смогу привести четкие и убедительные доводы в пользу его использования.

person quentin-starin    schedule 05.11.2010

Если вам действительно нужен базовый класс:

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», не зная наиболее производного типа, нет смысла использовать наследование.

person Community    schedule 06.11.2010