【ZProRx 重装上阵】 第二回 矩阵

上一节主要介绍ZProperty的单体结构,这一节主要说明属性间的关联。

Link(属性)关系分类

可以定义属性与属性间的关联,方便基于属性框架的开发。主要的关联关系包括:聚合、关联、视图

接口与聚合

即通过一个属性引用另一个类的对象。 ZP内容类支持 接口(interface)做为值(Value),如下所示 多用于引用一个对象,即可以理解为对象间的关联。(UML中的聚合或者组合的关系)

  public ZProperty<int> CardID = new ZProperty<int>();
  public ZProperty<ICard> CardProp = new ZProperty<ICard>();

如上面的例子,通过ICard接口,可以指定不同的派生值类,通过CardId进行标识要引用的对象。

还可以以另一种方式比较对象间的聚合关联关系,即使用ZPropertyInterfaceRef 接口引用 ZProRx为了简化上面的使用方式,引入ZPropertyInterfaceRef属性类,通过其成员RefID,标识引用的对象,即实现ICard接口的实例。

public ZPropertyInterfaceRef<ICard> CardRef = new ZPropertyInterfaceRef<ICard>(OnLink);

其中构造参数是用于定义关联的方法,其会返回,聚合的对象。 类似的还有ZPropertyRefList属性类,用于定义引用对列。

总结:可以看到两种方式,前者需要通过ID手动进行聚合。

View 视图

类似Mysql视图的概念 视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制); 从面向中数据开发的角度出发,视图就是数据源的进行不同层次的映射、汇总、抽象,每一层次为不同业务进行服务,方便逻辑处理,提升开发效率。对视图、数据的设计很重要,它是上层设计的基石。基础打不好,后面早晚会出现问题。也可以把其理解为观察者模式。

ZProperty框架引入Select/Where/Merge/Count/Sum等方法,对源数据进行处理,生成不同的视图。它与Linq很想,用过的一定会很喜欢Linq的强大,其实作用是一样的,其核心还是面向数据的。不过LINQ生成的还不能叫视图,因为如果源变化时,视图不会进行更新,这是因为Linq是基础框架,面向的List这些基础类,但在ZProperty的基础上,我们就能做的真正的视图,视图会根据源进行动态变更。其实原理很简单就是注册相应的事件。

主要视图方法如下:

  • Select:对数据源进行变换,数据量是一致的,数据内容进行变换
  • Where: 对数据源进行有条件的映射,数据量会变为满足条件的数据量,数据内容不变。
  • Merge:对多个数据源进行合并。数据量是总和,数据内容保持不变。
  • Count: 数据源的数量,映射到一个变量中。
  • Sum:数据源(ZPropertyList/ZPropertyRefList)的各项和,可以根据条件对项目进行选择,同时也支持对求和的方式进行配置。 目前Sum视图只支持uint/int/float/double类型的Sum视图
  • Cache: 用于缓存,即到达一定的数量之后,进行删除,不会主动删除元素,即只会监听数据源的Add操作。
  • Sort:排序、当数据源Add/Del操作时,会进行重新的排序

注意:以上Select/Sum/Cache/Sort等,只有ZPropertyRefList 才能做为视图,因为表达的是引用的关系。而ZPropertyRefList 和ZPropertyList 都可以做为数据源。 ,如果ZPropertyList做为数据源,其T值 一定是可以索引的,即实现了 IIndexable接口的对象,否则会创建视图失败 每一个视图方法调用后,会返回一个IDisposable,可以调用其对关联进行取消,解除与属性的视图关联。

关联

有关关联的定义的,可以参考 视图之后,引入另一个概念“关联”,也就是把两个Property(数据)进行关联。 视图也是一种特殊的关联。 其实各数据、普通的Property组成的只是一个树形/森林的结构, 正常的Property框架,一个对象可以向下访问其结构中的Property。 而我们希望的Property组合成了一个大的 Mesh,需要具有横向、向上或者任意的联结,以保证逻辑需要。 比如一子弹打中物体后,需要知道其发射者的信息,完成记录功能。

注意与视图的区别:

  • 视图也是单向的关联。
  • Select只是观察者,是单向的,而Link有双向的同步功能。
  • Link同步可支持进行设置,同时内部也是实现的是Select

注意问题: 目前Link的时机还是比较早的。会被接口隔断。除非是接收其对应的OnValueChange

视图与关联,是否需要考虑可见性的问题。

相关链接:

项目开源地址:https://github.com/bennychao/ZProRx.Lib

下载安装:(ZP.Lib.Server 是ZRroRx的核心库,后续其它功能库陆续开放中)

  • .Net CLI >dotnet add package ZP.Lib.Server --version 1.0.3
  • 或 VS 2019 Nuget 包管理中搜索"ZP.Lib.Server"并安装(推荐)

ZProRx.Lib Unity Package 1.0.3 (用于在Untiy中使用)下载地址: 

https://github.com/bennychao/ZProRx.Lib/releases/ 

https://github.com/bennychao/ZProRx.Lib/Publish/ZProRx.Lib.package

下一节

【ZProRx 重装上阵】 第一回 重构

【ZProRx 重装上阵】 第三回 绑定

发布了51 篇原创文章 · 获赞 10 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/FeiBin2013/article/details/104525759