#c #stack #abstraction
#c #стек #абстракция
Вопрос:
У меня есть следующая функция, которую я использую несколько раз в своем классе для абстракции:
void Interpreter::pushToStack(int value)
{
stack.push_back(std::to_string(value));
}
Теперь у меня есть определенная функция, в которой я делаю это:
stack.push_back(stack.back());
Это плохая практика? Плохо ли быть непоследовательным в использовании функций абстракции? Потому что я думаю, что я не могу действительно использовать pushToStack(int)
, поскольку для этого требуется целое число, и я хочу нажать stack.back()
.
Спасибо!
Комментарии:
1. вы можете вызвать функцию следующим образом
pushToStack(std:stoi(stack.back()))
2. Да, я думал об этом, но обязательно ли это лучший код? Или это
stack.pus_back(stack.back());
тоже «хороший» код?3. Это основано на мнениях, но я бы сказал, что этот дизайн плох. Должен быть единый унифицированный способ изменения элемента данных. Наличие как
pushToStack()
функции-члена, так и случайных пустыхpush_back
s очень сбивает с толку.4. Спасибо. Я знаю, что это действительно немного основано на мнениях, но я думаю, что согласен с вами. Я буду использовать my
pushToStack(int)
-function consistent!5. Вы можете сделать его виртуальным и при необходимости перезаписать его в «дочернем» классе
Ответ №1:
Для согласованности вы могли бы добавить перегрузку для строк,
void Interpreter::pushToStack(int value)
{
stack.push_back(std::to_string(value));
}
void Interpreter::pushToStack(std::string value)
{
stack.push_back(value);
}
и затем во всех точках вызова вы будете использовать один и тот же подход
pushToStack(5);
pushToStack(stack.back());
Комментарии:
1. Большое спасибо за этот вклад. Я хотел бы знать, считает ли больше людей, что это даже лучшее решение.
2. @TristanvO Я думаю, это худшее решение. Мне не нравится разделение
stack
между точкой вызова и телом функции. Что-то вродеvoid Interpreter::duplicateStackBack()
выглядит как лучшая альтернатива.3. @TristanvO: да, лучше, чем ваш оригинал, потому что существование
pushToStack
предполагает, что все stack push проходят через эту функцию (и это будет точка, где, например, для добавления уведомлений об изменениях). Однако я бы сделалpushToStack(int)
вызовpushToStack(string)
вместоstack
прямого доступа. предложение @Evg является предпочтительным, если дублирование обратной части стека является единственной видимой причиной, по которой вы могли бы вставить строку.4. А как насчет наличия только
pushToStack(string)
функции? Затем я бы вызывалpushToStack(std::to_string(int))
каждый раз, когда хотел ввести целое число. Это тоже хороший дизайн? Потому что я хотел бы иметь только одну функцию, обрабатывающую этот материал. @peterchen @Evg5. @TristanvO Трудно сказать, не видя всего решения. Мне сильно не нравится
pushToStack(stack.back());
, и я бы попытался найти лучшую альтернативу.