基于原则设计

✍ dations ◷ 2025-11-21 00:13: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于其中。

相关

  • 粗面内质网内质网(英语:Endoplasmic reticulum, ER)是在真核生物细胞中由膜围成的隧道系统,为细胞中的重要细胞器。实际上内质网是膜被折叠成一个扁囊或细管状构造,可分为粗面内质网(Rough E
  • 单配偶制单配偶制包含一夫一妻制,是指一种两两配对,每个个体只拥有单一配偶的关系,关系中两者一生中,或在生命中任何一个时间,只会与对方维持关系。单配偶制有别于多配偶制。单配偶制在动
  • 黏多糖糖胺聚糖(英语:Glycosaminoglycan,简称为GAGs,旧称为黏多糖(英语:mucopolysaccharides))是蛋白聚糖大分子中聚糖部分的总称。由糖胺的二糖重复单位组成,二糖单位中通常有一个是含氨
  • 伊曲康唑伊曲康唑(商品名为斯皮仁诺),发明于1984年,是一种三唑类(英语:triazole)抗真菌剂,适用于真菌感染的病人。这种药物一般口服或静脉注射。伊曲康唑的作用机制与其他氮唑类抗真菌药物一
  • 两报三台两报三台指的是台湾解除报禁以前,五个独占台湾媒体市场的媒体业者。两报指的是联合报系与中国时报(即为往后台湾大众熟知的中时媒体集团);三台指的是台视、中视、华视,合称“老三
  • 琮是中国古代用于祭祀的玉质筒状物,最早的玉琮见于安徽潜山薛家岗第三期文化,距今约5100年。在玉器中,琮是用于祭地的玉器,古人认为“天圆地方”,故以圆璧祭天,以方琮祭地,《周礼·
  • 张浩张浩可以指:
  • 美国金融市场工作组美国金融市场工作组于1988年3月18日由美国总统罗纳德·里根签署行政命令12631成立,主要目的是就类似1987年黑色星期一的股灾再次发生时给予意见,后来则发展为于大跌市时大手入
  • 罗田县第一中学罗田县第一中学,简称罗田一中,位于中国湖北省罗田县凤山脚下,面向全省招生,是一所全日制高级中学。学校创建于1939年,是湖北省重点中学。
  • 甘婆王朝甘婆王朝是古印度摩揭陀王国的一个王朝。于公元前75年至前30年统治东部印度。其创建者婆薮提婆于公元前75年推翻了巽伽王朝的末代君主提婆菩提。依据印度往世书,甘婆王朝最后