C++ 你觉得什么是过度概括?

C++ 你觉得什么是过度概括?,c++,templates,generic-programming,C++,Templates,Generic Programming,我花了一些时间在Haskell和其他函数式语言中游历,我逐渐体会到用一般术语描述问题所带来的设计的简单性。虽然模板编程的许多方面可能远不简单,但有些用法非常常见,我认为它们不会妨碍清晰性(尤其是函数模板)。我发现模板通常可以简化当前的设计,同时自动增加一些未来的阻力。为什么它们的功能应该归图书馆作者所有 另一方面,有些人似乎避免使用类似瘟疫的模板。我在十年前就理解了这一点,当时泛型类型的概念对大多数编程社区来说都是陌生的。但是现在所有流行的静态类型OO语言都支持某种形式的泛型。这种熟悉感的增加似

我花了一些时间在Haskell和其他函数式语言中游历,我逐渐体会到用一般术语描述问题所带来的设计的简单性。虽然模板编程的许多方面可能远不简单,但有些用法非常常见,我认为它们不会妨碍清晰性(尤其是函数模板)。我发现模板通常可以简化当前的设计,同时自动增加一些未来的阻力。为什么它们的功能应该归图书馆作者所有

另一方面,有些人似乎避免使用类似瘟疫的模板。我在十年前就理解了这一点,当时泛型类型的概念对大多数编程社区来说都是陌生的。但是现在所有流行的静态类型OO语言都支持某种形式的泛型。这种熟悉感的增加似乎证明了保守态度的调整是必要的

最近有人向我表达了这样一种保守的态度:

你不应该做任何比必要的更一般的事情——软件开发的基本规则

我真的很惊讶地看到这句话如此不屑一顾,好像它应该是不言而喻的。就我个人而言,我发现这一点远非不言而喻,因为像Haskell这样的语言,除非您另有说明,否则所有内容都是通用的。话虽如此,我想我理解这种观点的来源

在我的脑海里,我确实有类似的规则。现在它处于最前沿,我意识到我总是从整体架构的角度来解释它。例如,如果你有一个类,你不想加载它与吨的功能,你可能有一天使用。如果您只需要一个具体的版本,那么就不用费心制作接口(尽管可模仿性可能与此相反)。诸如此类的事情

然而,我不做的是在微观层面上应用这一原则。如果我有一个没有理由依赖于任何特定类型的小实用程序函数,我将创建一个模板


那你觉得呢?你认为过度概括是什么?根据上下文,此规则是否具有不同的适用性?你甚至同意这是一条规则吗?

当你浪费时间去概括某件事时,它被过度概括了。如果您将来打算使用通用功能,那么您可能不会浪费时间。这真的很简单[在我看来]


需要注意的一点是,如果使您的软件变得更加混乱,那么使其通用化并不一定是一种改进。通常会有一种权衡。

过度概括会让我发疯。我不害怕模板(非常接近),我喜欢通用的解决方案。但我也喜欢解决客户为之付费的问题。如果这是一个为期一周的项目,为什么我现在要资助一个为期一个月的盛会,它将不仅通过未来可能发生的明显变化,如新的税收,而且可能通过发现新的月球或火星上的生命,继续发挥作用

回到模板,客户机需要一些功能,包括编写一个包含字符串和数字的函数。您给了我一个模板化的解决方案,它可以采用任意两种类型,并针对我的具体案例做正确的事情,而在其他案例中,它可能是正确的,也可能是不正确的(由于缺乏需求),我将不胜感激。我会很生气,除了付钱给你之外,我还得付钱给某人来测试它,有人来记录它,还有人在将来遇到更一般的情况时在你的限制范围内工作


当然,并非所有的泛化都是过度泛化。一切都应该尽可能简单,但不能简单。必要时一般,但不能再一般。尽我们所能进行测试,但没有更多的测试。还有,“预测可能发生的变化并封装它。”所有这些规则都很简单,但并不容易。这就是为什么智慧对开发人员和管理人员很重要。

如果你能同时做到这一点,并且代码至少同样清晰,那么泛化总是比专业化好

XP用户遵循的一个原则叫做YAGNI——你不需要它

政府这样说:

即使你完全,完全,完全确定你以后会需要一个特性,现在也不要实现它。通常情况下,结果要么是a)你根本不需要它,要么是b)你实际需要的与你先前预计需要的完全不同

这并不意味着您应该避免在代码中增加灵活性。这意味着你不应该过度设计基于你认为你以后可能需要的东西


微软有两个过度概括的例子:
1.)CObject(MFC)
2.)对象(.Net)


<>这两种方法都是用来实现C++中大多数人不使用的泛型。事实上,每个人都对这些参数进行了类型检查(COBKED/Object)~

< P>我认为你应该考虑编程的两个基本原则:吻(保持简单明了)和干燥(不要重复自己)。大多数情况下,我从第一个开始:以最直接、最简单的方式实现所需的功能。通常这已经足够了,因为它已经可以满足我的需求了。在这种情况下,它仍然是简单的(而不是通用的)

当第二次(或最多第三次)我需要类似的东西时,我尝试根据具体的现实生活示例->来概括问题(函数、类、设计等等),我不太可能只为自己做概括。 下一个类似的问题:如果它优雅地适合当前图片,很好,我可以很容易地解决它。如果没有,我会检查当前的解决方案是否可以进一步推广(不会使它太复杂/不那么优雅)

我认为你甚至应该做类似的事情
// No container implements this, it's easy... but better write it only once!
template <class Container, class Pred>
void erase_if(Container& c, Pred p)
{
  c.erase(std::remove_if(c.begin(), c.end(), p), c.end());
}

// Same as STL algo, but with precondition validation in debug mode
template <class Container, class Iterator = typename Container::iterator>
Iterator lower_bound(Container& c, typename Container::value_type const& v)
{
  ASSERT(is_sorted(c));
  return std::lower_bound(c.begin(), c.end(), v);
}
void Foo::print() { std::cout << /* some stuff */ << '\n'; }

// VS

std::ostream& operator<<(std::ostream& out, Foo const& foo)
{
  return out << /* some stuff */ << '\n';
}
Object saveOrUpdate(Object object)