首页 > 代码库 > 资源到底是什么?Menu到底是什么?Function到底是什么?
资源到底是什么?Menu到底是什么?Function到底是什么?
Menu是什么?
Menu表示空间坐标,是个标识符和定位符融为一体的对象。如果我们的系统是棵树,Menu实际上就是用来指示树上的具体位置。用户通过Menu来告诉系统他/她想要到这棵树上的哪个节点中去。Menu用来指示静态的资源树上的节点,资源树上的节点是空间、是场所。 而Function是动态的,是动态的运动树(栈)上的节点。 将Menu重命名为SpaceId可能更合适?需要是标识符不能是定位符,SpaceId对象上具有个url(定位符)。标识符和定位符的差别就是要翻译。我们无法保证系统树的结构不会随着时间改变所以必须是标识符。让我们使用ASP.NET Mvc中学到的Mvc知识来举个例子:在前端控制器层中,对应有View的Action是Space,不对应View但是返回某个资源的Action本质也是Space。比如JsonResult GetById(guid productId)本质也是Space。这个Action表达的意思是将当前主体传输到给定标识的这条product空间中去。 Function是什么呢?Function是运动,是功、能、力,体现在计算机程序里通常是运行时的栈。不妨搬出咱们从先人那里继承的思想来诠释一下Function和Space。将Function这个词替换为太极图上那个纠缠,叫“道”(Tao)吧。 subject进入space论tao。“进入”本身也是tao。用“一”(Yi)替换Space。Tao生Yi,Yi生二,二生三,三生万物。为啥不是〇?能够站在宇宙之外观察的话正是O,可是我们无法站到宇宙之外。在咱们的数据库表设计中,Menu(Yi)表中的记录正是来自于Function(Tao)表中的记录的。正是Tao生Yi,Yi是空间,Tao是时间。请暂时不要对引入Tao和Yi这两个概念反感,以后不会去频繁的搬出这些概念。保持Menu和Function的命名不变。Menu记录所标识的树上的空间位置应可以是整棵树的任何一个节点。
Function是什么?
operation 是一种function,operation 集是function 集的子集。operation 是功能层(展示层)的function, 一个operation 表示一个功能,一个function 不一定是一个功能。 如果一个operation 的访问是受控的,也就是说不是每个主体的请求都会被满足的则就是permission。而privilege是subject + permission。Operation = action + resourceType;Permission = managedOperation;功能级Privilege = subject * permission;实体级privilege = subject * entity;(这些公式并不严禁,并没有事先定义加减乘除是什么意思,只是用来传递意思,需要借助大量的冗余来降低信息损失)实体属性级/单元格级以此类推(注意合理分配存储和计算)。
不妨相信人类的知识树是良好的,不妨相信人类的知识树是按照构造定律构建的。那么“功能”、“能力”就是“功”、“能”、“力”。按照本意理解那棵知识树节点中的词汇出错的机会是非常小的。 从新表述一下Operation和Function的区别 与上面的表述在意义上没有差别,是一致的,是对同一个事物不不同描述。 Operation是一种Function,Operation集是Function集的子集。 Operation表示的是主体发起的调用,Operation是有标识的实体,Operation的标识在调用发起时由系统分配。在Operation方法体的直接子节点中可以通过UserSession.Current到当前线程中索引发起当前调用的主体(方法体的直接子节点是指方法体中直接书写的那些语句而不是跳到另一个方法中去)。 而Function体中不能通过UserSession.Current索引当前主体,若Function体中做功时需要当前主体信息的话,当前主体唯有通过Function的入参传入。 “方法、函数、功能”是在做功。函数体中那个运行时的栈就是在做功。function没有标识(注意这是个小写的function,表示function实例。当然大写的Function是有标识的,这个标识是元数据标识),function是值对象;operation会在主体调用时由系统分配一个唯一的标识,operation是实体。 国家的rbac标准上使用的是Operation这个词,而权限引擎中使用的是Function这个词。由于Function集比Operation集大,Operation集是Function集的子集,这就是说权限引擎的能力集是比rbac大的多的。
控制权限就是控制运动 时间 = 运动 = 变化 = 功 = 能。将人类所有的资料中的这些词汇相互替换后阅读一定都是通顺的。 事物有变化才需要控制,当事物睡在空间介质中不动时是不需要控制权限的,只有当有人读它、写它,只有它有变化时,只有做功时才需要控制。 在权限引擎关键字下,之前咱们论述到时间就是变化。时间 = 变化 = 运动 = 功能。 事物睡在空间介质中时它是不变化的,从而它的时间是静止的。时间是相对的(运动是相对的、变化是相对的),睡在空间介质中的事物的时间是静止的,但是别的醒着的事物的时间是前进着的,为了统一管理整个系统中的时间箭头我们的系统中会有个唯一的计时设备(cpu)。 睡在空间介质中的事物可以在某些系统时刻到达时由外部醒着的事物向它们发起请求,然后由基础设施将它的副本转移到活跃的空间中去催醒它使它参与完成某件事情,办完事情后基础设施再次将它催眠。 我们的系统中的任何事物都在那棵系统树上对应有个位置,系统的运行时就是在这棵树上进行变化。但是由于这棵树非常深枝叶非常多非常复杂导致我们认识这棵树时难以人知到整体,往往陷入枝条片叶中去了。
ResourceType是什么?
ResourceType是资源类型。资源是什么呢?资源是需要进行访问控制的系统资源,例如文件、打印机、终端、数据库记录等。而资源类型的本质是对资源的分类。这里需要首次引入分类法。 人类发明的分类法其原理是比较抽象和复杂的。Anycmd用到了分类法所以需要试图表述清楚它。
分类就是按照事物的性质、特点、用途等作为区分的标准,将符合同一标准的事物聚类,不同的则分开的一种认识事物的方法。 分类法是指将类或组按照相互间的关系,组成系统化的结构,并体现为许多类目按照一定的原则和关系组织起来的体系表,作为分类工作的依据和工具。分类法有交叉分类法,树状分类法等等。 摘自百度百科
我不理解百度百科上所说的交差分类法是什么?我认为如果我们按照人类的性别对人类类型对象集分类的话应该会是“男人”、“女人”、“未知”、“未说明”这么几类,人类的分类法绝不会把一个人既归类到“男人”又归类到“女人”。那么百度百科上所说的“交差分类法”是个什么东西呢?我觉得这可能是“泛型”导致的。当我们研究一个对象集合的时候我们可以从多种角度观察和分类它,每一个研究角度可以看作分类法的一个型。 我后来思考了一下,百度百科上所说的交差分类法可能是指的这样:比如对于一个班级的学生这个学生对象集。按照性别分会是男生、女生;按照座位的行分会是第一排、第二排……最后一排;按照成绩分会是优等生、普通生、差等生(这里需要定义“成绩”和“比较大小”的算法,需要将成绩的整个值域划分为三类优等、普通、差等);但不管从哪个角度观察和分类,目标对象集都是这个班级的学生,一个学生可以同时是男生,且是差等生且坐在第二排。上面从性别、座位的排号、成绩三个角度对一个班级的学生进行了分类,也可以创造出一些新的分类“性别 x 排号”、“性别 x 成绩”、“性别 x 成绩 x 排号”等分类角度,这些新的分类角度可能就是百度百科上所说的交差分类。
用非形式化的文字表述和理解概念是很困难的,下面我们建立一个Category模型,如下:
public class Category { public Guid Id { get;set; } public string Code { get; set; } public string Name { get; set; }}public class CategoryType { public Guid Id { get; set; } public string Code { get; set; } public string Name { get; set; } public IReadOnlyCollection<Category> Items { get; set; }}
上面两个模型一个是分类,一个是分类类型。伪代码用来说明模型的目录不考虑设计模式。 那么对人类对象集按照性别分类就是
var humanCategoryBySex = new Category { Id = new Guid(“EC47866B-7E69-4092-A378-A0AB00BD43B0”), Code = “humanSex”, Name = “按照性别对人类对象集进行分类”, Items = new List<Category> { new Category { Id = “08CAC9DE-C332-4C3C-A3F3-18F763F8D78D”, Code = “01”, Name = “男” }, new Category { Id = “08CAC9DE-C332-4C3C-A3F3-18F763F8D78D”, Code = “02”, Name = “女” }, new Category { Id = “08CAC9DE-C332-4C3C-A3F3-18F763F8D78D”, Code = “03”, Name = “未知” }, new Category { Id = “08CAC9DE-C332-4C3C-A3F3-18F763F8D78D”, Code = “09”, Name = “未说明” } }}
对人类按照国籍进行分类就是:
var humanCategoryByNationality = new Category { Id = new Guid(“EC47866B-7E69-4092-A378-A0AB00BD43B0”), Code = “humanNationality”, Name = “按照国籍对人类对象集进行分类”, Items = new List<Category> { new Category { Id = “08CAC9DE-C332-4C3C-A3F3-18F763F8D78D”, Code = “cn”, Name = “中国” }, new Category { Id = “08CAC9DE-C332-4C3C-A3F3-18F763F8D78D”, Code = “us”, Name = “美国” } }}
一个对象至多关联一种分类方式的一个分类节点,不可能关联多个节点,关联多个节点的那种不叫分类。 停下!如果有人既拥有中国国籍又拥有美国国籍怎么办?这是个问题。对于分类法来说解决这个问题的方式是添加新的分类项:cn&us。将既有中国国籍又有美国国籍的人归类到新的编码为“cn&us”(随便什么编码,唯一即可)类别下。这就是分类法,它不分层级,它覆盖整个被分类的对象集,不存在归类不到某个分类项的子集(您可能见到过“男人”、“女人”、“其它”,为什么有其它?因为要覆盖整个人类集)。 系统字典——忘掉分类法。分类模型跟字典模型是完全一样的。通常,您的系统中有个“系统字典”模型,这个系统字典模型跟分类法模型是完全一样的,也就是说在实现分类模型的时候可以借助系统字典模型而无需添加新的模型。听到字典一词我们可能会跟离散扯上关系,跟分类一样字典项是离散的,但字典所建立起来的字典项取值可以涵盖整个对象集。比如金额看似不是字典类型的,但如果需要你也可以建立<小于1万,大于等于1万小于100万,大于100万>这样的字典项,这样的字典项覆盖了整个对象集。 如果您从书上看到过层次化的分类模型的话,请忘掉它,在Anycmd中层次化的分类法称目录。分类法是没有层次的。有层次的是分类法的子类:目录。
资源到底是什么?Menu到底是什么?Function到底是什么?