В качестве примера, у меня есть класс, который я хранящую информацию о бинарных файлах:String pooling/interning - Это хорошая практика?
class car {
char car_manufacturer;
//other stuff
};
Если значение car_manufacturer
является одним из значений:
enum car_manufacturers : char {
VOLVO = 0,
AUDI,
MERCEDES
};
В настоящее время в это пример приложения, пользователь захочет строковое представление своего автопроизводителя, а не числа, поэтому я создаю массив со строковыми представлениями перечислений , где упорядочение массива такое же, как и перечисление, поэтому car_manufacturer
может быть используется как индекс массива
std::string car_manufacturers_strings[MERCEDES + 1] = {
"Volvo",
"Audi",
"Mercedes"
};
Так что теперь после загрузки файла и создания car
объект из данных, я могу получить марку автомобиля, как строка просто car_manufacturers_strings[car.car_manufacturer];
Преимущество этого в том, что, в файлах мне не нужно хранить кучу повторяющихся строк, если машины были одинаковыми, поэтому я сохраняю много места. Но недостатком этого является то, что код немного сложнее.
Это хорошая или плохая практика?
Вы можете добавить метод в свой класс, который выполняет именно это. Затем тот факт, что эти строки хранятся в массиве с тем же порядком, что и перечисление производителя, является деталью реализации, которая скрыта от пользователя. – MicroVirus
@MicroVirus Это точно так же, как я реализовал его в своем приложении, а автомобили - аналогия. Фактически, я реализовал эквивалент 'car.get_car_manufacturer_name();' – user3680400