【SDU Chart Team - Core】SVG属性类设计之泛型赋值、绑定、提交

SVG属性类设计 (1)

这个类的设计是为了将C++类型适配为符合SVG规范的类型。为了简化使用方的操作,SVG属性类中将提供C++类型到SVG规范类型的自动转换,并且提供绑定操作。

需求

整个类的设计涵盖以下方面:

构造

构造时指定对应的getter、setter。此步骤由组合了该属性的SVG进行,getter、setter由SVG内部提供。(不直接使用属性的引用是为了实现封装,将两者从设计分离以降低两者耦合度)

赋值

直接将某个值赋给这个属性,其中C++类型到合法SVG规范类型的转换被内部实现。赋值将解除函数与指针绑定。

函数绑定

将该属性与返回某个C++类型的且参数列表为空的函数绑定,其中C++类型到合法SVG规范类型的转换被内部实现。支持普通函数、成员函数、Lambda表达式。函数绑定会替换赋值,且将解除指针绑定。

指针绑定

将该属性与某个C++类型的指针绑定,其中C++类型到合法SVG规范类型的转换被内部实现。指针绑定会替换赋值,且将解除函数绑定。

实现

由于要理论支持任意使用方提供的C++类型,所以这个类的设计一定要进行泛型。具体泛型分类如下,以SVG内容属性之一的Number类为例:

考虑成员函数泛型的手段,对于默认没有实现的(即不合法)的函数使用泛型,而经过实现的则利用重载机制被调用。例如:

class A {
public:
	// 未被实现的,调用默认函数
	template <typename T>
	void doSomething(const T &t) {...}

	// 被实现的,调用特定函数
	void doSomething(const int &t) {...}
	void doSomething(const float &t) {...}
	void doSomething(const double &t) {...}	
	void doSomething(const std::string &t) {...}
	...
}

因此绑定与赋值接口均使用如上结构。

提交区

接下来需要考虑一个关于绑定的问题,就是被绑定的变量修改时,绑定变量怎样被更新。

  • 在被绑定变量修改时

    这是一种理想的情况,即被绑定变量被修改时,发起一个事件,而后所有绑定变量沿着绑定链依次被修改。这是一种主动更新方法。

    通常针对这种方法的实现手段是Hook,也就是钩子函数,一种特殊的回调函数。但是这就需要保证被绑定变量自身修改时能调用该函数。这是一种较为麻烦的处理方式,也就是说需要封装全部可能存在的变量,重载全部涉及到变量修改的方法。抛开穷举思路,就得使用反射机制判断是否成员函数只读,对于C++来讲难以实现。

  • 统一时刻更新

    在统一的时刻获取被绑定的变量的值,将其赋给所有绑定变量。这是一种被动更新的方法,同时也较为容易实现,但关键在于更新时刻的确定。

    如果更新时刻太过频繁,即每次修改都进行一次统一更新,则必然会有相当多的冗余比较。对于项目,可以选择在渲染时统一更新,因为渲染是需要读全部属性的时刻,比较合理。

采用第二种方法后,就诞生了提交区的概念。也就是绑定和赋值,只是将被绑定变量暂时放进了提交区,而绑定变量仍然不变;只有在提交后,绑定变量才被修改。

整个过程如下图所示:

赋值

属性内部维护一个私有变量。赋值时更新量被拷贝至该私有变量。提交时进行转换。

绑定函数

属性内部维护一个私有函数。提交时调用该函数并进行转换。

这里需要额外考虑用什么变量来承载函数。先考虑的是使用函数指针,但是函数指针仅支持普通函数,对成员函数支持性不是很好。于是换成c++11中的std::function,以此对全部函数都能支持。(对于成员函数,需要使用std::bind将一个成员函数与具体对象进行绑定)

绑定指针

属性内部维护一个弱指针。提交时检查指针是否有效,再对指向的值进行转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值