Согласованность с функциями абстракции

#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 @Evg

5. @TristanvO Трудно сказать, не видя всего решения. Мне сильно не нравится pushToStack(stack.back()); , и я бы попытался найти лучшую альтернативу.