我们先来看看在计算机设计中最基本的三个置换,一个是从值到地址的置换方式,我们称为值-地址置换,一个是从地址到值的置换,我们称为地址-值置换。当然如果再加上对其值赋值为其他值操作或者对地址值赋值为其他地址值的操作我们称为赋值置换,那么对于这样的三个操作,其实就构成了数学意义上的群,如果我们设置地址到值的置换为a,设置地址-值置换为b,其值赋值作为其他值操作,或者对地址值赋值作为其他地址值的操作,我们统一设置为e,这样其就构成了一个群。
为什么是一个群呢?主要是构成了下面满足的性质。
设G是一个非空集合,*是它的一个(二元)代数运算(此就为置换操作),如果满足以下条件:
1. 封闭性:群内任意两个元素或两个以上的元素(相同的或不同的)的结合(积)都是该集合的一个元素。即假设对于群G操作(运算)是·,对于G里的任意元素a,b,那么a·b和b·a都必须是G的元素。
2. 结合律:虽然群元素不一定要求满足交换律,但必须满足结合律,即对G中任意元素a,b,c都有 (a·b)·b=a·(b·b) 或(a·b)·a=a·(b·a);
3. 单位元素:集合G内存在一个单位元素e,它和集合中任何一个元素的积都等于该元素本身,即对于G中每个元素a都有 e·a=a·e=a;
4. 逆元素:对G中每个元素a在G中都有元素a^(-1),叫做a的左逆元,使 a^(-1)·a=a·a^(-1)=e,而我们这里,a和b的操作就是一对逆元素对,即a·b = e;
元素的集合如果满足上述四个条件就称为群,注意,进行群运算的次序是重要的。换句话说,把元素 a 与元素 b 结合,所得到的结果不一定与把元素 b 与元素 a 结合相同。而对于G里的任意两个(可以相同)元素a,b有a·b=b·a,那么群G称为交换群,或Abel(阿尔贝群)。
从中我们可以看出,我们的这三个基本的操作其实就构成了一个阿贝尔群,同时由于在此上面进行的·操作实际上是一个叠加操作,所以我们将·符号换成 + 符号会更加贴切一些。
当前其他的置换,例如抽象的置换和继承的置换,面向方面的置换等等都是在这三个基础置换之上进行的群复合操作,也可以这样说,这三个基本的操作可以将之转换为几个集合上的三个元素,但是其他的复合置换操作就是一些在多维上的集合形成的一个大的集合,这些置换是否也构成一个更大的群呢?这恐怕需要数学家们的更进一步进行分析和探讨。
那么这样构成的群,当然具有群的一些特性,那么有哪些群特性能够更加指导软件设计的工作呢?这恐怕需要计算机理论学家更进一步进行分析和探讨。
如果我们再经过一些无法证伪的一些想法,来通过一种新的方式来思考一下,在《道德经》中有“道生一,一生二,二生三,三生万物”,而道是我们无法名状的,也就是无法通过准确的定义进行描述,“道可道,非常道。名可名,非常名”,那么我们可以简单作为类比软件设计中提到的这几个概念,针对“道”,我们是还无法准确定义的,而“一”就是我们的“置换”的动作,“二”就是我们的两个不可分离的“阴阳”,也就是我们的(值,地址)关系对,注意这种“关系对”是关键,不存在绝对的“值”,也不存在绝对的“地址”,而“三”就是我们上面谈到的三种基本置换操作,这些操作就形成了群,然后通过这三种基本的置换群,我们可以进一步演化为各种各样软件设计的方法,而通过不同层次的置换,就达到我们目前的引用、指针、函数、类、面向对象、面向方面、泛型、分层等等不同层面的置换,这些置换就是《道德经》中的“万物”。
好,上面是我的冥想,是否准确,还需证实,呵呵!
对于这一基础的置换所形成的群,其意义十分重大。由于此三个置换运算构成了群,所以此形成了一个完备的运算结果,所谓的完备性就是不多也不少的置换,形成了一个闭合的体系。在这个体系中,能够完整的表示所有在其之上的设计和实施,也就是说,如果我们只是采用这样的基本的三个置换运算,完全能够对一个软件系统进行完整的描述。而面向对象、泛型编程等等置换,判断其是否能够完整描述系统也可以通过完备性来表示,而形成群特征的集合,是完备性表示的一个简洁、有效和完整的划分。所以,将来在任何进行新的置换手法的提出,都需要考虑其是否具有完备性,同时如果能够让此层次上的置换关系的元素按照群的方式进行组合,那么将是一种更加有效、优美的划分方式,这也是群和对称密切相关所体现的。
由于置换所形成的群,表达了一种在数学意义上的“双射”的概念,而双射是一个什么意义呢?如图1-16可以看出来:
图1‑16
广义上一切事物具有相同或者相似的系统结构就形成了同构的概念,在抽象代数中,同构指的是保持结构的双射,同时当同一集合上的双射置换就构成一个对称群。由此上面所谈到的软件设计中部分特性形成的对称群,其实表达了一个同构的概念,而在我们的设计过程中就能够通过“同构”的方法,来填补哪些可能欠缺的特性或方法。
所以,有时候,在软件设计中,如果我们采用“穷尽”的方法来验证或者表达我们的目的,此时,我们是否能够想到群的哲学意义:我们可以使用“群”自信地找到最后的结果,那么为什么我们还要进行那些毫无意义的实验呢?特别对于我们创造一些新的设计理念,此时我们也可以使用群的思维来帮助我们找到其他的“元素”,而且也可以以此来证明我们的整个体系是否是“完美”的。