世界上除了运动着的物质,什么也没有。 ——弗拉基米尔·伊里奇·乌里扬诺夫
在上一回中,我们指出程序的本质是一段人类意识成果的计算机固化实现;依照分治复用的原则,现代程序的外观逐渐演化成为标识符和内存地址(文字常量)以越来越复杂的结构混合在一起所形成的众多文本文件;不同编程范式和语言实现提供了越来越多的新奇的骨架结构,但是充斥在这些骨架中间的仍然是从"史前时代"到今天都没有改变过的蟑螂一样的标识符号;IMojo mojo = AllMojo.ThisMojo.Mojo(_mojo); 还有 AllMojo(ThisMojo(Mojo(_mojo))); 还有 var mojoList = from mojo in mojos select mojo.Mojo; 这些表达方式曾经让我感到生活会变得很美好,但某天晚上当我把书本封面的权威照片扣在了桌面上然后扪心自问的时候,我感觉其实似乎好像也没有真的那么好;最后,我们以大无畏的革命乐观主义精神仰天长啸,壮怀激烈地预测了未来的美好远景,但是现实生活依然要平静地继续。
前情提要完毕,开始切入本回主题——命名。
既然在有意无意间已经把名字问题推到了风口浪尖,下面我们就来仔细分析一下这个古老的概念:标识符是一个名字;理想的标识符至少要满足4个性质,不才我费了很大力气终于把它们变换成了四个Re打头的英文单词:
Recognizable:举个例子来说,在与很多相关人士通力合作纠结良久、终于确定了你们家宝贝儿的名字之后,你一定不希望这是一个满大街都是的名字吧?至少一个班里不应该同时出现三个以上是吧?所以,标识符应该能够在作用域中无歧义地区分所有语言元素。
Readable:你也一定希望这个名字朗朗上口、意义非凡、在一大堆小朋友的名单中能够传神地代表你们家孩子,对吧?所以,标识符应该具有良好的可读性。
Reachable:叫出孩子的名字(假设有的话)对一般人来说难度应该等于0,但是据说明朝某为皇帝计有皇子128名,公主256位。想要召见到正确的孩子,对他来说应该是个需要认真对待的问题。而开发人员在接触新系统时所遇到的境况和这位老兄的情形是很类似的,在找到目标之前首先要知道名字。所以,标识符应该能够被找到,而且最好能够马上立刻瞬间被找到——无论系统中有多少元素需要被区分。
Reusable:复用其实是一个无处不在的议题,除了制造法拉利引擎之类的奢侈品以外,人们在从事任何其他社会活动时都会或多或少地考虑到被软件研发人员称为复用的过程。试图"复用"弹道积分过程的尝试就直接导致了电子计算机的发明。显然,标识符也应当能够使那些由它组成的程序可以被复用。
现在让我们用以上刚刚建立的"4Res质量认证体系"来评估一下主流通用程序语言中的字符串标识符:Recognizable,做得还好,否则编译器也不能同意。但为此我们也引入了作用域、命名空间、封装等等概念,很显然,当系统复杂到一定程度时标识符的 Reachablity 会因此受到很大影响;Readable,人类为解决此一重大问题总共提出过多达两项技术:Camel 和 匈牙利式命名,要说效果如何,其实公道自在人心。个人认为,如果说眼下的程序形式有任何的可读性可言,那完全是因为程序员群体是一个优秀的、吃苦耐劳且耐受性上佳的群体;Reusable, 字符串标识符本身不具有这项能力,为此我们引入了封装、继承、接口、DI等概念,但是这同样影响到了标识符的 Reachablity。
写到这里,一个想法渐渐在脑海中成形,只要再勇敢一点就可以捕捉到它!那么就让我们再次以美好的预测做为这个段落的结尾:虽然大牛们似乎都在努力创建各种各样的新颖的DSL、MDA,但是我相信,总有一天古老的字符串标识符会被更优秀的替代品所取代,而后来者应当具备如下要素:
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
public class Symbol
{
// recognizable
public Guid Guid
{
get; set;
}
// reachable
public string Document
{
get; set;
}
// reusable / readable
public IList<string> Facads
{
get; set;
}
}
虽然听起来有些不可思议,但事实上在程序世界里要废掉某个概念是一件相对容易的事情,只要提供一个比前浪优秀一点点的后浪,修补一下老客户的感情,同时大力砸钱宣传发展新客户,相信总有一天前浪会安全抵达沙滩上。
(待续)