是政策概念吗?

时间:2015-08-09 11:25:27

标签: c++

在完成现代C ++设计(Alexandrescu,2001)的第1部分时,我想到了以下想法:不是政策只是概念吗?

如果我理解正确,概念就是实现这个概念的类的接口的一组要求。

策略也是策略类必须满足的规范。 (虽然有些策略类可以提供丰富的接口,但我不确定这是否会使策略超出成为概念的范围)

2 个答案:

答案 0 :(得分:4)

您需要考虑概念和政策的目标是什么。

概念在语法和语义上建立了关于类的强烈假设。例如,Comparable意味着存在类型的比较运算符以及某些公理所持有的,即a == b -> a is equivalent to b,而不是operator==的任何其他实现。强有力的假设使代码更具可预测性。

另一方面,策略确定了类的实际行为,重点是可互换性。政策的每个单独实施都包含一个或多个概念;但是,插入类的策略的变体只共享约束。例如(伪代码):

// constraint Lockable -> has Lock() and Unlock() methods

// concept RealLockable -> constrained by Lockable, Lock() blocks other threads
// concept FakeLockable -> constrained by Lockable, Lock() does nothing

class FakeLock; // a policy that embodies the concept FakeLockable
class Lock; // a policy that embodies the concept RealLockable
class RecursiveLock; // a policy that can also embody the concept of RealLockable

template<class T, Lockable Lock> // constrained by Lockable
class Queue;

策略是一种改变目标类行为的实现技术。概念是建立假设的明确工具:

template<Comparable T>
class PriorityQueue;
在我看来,

Comparable T不是一项政策,因为当您指定PriorityQueue<int>PriorityQueue<double>时,您并不打算改变行为:在概念层面,所有这些队列都允许您在恒定时间内访问min或max元素。但是,对于未来的某种语法,您可以声称T体现了数学上正确的语义,即a < b -> b > a,然后Comparable T将成为一个概念。

最后,每个阶级,政策与否,代表一两个概念。类隐式引入概念,概念明确地记录它们。

答案 1 :(得分:1)

就我从该书中所理解的那样,基于策略的设计概念的区别并不是绝对准确的。仅仅因为后一个术语在历史上出现了。

Alexandrescu的政策是现今理解为概念的早期前身。

虽然有一条线:

概念不会改变实例化布局,而本书中介绍的策略可以。

我认为一个概念描述了一个接口,而一个策略可能参与了一个接口实现。