yang模型中的封装、继承和多态。
封装:解决可维护性。对应原则,单一职责,开闭原则
继承:解决可重用性。对应原则,liscov替换,
多态:解决可扩展性。对应原则,接口隔离。
一、设计时
封装性:
1、list,container,容器类,grouping,input,output,封装数据内容。
数据内容包括leaf,leaf-list,choice/case,
数据行为的约束:
值关联约束包括:leafref,identityref,
条件约束:when,must,mandatary。
操作约束:config false/true。
值约束:unique,key,default。
继承性:
1、grouping:定义了一个数据类。
list,container,容器类及choice,uses grouping就是继承了数据类中的成员,且成员是public的。
grouping是父类,uses grouping的是子类。
2、identity定义了一种特殊的类型。
base identity就是定义了一种类型的继承关系。
3、augment
老的容器节点是老的数据类,augment到这个老的容器节点后,继承老类生成了一个新类。
被augment的节点是父类,augment后形成新类。
二、编译时
多态性:
1、refine。
在uses grouping时,通过refine 重新定义grouping的数据约束行为。
2、if-feaure。
用于特性级的裁剪,基于某个基类/基础package编译生成可裁剪
3、deviate。
编译可裁剪,基于任意节点可裁剪。
类似于删除类中的成员变量或方法,但是不是直接在原始类中删除,而是通过裁剪文件在编译时合并删除。类似于影子文件。
三、运行时
多态性:
1、mountpoint。
schema实例之间隔离,schema之间可以基于相同的实例的基础上,基于各自的实例继续扩展或裁剪。
基于module粒度的安装,随配置触发,比如新建一个虚拟交换设备,该动作会触发在物理设备上的虚拟设备列表中新增一个设备,该设备对应的schema是该操作完成后,才被mount到内存中。如果删除该设备,则设备对应的schema和基于schema产生的数据则随之删除。
设计时在被mount的模块中定义好mount点(该mount点,在运行时就不可修改了,实际上笔者认为可以做到运行时新增mount点,或者在要mount到mountpoint的模块中再定义mount点,mount点迭代)
实现时包含了mountpoint的模块被作为yang library中的元数据,在服务端存储并实现。
运行时,可能有多个实例mount到同一个mount点,它们之间彼此隔离。