基于原则设计

✍ dations ◷ 2024-12-22 22:41:31 #计算机编程,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于其中。

相关

  • 自闭症光谱自闭症谱系(英语:Autism spectrum)是一种心理状况的谱系障碍,亦称自闭症谱系障碍(英语:autism spectrum disorders,简写ASD;或autism spectrum conditions,简写ASC)或泛自闭症障碍,描述
  • 碱雨碱雨,顾名思义,就是呈碱性的雨,与酸雨相反。 碱雨的成因可以有两方面,例如:当氧化钙或氢氧化钠的粉尘排放到空气里,又或是有时 在一些氨工厂周围因为氨气排放到空气里。这些碱性的
  • 诉诸冗赘诉诸冗赘(英语:proof by verbosity;拉丁语:argumentum verbosium),是一种非形式谬误,系借由使用冗长复杂、看似高深莫测的数学公式或专业术语证成主张,令读者无从反驳,要么承认自己看
  • 虐待动物虐待动物是指人类对非人类动物畜意或非畜意施行使该动物承受痛苦或伤害的行为。无论该行为是否违反事发国家的法律,如符合条件,皆可被视为虐待动物。虐待动物的行为可以分为几
  • 范妮·门德尔松范妮·采齐莉·门德尔松(德语:Fanny Cäcilie Mendelssohn,1805年11月14日-1847年5月14日),夫姓为亨塞尔(Hensel),德国钢琴家,作曲家。费利克斯·门德尔松之姊。她自幼就显示出色的音
  • 热河日记《热河日记》是朝鲜实学派文学家朴趾源所作的长篇纪行文学作品。1780年,朴趾源的堂兄朴明源被任命为赴中国清朝祝贺乾隆70大寿的“入燕使节团”正使。他作为随行人员一同前往
  • 锌补充剂3d10 4s22, 8, 18, 2蒸气压第一:906.4 kJ·mol−1 第二:1733.3 kJ·mol−1 第三:3833 kJ·mol−1 (主条目:锌的同位素锌(英语:zinc)是化学元素,化学符号是Zn,原子序数是30,相对原子
  • 休斯敦得克萨斯人国家橄榄球联盟(2002年至今)联盟冠军(0)联会冠军(0) 0分区冠军(6)休斯敦德克萨斯人(英语:Houston Texans)是一支位于得克萨斯州的休斯敦的职业美式橄榄球球队。他们现时是国家橄榄球联
  • 韦茨拉尔大教堂韦茨拉尔大教堂(德语:)是德国黑森州韦茨拉尔的一座大型教堂,位于法兰克福以北50公里的兰河畔。工程开始于1230年,至今仍未完成,因为西立面仍然缺少北侧钟楼。由于其建设周期漫长,建
  • 理查德·哈特向理查德·哈茨霍恩(英文:Richard Hartshorne,1899年12月12日-1992年11月5日),美国著名地理学家,生于宾夕法尼亚州基坦宁,逝世于威斯康星州麦迪逊。哈特向1920年本科毕业于普林斯顿大