在完成现代C ++设计(Alexandrescu,2001)的第1部分时,我想到了以下想法:不是政策只是概念吗?
如果我理解正确,概念就是实现这个概念的类的接口的一组要求。
策略也是策略类必须满足的规范。 (虽然有些策略类可以提供丰富的接口,但我不确定这是否会使策略超出成为概念的范围)
答案 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的政策是现今理解为概念的早期前身。
虽然有一条线:
概念不会改变实例化布局,而本书中介绍的策略可以。
我认为一个概念描述了一个接口,而一个策略可能参与了一个接口实现。