代码改变世界

人生好比一段程序

2010-06-28 22:27  elivsit  阅读(289)  评论(0编辑  收藏  举报

 

人生好比一段程序,代码特殊,算法复杂。

_____________________________________________________________________________________________

上帝以弱耦合、强内聚的准则将我们设计出来。我们出生之时一身赤裸没有任何的附加品,其余的一切将随需而生。系统

架构犹如人类社会,分为不同的层次。从此我们融入了复杂的社会,经历一次在人类伦理与社会规则的双重标准中生活,

开始了为人的旅程。然后物以类聚,人以群分。由于封装,我们无法看清别人,但可以通过消息、事件了解彼此。人类要

繁衍生息,所以我们继承着父辈的血统,可仍存在或多或少的代沟。我们常常在不同的环境中表现为不同的角色,并且遵

守不同的社会契约和法律规范。身份的不同,带来的是遵守规则的差异。经过重写我们适应了自己本身和这个社会。接口

多了才活跃,这便是开放。让别人来了解自己,也让自己在别人面前表现出自己的价值,存在的意义。而有的代码则相反

,甚至根本就没有接口,把自己孤立起来,让人不能理解,任何一方面都无法与他沟通。我们在失败的时候可以及时调整

自己的心态,重新开始;或者在了解自己很落后的时候,可以让自己去学习,去工作。也就是说,在做任何事情的时候可

以根据需要随时改变自己的动作或心态去迎合目标。这有点像函数,能根据不同的参数计算出不同的结果,而我们的性格

和行为就相当于自变量,改变自变量,将改变结果。GC犹如自然规律随时约束着我们的行为规范。违反规则的,必然无法

逃脱被社会淘汰的命运。哪怕你以前是一堆乱码,你也可以升级到主代码。因为你可以通过自己的改变和努力,让自己去创造命运。我们生而入世,死而离世。

 

 

图片

 

 

 

 

 

图片

 

 

对象和人,两个世界,一样情怀。
.NET面向对象世界中的主角之遍历式曝光。对象就像个体的人,生而入世,死而离世。

 

故事就从对象之生开始。Person aPerson = new Person("Mr Zhang", 21);
首先在内存中分配一定的存储空间;然后初始化其附加成员,就像给人取个具有标识作用的姓名一样;最后,再调用构造

函数执行初始化,这样一个对象实体就完成了其出生的过程,我们为aPerson对象初始化了姓名和年龄。

 

正如人出生之时,一身赤裸没有任何的附加品,其余的一切将随需而生,生不带来就是这个意思。对象的出生也只是完成

了对必要字段的初始化操作,其他数据要通过后面的操作来完成。例如对属性赋值,通过方法获取必要的信息等。

婴儿一出世,由it成为he or she,就意味着从此融入了复杂的社会关系,经历一次在人类伦理与社会规则的双重标准中

生活,开始了为人的旅程。同理,对象也一样。

 

对象也一样是有类型的,分类的标准不同,产生的类别也就不同。常见的分类就是值类型和引用类型两种,值类型相当于

鱼缸里有一条鱼。引用类型相当于交易市场买主找打卖主,然后卖方带买方去仓库领商品。相对于值类型多了一步而已。

在内存中不直接存储引用类型的数据,而是存储该数据的地址。值类型位于线程的堆栈,而引用类型位于托管堆。

作为人,我们都是有属性的,例如你的名字、年龄、籍贯等。这和对象产生时给字段赋值一样。但是每个人都有随时更名

的权力,这种操作名称的行为,我们称之为方法。在面向对象中,可以像这样来完成:aPerson.ChangeName("zhangleong");

 

人与人之间通过语言交流。人一出生,就必然和这个世界的其他人进行沟通,形成种种相互的关系,融入这个完整的社会

群体。在对象的世界里,你得绝对相信对象之间也是相互关联的,不同的对象之间发生着不同的交互性操作,那么对象的

交互是通过什么方式呢?对象的交互方式被记录在一本称为“设计模式”的魔法书中。

对象的生存环境是CLR(公告语言运行时),而人的生存环境是社会。CLR提供了对象赖以生存的托管环境,制定一系列的规则,称之为语法,例如类型、继承、多态、垃圾回收等。


人类社会就是系统架构,也是分层的。上层建筑代表政治和思想,通过社会契约和法律规范为经济基础服务,在对象世界

中,这被称为接口。
由此可见,对象的旅行就是这样一个过程,在一定的约定与规则下,通过方法进行彼此的交互操作,从而达到改变本身状

态的目的。


关于继承。人的社会中,继承一般发生在有血缘关系的族群中。最直接的例子一般是,儿子继承父亲,包括姓氏、基因、

财产和一切可以遗留的东西。但并不代表可以继承所有,因为父亲隐私的那一部分属于父亲独有,不可继承。

而在面向对象中,继承无处不在,子类继承父类,以访问权限来实现不同的控制规则,称为访问级别(public、

protected、private、internal)。

 

关于多态,人的世界中,我们常常在不同的环境中表现为不同的角色,并且遵守不同的规则。例如在学校我们是学生,回

到家里是儿女,而在车上又是乘客,同一个人在不同的情况下,代表了不同的身份,在家里你可以撒娇但是在学校你不可

以,在学校你可以打球但在车上你不可以。所以这种身份的不同,带来的是规则的差异。在面向对象中,我们该如何表达

这种复杂的人类社会学呢?


interface IPerson
{

  string Name

{
 get;
 set;
 
 }
 Int32 Age 49
{

 get;
 set;

 }
 void DoWork();

 }

class PersonAtHome : IPerson

{

}

class PersonAtSchool : IPerson

{

 }
 class PersonOnBus : IPerson
{

 }


显然,我们让不同角色的Person继承同一个接口:IPerson。然后将不同的实现交给不同角色的人自行负责,不同的是

PersonAtHome在实现时可能是CanBeSpoil(),而PersonOnBus可能是BuyTicket()。不同的角色实现不同的规则,也就是接

口协定。在使用上的规则是这个样子:
IPerson aPerson = new PersonAtHome();
aPerson.DoWork();
另一个角色又是这个样子:
IPerson bPerson = new PersonOnBus();
bPerson.DoWork();
由此带来的好处是显而易见的,我们以IPerson代表了不同角色的人,在不同的情况下实现了不同的操作,而把决定权交

给系统自行处理。这就是多态的魅力,其乐无穷中。

 

由此可见,以我们自己的角度来阐释技术问题,有时候会有意想不到的收获,否则你将被淹没在诸如“为什么以这种方式

来实现复用”的叫喊中不能自拔。换一个角度,眼界与思路都会更加开阔。

对象和人,有生必然有死。在对象的世界里,它的生命是由GC控制的,而在人的世界里我们把GC称为自然规律。进入死循环的对象,是违反规则的,必然无法逃脱被Kill的命运,就如同没有长生不死的人一样。


GC管理所有的托管堆对象,当内存回收执行时,GC检查托管堆中不再被使用的对象,并执行内存回收操作。不被应用程序使用的对象,指的是对象没有任何引用。

这个回收的过程,同样使我们感慨。大自然就是那个看不见的GC,造物而又终将万物回收,无法改变。我们所能做到的是,将生命的周期拓宽、延长、书写得更加精彩。


程序世界其实和人类世界有很多相似的地方,好似复杂的人生。而其实,人也可以是简单的。