理解人造的计算机世界,尝试认识CLR
类型定义表 和 字段定义表
CLR为什么是类型定义表、字段定义表、方法定义表、方法参数表?为什么不把“类型定义表、字段定义表”合并?
可能是因为这样:CLR面向的是两种用户,开发人员和计算机。对于开发人员来说一切都是资源,都是树形的,而对于运行时来说(运动)是需要通路的,是需要联通的,是需要图的。
开发人员算作主体,在主体看来一切空间都是资源,主体的努力都是为了对资源进行合适的分类,朝着有利于支持资源的运动(变化)的方向去分类。
下面是Product类型和Customer类型,这两个分类节点下都有个Name子节点:
public class Product{
public string Name{get;set;}
}
和
public class Customer{
public string Name{get;set;}
}
这两个类型中的相同类型的Name属性在CLR看来是相同的字符串类型的,但在主体看来不是。
一棵正树 和 一棵倒树
在主体看来,它们一个是产品名称一个是客户名称,在主体看来它们是不同类型的节点,而在运行时看来它们是相同类型的节点。主体沿着正树的方向观察,计算机沿着倒树的方向观察。
在CLR中这个相同类型的Name节点既出现在Product类型节点下又出现在Customer类型节点下,违反了构造定律了吗?违反了树形结构了吗?没有。这些int、string、bool等基本类型是两个世界的分界线,在主体看来这些基本类型是自己看到的树上的叶子节点,然而对于运行时来说它们是靠近根节点的节点(根节点是0 1)。世界有两棵树,一个是正树,一个是倒树,一棵是静态的资源树,一棵是动态的运动树。这些基本类型节点是主体世界和运行时世界的分界线。
构造定律可以用来作为衡量事物是否良好的模型
在主体的角度看去,一切依旧是树形结构,它们一个是产品名称一个是客户名称,依旧没有违反构造定律,一个string下挂20个字节,一个字节下挂8个位,一个位下挂一对0 1,在主体看类,每一个产品名称和客户名称是不同的,产品名称下挂的char[]和客户名称下挂的char[]是不同的,产品名称和客户名称下挂的每一对0 1都是不同的。
但是在运行时看来它们可以是相同的。
所以在运行时可以构建这样的通路:
Product product = new Product(){Name="product1"};
Customer customer = new Customer();
customer.Name = product.Name;// 通路
因为权限引擎是站在用户主体这个角度观察世界的,所以没有字段表,只有Clatalog表。类型表和字段表是合二为一的,它们都是Catalog。