【问题标题】:Consistency with abstraction functions与抽象函数的一致性
【发布时间】:2021-01-29 01:41:46
【问题描述】:

我在课堂上多次使用以下函数进行抽象:

void Interpreter::pushToStack(int value)
{
    stack.push_back(std::to_string(value));
}

现在我有一个特定的功能:

stack.push_back(stack.back());

这是不好的做法吗?在使用抽象函数时不一致是不是很糟糕?因为我认为我不能真正使用pushToStack(int),因为它需要一个整数,我想推送stack.back()

谢谢!

【问题讨论】:

  • 可以这样调用函数pushToStack(std:stoi(stack.back()))
  • 是的,我虽然是这样,但那一定是更好的代码吗?或者stack.pus_back(stack.back()); 也是“好”代码?
  • 这是基于意见的,但我会说这种设计很糟糕。应该有一种统一的方式来改变数据成员。同时拥有pushToStack() 成员函数和偶尔裸露的push_backs,非常令人困惑。
  • 谢谢。我知道这确实有点基于意见,但我想我同意你的看法。我将使用我的pushToStack(int)-功能一致!
  • 你可以把它变成虚拟的,如果需要的话在“Child”类中覆盖它

标签: c++ stack abstraction


【解决方案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());

【讨论】:

  • 非常感谢您的意见。我想知道是否有更多人认为这是一个更好的解决方案。
  • @TristanvO 我想这是一个更糟糕的解决方案。我不喜欢在调用点和函数体之间拆分stackvoid Interpreter::duplicateStackBack() 之类的东西看起来是更好的选择。
  • @TristanvO:是的,比你原来的更好,因为pushToStack 的存在表明所有堆栈推送都通过这个函数(这将是例如添加更改通知的地方)。但是,我会让pushToStack(int) 调用pushToStack(string) 而不是直接访问stack。 @Evg 的建议是最好的 如果 复制堆栈的背面是您推送字符串的唯一可预见的原因。
  • 那么只有一个pushToStack(string) 函数呢?然后,每次我想推送一个整数时,我都会调用pushToStack(std::to_string(int))。这也是个好设计吗?因为我只想有一个函数来处理这些东西。 @peterchen @Evg
  • @TristanvO 没有看到完整的解决方案很难说。我非常不喜欢pushToStack(stack.back());,并会尝试找到更好的选择。
猜你喜欢
  • 2012-08-06
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2014-08-13
  • 2013-04-11
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多