基于原则设计

✍ dations ◷ 2025-05-19 03:02:07 #计算机编程,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于其中。

相关

  • 温泉温泉(英语:hot spring)是一种由地下自然涌出的泉水,其水温较环境年平均温高摄氏5度,或华氏10度以上。在学术上,涌出地表的泉水温度高于当地的地下水温者,即可称为温泉。温泉的形成
  • 快速诊断测试快速诊断测试(RDT)是步骤简单可以快速进行,也可以快速得知结果的医疗诊断测试(英语:diagnostic test),适用于初步或是紧急的筛检(英语:Screening (medicine)),也会用在资源有限的医疗机
  • 古典拉丁语古典拉丁语(古典拉丁语:LINGVA LATINA;拉丁语:Latina Classica)为罗马帝国的官方语言与标准语,盛行于公元前1世纪至公元2世纪。在古典拉丁语,C和G总是发 和 的音,和现代的罗曼语族
  • 胶原胶原蛋白(collagen) 占哺乳类动物总蛋白质约20% ,也是人体的一种非常重要的蛋白质,主要存在于结缔组织中。它有很强的伸张能力,是韧带的主要成分,胶原蛋白也是细胞外基质的主要组
  • 郑永飞郑永飞(1959年10月-),安徽长丰人,中国地球化学家,中国科学技术大学教授。1982年毕业于南京大学地质学系并获学士学位,1985年获该校硕士学位,1991年在德国哥廷根大学获博士学位。现任
  • 马苏里拉奶酪马苏里拉奶酪(意大利语:mozzarella)是一种源自于意大利南部城市坎帕尼亚和那不勒斯的淡奶酪。最初以水牛奶为主要材料,但由于成本原因,现在大部分都已经改用牛奶制作。马苏里拉奶
  • 金翔龙金翔龙(1934年11月29日-),江苏南京人,中国海洋地质、海洋地球物理学家,中国工程院院士。金翔龙出生于江苏省南京市。1952年毕业于南京市第一中学。1956年毕业于中国地质大学(原北京
  • 杰伊·加纳杰伊·蒙哥马利·加纳(Jay Montgomery Garner,1938年4月15日-) 出生于美国佛罗里达州阿卡迪亚,美国陆军退役中将。在越南战争中,他曾两度到前线作战,亦曾参加波斯湾战争。2003年,在
  • 夏洛特黄蜂夏洛特黄蜂(英语:Charlotte Hornets),是一支位于美国北卡罗来纳州夏洛特的NBA篮球队,分属于东部的东南赛区,主场为时代华纳有线球场。球队的拥有者为NBA传奇球星迈克尔·乔丹。原
  • 葛菜水葛菜水(又称野葛菜水或野葛菜汤)是中国广东凉茶之一,在一般凉茶铺有售。葛菜水的主要材料是塘葛菜(,又名葶苈、山芥菜),一般佐以海盐调味。塘葛菜性凉,味带草香而甘,有清热下火、生津