基于原则设计

✍ dations ◷ 2025-10-24 02:25:23 #计算机编程,C++

基于原则设计(Policy-Based Class Design)又名policy-based class design 或 policy-based programming, 是一种基于C++计算机程序设计规范,以原则(Policy)为基础,并结合C++的模板超编程(template metaprogramming)。policy-based首见于 Andrei Alexandrescu 出版的 《Modern C++ Design》 一书以及他在C/C++ Users Journal杂志专栏 Generic<Programming> 。

Policy的意思是方针,或策略,也就是将原本复杂的系统,拆解成多个独立运作的“策略类别”(policy class),每一组policy class都只负责单纯如行为(behavior, method)或结构(structure)的某一方面。Templetes与多重继承(Multiple Inheritance)两项技术互补。多重继承由于继承自多组 Base Class,故缺乏型别消息(type information),而Templetes基于型别,拥有丰富的型别消息。多重继承容易扩张,而Templetes的特化(Specialization)不容易扩张。Policy-Based Class Design 同时使用了 Template 以及 Multiple Inheritance 两项技术,结合两者的优点。

template<         class Policy1,         class Policy2,         class Policy3>class PolicyBasedClass:public Policy1, public Policy2{public:   PolicyBasedClass(){};};

PolicyBasedClass则称为宿主类别(host class),只需要切换不同 Policy Class,就可以得到不同的需求。Policy不一定要被宿主(host)继承,只需要用委托(delegation)完成这一工作。但policies必须遵守一个隐含的constraint,接口(interface)必须一样,故参数不能有巨大改变。

Policy class有点类似回调函数(callbacks),但不同的是,callback只是一个函数,至于 policy class 则尽可能包含许多的 functions (methods), 有时还会结合状态变量(state variables)与其他各式各样的类型,如嵌套类型(nested types)。

policy 的一个重要的特征是,宿主类别(host class)经常(并不一定要)使用多重继承的机制去使用多个 policy classes. 因此在进行 policy 拆解时,必须要尽可能达成正交分解(Orthogonal Decomposition),policy彼此独立运作,不相互影响。

在 C++ 的Policy-Based Design 中,用来建构 Template 的类别参数(也就是policy class),本身亦可以是一个 Tempate 化的类别,形成所谓的 Template Template Parameter。

如果 Read()、Write() 有各种不同名目的参数时,可以利用 template 的不完全具现化 (Incomplement Instantiation) 特征检实现各个参数不同的成员函数(member function)。在host class中,可以撰写不同参数版本的 Read(...) 函数,这有赖于c++ compiler的协助。

template<	class T,	template< class > class ReadPolicy,	template< class > class WritePolicy>class ResourceManager	:	public ReadingPolicy< T >,	public WritingPolicy< T >{public:   void Read();   void Write(XmlElement*);   void Write(DataSource*);};

上述的class T即是一个Template Template Parameter,这使得 Policy Class 更具扩展性与弹性,能够处理各种类型的实体(instance)。

void main(){  ResourceManager< AnimationEntity, BinaryReader, BinaryWriter > ResMgr1;  ResourceManager< ScriptEntity, TextReader, TextWriter > ResMgr2;}

示例

下例是 C++ hello world的示例,可以使用各种原则(policies)打印文字。

template<    typename output_policy,    typename language_policy>class HelloWorld  : public output_policy,    public language_policy{    using output_policy::Print;    using language_policy::Message;public:    //behaviour method    void Run()    {        //two policy methods        Print( Message() );    }};#include <iostream>class HelloWorld_OutputPolicy_WriteToCout{protected:    template< typename message_type >    void Print( message_type message )    {        std::cout << message << std::endl;    }};#include <string>class HelloWorld_LanguagePolicy_English{protected:    std::string Message()    {        return "Hello, World!";    }};class HelloWorld_LanguagePolicy_German{protected:    std::string Message()    {        return "Hallo Welt!";    }};int main(){/* example 1 */    typedef        HelloWorld<            HelloWorld_OutputPolicy_WriteToCout,            HelloWorld_LanguagePolicy_English        >            my_hello_world_type;    my_hello_world_type hello_world;    hello_world.Run(); //returns Hello World!/* example 2  * does the same but uses another policy, the language has changed */    typedef        HelloWorld<            HelloWorld_OutputPolicy_WriteToCout,            HelloWorld_LanguagePolicy_German        >            my_other_hello_world_type;    my_other_hello_world_type hello_world2;    hello_world2.Run(); //returns Hallo Welt!}

你可以更容易的撰写其他的 Output policy, 单靠你创造更新的Policy class并实现print于其中。

相关

  • 虚词虚词,也称功能词(Function word),与实词相对,指的是汉语词汇中没有实际意义的词,同时虚词也无法独立成句。一般包含副词、介词、连接词、助词、叹词等。虚词一般包含副词、介词、
  • 约克镇级约克城级航空母舰(英语:Yorktown Class aircraft carrier)是美国在战间期设计的航空母舰,前后一共建造3艘,是继列克星敦级与突击者级航空母舰后,美国设计的第三款舰队航空母舰。约
  • 古亭区邻接行政区 城中区、大安区、双园区、龙山区、景美区;台北县中和市、永和市古亭区为台北市旧行政区之一,区名源自区内地名“古亭庄”,位于台湾台北市西南方,呈长条状由西北向东
  • τ中微子τ中微子(Tau neutrino)是基本粒子中微子的一类,不带电荷,符号为ν τ;与τ子一起共同组成了第三代轻子,因此称作τ中微子。马丁·佩尔与其同事在1974年到1977年间于SLAC 国家加速
  • 苏丹公民签证要求部分国家给予苏丹护照持有者豁免签证或落地签证待遇, 苏丹公民如欲入境这些国家,无需提前申请签证。安提瓜和巴布达 · 阿根廷 · 阿鲁巴 · 巴哈马 · 巴巴多斯 · 伯
  • 蓟苦素蓟苦素(英文:cynicin;centaurin。化学名:Butanoic acid),主要有抗菌消炎、美白抗肿瘤的作用;经试验证明,具有抗菌作用,51~224μg/ml浓度下,对绿脓杆菌等8种菌株有抑制作用,对流产杆菌
  • EpidataEpiData是一个既可以用于创建数据结构文档,也可以用于数据定量分析一组应用工具的集合。EpiData协会于1999年在丹麦成立。EpiData采用Pascal开发。在允许的情况下,尽可能地使
  • 崇文 (新加坡)崇文(英语:Chong Boon;白话字:Chông-bûn)是新加坡宏茂桥的一个管理区。崇文是德义(Teck Ghee)的一个区域,于新加坡宏茂桥集选区范围内,选区的国会议员为洪鼎基与总理李显龙等。
  • 瓦瓦泰尼纳坐标:17°28′S 49°12′E / 17.467°S 49.200°E / -17.467; 49.200瓦瓦泰尼纳(马达加斯加语:Vavatenina),是马达加斯加的城镇,位于该国中部,由阿那拉芒加区负责管辖,是瓦瓦泰尼纳
  • 海伦芦荟海伦芦荟(学名:)是马达加斯加特有的一种芦荟。它们现正处于极危,并受到《濒危野生动植物种国际贸易公约》附录一的保护。