Методы получения значений или дополнительные атрибуты? - PullRequest
0 голосов
/ 06 ноября 2019

Допустим, у меня есть класс A с элементом данных info, который имеет пользовательский тип enum. info позволяет мне вывести много информации, которая мне нужна при использовании класса A, используя switch для info. Например, я могу захотеть получить string версию info, более общий short_info (несколько значений info, сгруппированных по одному значению short_info) и т. Д.

Вот два подхода, которые я могу себе представить, и, насколько я понимаю, об их соответствующих преимуществах и недостатках:

  1. Создание методов в A, которые выполняют switch на infoПреимущество: меньше элементов данных в A, поэтому меньше места для храненияНедостаток: методы должны вызываться каждый раз для значений, которые не меняются между вызовами, что может привести к более медленному выполнению
  2. Создание элементов данных, инициализированных во время построения и обновленных, если info изменяетсяПреимущество: более быстрый доступ к значениям, нет необходимости в дополнительных вычислениях при каждом вызове геттераНедостаток: больше места для хранения

Один из этих двух подходов обычно лучше? Зависит ли это от того, можно ли изменить элемент данных info после инициализации или какой-то другой фактор? Или есть лучший способ сделать это?

1 Ответ

1 голос
/ 06 ноября 2019

Один из этих двух подходов обычно лучше?

Не совсем. Они оба кажутся несколько плохими.

Или есть лучший способ сделать это?

Да. Имейте тип info быть классом с этими данными в качестве членов.

например, вместо

enum Info {
    info1,
    info2
};

class A {
    Info info;
    string info_desc() const; // switch on info
    ShortInfo info_abbr() const; // another switch
};

Вместо этого у вас есть

class Info {
    string desc;
    ShortInfo abbr;
}

Info info1 { "first info", ShortInfo::first };
Info info2 { "second info", ShortInfo::other };

class A {
    Info info;
}; // Does this do anything anymore?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...