伍迷家园

让编程融入生活
随笔 - 81, 文章 - 0, 评论 - 1422, 引用 - 136
数据加载中……

四大发明之活字印刷——面向对象思想的胜利

        话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗性大发,不觉吟道:“喝酒唱歌,人生真爽。…………”。众文武齐呼:“丞相好诗!”于是一臣子速命印刷工匠刻版印刷,以便流传天下。

 

        样张出来给曹操一看,曹操感觉不妥,说道:“喝与唱,此话过俗,应改为‘对酒当歌’较好!”,于是此臣就命工匠重新来过。工匠眼看连夜刻版之工,彻底白费,心中叫苦不喋。只得照办。

       

 

        样张再次出来请曹操过目,曹操细细一品,觉得还是不好,说:“人生真爽太过直接,应改问语才够意境,因此应改为‘对酒当歌,人生几何?…………’!”当臣转告工匠之时,工匠晕倒…………!

        可惜三国时期活字印刷还未发明,所以类似事情应该时有发生,如果是有了活字印刷。则只需更改四个字就可,其余工作都未白做。实在妙哉。

        第一,要改,只需更改要改之字,此为可维护;第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用;第三,此诗若要加字,只需另刻字加入即可,这是可扩展;第四,字的排列其实有可能是竖有可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好

        而在活字印刷术之前,上面的四种特性都无法满足,要修改,必须重刻,要加字,必须重刻,要重新排列,必须重刻,印完这本书后,此版已无任何可再利用价值。

       小时候,我一直奇怪,为何火药、指南针、造纸术都是从无到有,从未知到发现的伟大发明,而活字印刷仅仅是从刻版印刷到活字印刷的一次技术上的进步,为何不是评印刷术为四大发明之一呢?

       做了软件开发几年后,经历了太多的客户(曹操)改变需求,更改最初想法的事件,才逐渐明白当中的道理。其实客观的说,客户的要求也并不过份(改几个字而已),但面对已完成的程序代码,却是需要几乎重头来过的尴尬,这实在是痛苦不堪。说白了,原因就是因为我们原先所写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用,因此面对需求变化,加班加点,对程序动大手术的那种无耐也就非常正常的事了

      之后当我学习了面向对象分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低(传统印刷术的问题就在于所有的字都刻在同一版面上造成耦合度太高所制),开始用设计模式使得程序更加的灵活,容易修改,并且易于复用。体会到面向对象带来的好处,那种感觉应该就如同是一中国酒鬼第一次喝到了茅台,西洋酒鬼第一次喝到了XO一样,怎个爽字可形容呀。

       再次回顾中国古代的四大发明,另三种应该都是科技的进步,伟大的创造或发现。而唯有活字印刷,实在是思想的成功,面向对象的胜利。不知您是否也有所感呢?

posted on 2006-08-16 17:52 伍迷 阅读(17671) 评论(61)  编辑 收藏 所属分类: 面向对象

评论

#1楼    回复  引用    

独到
2006-08-16 18:36 | wangdotnet [未注册用户]

#2楼    回复  引用  查看    

不错,内容很浅显不过角度很独特
2006-08-16 19:03 | 冬冬      

#3楼    回复  引用  查看    

不知所云
2006-08-16 19:14 | 春鱼      

#4楼    回复  引用  查看    

似乎
好象
大概
可能
也许只与封装搭了个边,但还是勉强
楼主所说的只是重用这个方法
或者说是由面向过程到面向对象的思想转变的成功,但如果这种说法能说的过去的话,只能以更抽象的方法去理解
2006-08-16 20:54 | aspnetx      

#5楼    回复  引用    

有点意思。
2006-08-16 21:25 | 冷振兴 [未注册用户]

#6楼    回复  引用  查看    

是比较有意思,不过有点“新瓶装旧酒”的感觉。哈哈
2006-08-16 21:55 | U2U      

#7楼    回复  引用  查看    

Interesting!
2006-08-16 21:59 | Ring      

#8楼    回复  引用    

要说对象,一个雕版同样也可以被看做对象,也可以说是面向对象思想
如果你说活字印刷技术体现了Flyweight设计模式倒还有点道理
2006-08-16 22:23 | vstvv [未注册用户]

#9楼    回复  引用  查看    

开发模式。。? 分层吗。。 老实说不大理解寓意。。

不过写的不错。。

呵呵。
2006-08-16 23:28 | メ冰枫ぱ雪      

#10楼    回复  引用  查看    

文章本天成,妙手偶得之 :)

dudu见此文应感到欣慰了 ;)
2006-08-17 02:28 | 道器      

#11楼    回复  引用  查看    

好文彩,好角度。

赞一个。。。
2006-08-17 08:26 | 浪子      

#12楼    回复  引用    

lz讲的是面向对象可以解决的问题--应对变化. 并没有说其他吧!

精彩!
2006-08-17 09:21 | lybabiandbel [未注册用户]

#13楼    回复  引用  查看    

精彩!感谢作者!
期待作者写更多文章!
2006-08-17 10:09 | dudu      

#14楼    回复  引用  查看    

还中~
2006-08-17 12:03 | 郭大少      

#15楼    回复  引用  查看    

看博客园这么久,终于看到一篇有中国特色的好文。
2006-08-17 12:12 | DSharp      

#16楼    回复  引用  查看    

感觉是对象粒度划分的问题
活字印刷把对象划分出了合适的,可以任意组合使用的小对象.
2006-08-17 18:59 | DDL      

#17楼 [楼主]   回复  引用  查看    

@DDL
说得好。面向对象设计的主要目的之一就是把对象抽象成合适的类。
如果我们要做的是人事管理系统,那么人就是一个最小的粒度。但如果我们要做的是医学院的人体研究系统,那么人体各大器官,组织都要成为类了。
2006-08-18 12:46 | 伍迷      

#18楼    回复  引用  查看    

好文彩,好角度。
赞一个。。。
2006-08-18 12:51 | 咬一口苹果      

#19楼    回复  引用    

洋酒,设计,大理,计算,数据
2006-08-20 13:34 | Lex [未注册用户]

#20楼    回复  引用  查看    

每个字实现一个功能(打印一个字),
要实现不同的字体,就要再弄一个字出来,
要改的时候,手工替换
这个...
实在是结构化编程的路子,C函数式的思路嘛,
现在的数码制版打印,才实现了分层,各层之间隐藏实现细节,加上其它特性,算得上面向对象了.

从面条到结构的重要,一点也不比结构到对象的差
2006-08-21 13:53 | Amnoh      

#21楼 [楼主]   回复  引用  查看    

@Amnoh
说得有道理,谈到字体,其实还可以说要改字的颜色,大小都是需要再手工改动的,但这并不能说这个例子就是结构化编程的例子,每一个字,你到底是把它看成一个类的对象还是一个小的函数,那是每个人看的角度问题了。

事实上这篇文章的最大目的是要说明面向对象的好处,就是可维护,可扩展,可复用,灵活性好。并没有说当年的活字印刷就是最佳实现。
2006-08-21 17:34 | 伍迷      

#22楼    回复  引用  查看    

精彩,楼主是高人。
2006-10-31 17:10 | laifangsong      

#23楼    回复  引用    

2006-11-13 17:59 | 雅[匿名] [未注册用户]

#24楼    回复  引用    

独到!形象!
2006-12-27 16:15 | 5586002 [未注册用户]

#25楼    回复  引用  查看    

中国酒鬼第一次喝到了茅台,一个字,爽
2007-03-02 11:01 | chy710      

#26楼    回复  引用    

西洋酒鬼第一次喝到了XO一样,怎个爽字可形容呀
2007-03-03 15:57 | Apple [未注册用户]

#27楼    回复  引用    

就算是三国,曹操也不会说“喝酒唱歌,人生真爽。…………”这也太白话了吧
2007-03-29 01:22 | 美丽影子 [未注册用户]

#28楼 [楼主]   回复  引用  查看    

@美丽影子
这是一种夸张的手法,由于“喝酒唱歌,人生真爽”实在是太白话,才体现出“对酒当歌,人生几何”的精妙。

至于千年以前的曹操是如何作这首诗的,那真是只有鬼才知道了。

不过可以肯定的是,再好的诗也很难一次作成,是需要修改,或者说需要重构的,哪怕不是前两句,其它地方也是一样的道理。
2007-03-29 08:33 | 伍迷      

#29楼    回复  引用    

很有意思
2007-05-14 11:18 | 基拉 [未注册用户]

#30楼    回复  引用  查看    

強啊,
對本菜鳥受益很大
謝謝。
2007-05-18 13:43 | answer      

#31楼    回复  引用    

面向对象不是什么新玩意。对象的属性、方法都是结构化的产物,是人们认识客观对象的过程化、结构化的一种逻辑描述。

我想请问:能不能用《兰亭序》中的文字拼接出另一副有同样书法价值的艺术作品呢?所以说,面向对象不是万能的,在程序设计思想领域,真正具有提纲擎领作用的是结构化思想。深刻理解和运用认识客观世界的辩证法,熟练运用程序设计语言的结构特点,设计出面向对象的软件结构是顺理成章的事情。

简单地说:程序设计语言的结构特点 + 辩证认识论 ——> 自然产生包括面向对象等许多解决各种问题的有效方法
2007-05-19 19:53 | lxj [未注册用户]

#32楼    回复  引用  查看    

楼主实在高人。小时候居然就四大发明就有如此疑问,不得不佩服!
为何我就没有这个想法?!呜呼哀哉,楼主神人也,吾不及也!
2007-06-01 01:20 | wdx2008      

#33楼    回复  引用    

[面向对象不是什么新玩意。对象的属性、方法都是结构化的产物,是人们认识客观对象的过程化、结构化的一种逻辑描述。

我想请问:能不能用《兰亭序》中的文字拼接出另一副有同样书法价值的艺术作品呢?所以说,面向对象不是万能的,在程序设计思想领域,真.....]

作者也说了,是应用客户。和楼上应用领域不同。

写的很好。刷一个,西西。
2007-07-11 06:45 | t4o0 [未注册用户]

#34楼    回复  引用    

@lxj
面向对象不止这四个字这么简单,须要领悟!其潜藏的能量亦远非结构化开发能及的!lxj兄,慎言之!
2007-08-07 23:50 | 风印 [未注册用户]

#35楼    回复  引用    

面向对象不是什么新玩意。对象的属性、方法都是结构化的产物,是人们认识客观对象的过程化、结构化的一种逻辑描述。

我想请问:能不能用《兰亭序》中的文字拼接出另一副有同样书法价值的艺术作品呢?所以说,面向对象不是万能的,在程序设计思想领域,真正具有提纲擎领作用的是结构化思想。深刻理解和运用认识客观世界的辩证法,熟练运用程序设计语言的结构特点,设计出面向对象的软件结构是顺理成章的事情。

简单地说:程序设计语言的结构特点 + 辩证认识论 ——> 自然产生包括面向对象等许多解决各种问题的有效方法
==============================================
lz是用"活字印刷"体现面向对象思想,不是"艺术创作",ok?是"印刷"这一需求,不是"写书法"!
2007-08-22 17:38 | ok [未注册用户]

#36楼    回复  引用  查看    

绝对经典!一篇小故事,把程序的灵活性,可扩展性,可维护,可复用等说得怎么一个妙字了得!
2007-08-27 17:22 | 光头小松鼠      

#37楼    回复  引用    

.NET技术交流群:12339353
本群是.NET开发人员的交流空间,欢迎广大.NET开发者来我们群一起讨论,研究.NET技术。(凑热闹的、其他语言开发人员以及喜欢涉及多门语言的误扰!)
2007-08-28 10:52 | 邱晨 [未注册用户]

#38楼    回复  引用  查看    

  面向对象确实是一个博大精深的思想,当你不理解时可能真的是一头雾水,可是当你深入理解之后,你会发现这真的一个天才的思维,他为我们提供了一个认识事务解决事情的好方法。当然对于这一思想的理解是没有止境的,有时个真的有一种只可意会不可言传的感觉,因此我们只能在自己有一点理解的情况下,自己慢慢得加深理解。别人也许最多也只能给你一点启示。
  楼主的这一比方就起到一个比较好的启示作用!!!本人比较认同!!
2007-10-23 14:24 | 水温快客      

#39楼    回复  引用    

相见狠晚啊*
精品,收藏……
2007-11-17 19:35 | sylk [未注册用户]

#40楼    回复  引用  查看    

绝对经典!看到博客园有这样的文章,真是爽.长期关注lz的文章.
2007-12-11 11:24 | 棠棠dotNet      

#41楼    回复  引用    

很好,很强大
2008-01-08 09:36 | erfe [未注册用户]

#42楼    回复  引用  查看    

太有才了,真想和你一起聊天,一定有意思,可惜我才看见此文章.
2008-01-18 12:39 | Annie      

#43楼    回复  引用    

写得真好,
2008-01-18 15:12 | She [未注册用户]

#44楼    回复  引用  查看    

如果给人讲解OO,给他举博主这个例子最恰当不过了,哈哈!
2008-01-25 17:40 | VelvetMark      

#45楼    回复  引用  查看    

例子写的很生动,面向对象的思想能让代码在这四方面更优秀。

#46楼    回复  引用  查看    

我看可以和吕震雨的毛笔蜡笔相提并论了~
支持一个
期待更多好文
2008-02-25 15:16 | floodpeak      

#47楼    回复  引用  查看    

其实这个用来说明面向过程还是很好的,用来说明面向对象,就有点浅白了。

过程(就是函数了)是对一行一行的代码的归类和合并,若干行代码和在一起实现一个功能,给它起个名字,就是一个函数了。


对象呢,就是一个一个的函数的集合,把相关的函数和在一起,就成了一个类。

由于类的封装性,对就是这个封装性,他有好处,但是也有坏处,坏处就是不便于修改,封装了嘛,你还怎么改呀?这就不灵活了。

为了解决这个问题,于是就出现了“继承”,多个子类可以继承一个父类,于是就出现了“多态”。

其实多态是一个很“自然”的东东。

由于 C#和java都不支持“多继承”,所以才出现了接口。

对接口是一种规范,同样,抽象基类也可以定义“规范”。

2008-02-25 19:55 | 金色海洋(jyk)      

#48楼 [楼主]   回复  引用  查看    

@金色海洋(jyk)
引用
"由于类的封装性,对就是这个封装性,他有好处,但是也有坏处,坏处就是不便于修改,封装了嘛,你还怎么改呀?这就不灵活了"

我觉得你对封装的理解还是有些错误,封装并不等于不能修改。它只是隔离并归类的意思。
2008-02-25 20:30 | 伍迷      

#49楼    回复  引用  查看    

我也想到了封装的问题。

它封装的到底是什么呢?代码?好像不是,封装的好像是类的内部变量,

在类的外部不能随意的修改类的内部的变量。

有一点这个意思。

也许根本就不应该这么理解封装。


归类 是类的本身的意思吧。

类就是把相关的函数(属性也是一种函数)归到一起的东东。


隔离 倒是没有体会到。隔离了什么呢?

那么函数(面向过程里的)有没有隔离的作用呢。


感谢回复我的回复。



2008-02-26 12:30 | 金色海洋(jyk)      

#50楼    回复  引用  查看    

其实一直都不明白你所说的:为什么在不用设计模式之前,客户的一个小改动,就会导致程序的大改动?

为什么呢?

其实我想并不是设计模式的作用很大,而是你的经验很多了之后,再做设计的时候就可以尽最大的可能避免,遇到修改时必须大范围的修改程序了。
2008-02-26 12:42 | 金色海洋(jyk)      

#51楼 [楼主]   回复  引用  查看    

@金色海洋(jyk)
引用"再做设计的时候就可以尽最大的可能避免"

设计模式就是一种教你如何做到尽最大可能的避免修改的方法。

至于“封装”的问题,以及面向对象的问题,很难简短说明,我想你还是多多看书吧。从你以往的文章和问题来看,你还没有完全感悟到OO的魅力,这不能不说是有些遗憾。不过OO也不是万能的,就你目前的工作而言,不用它也能运行得很好,不用强求。
2008-02-26 13:30 | 伍迷      

#52楼    回复  引用  查看    

要想吃透设计模式还是需要大量的经验吧?

那个鸭子的策略模式的后半部分我就没有理解明白,因为在现实的工作当中没有遇到类似的问题,所以就不好理解。

我现在在做页面的时候用到了“基类”。就是设计一个基类,做一些各个页面都必须做的事情,比如验证是否登录等。

总的基类,派生两个子类,一个是列表的基类,一个是表单的基类。

另外就是用UserControl来当作实体类来做。

我习惯按模块的方式来分,一个小的模块(一个小的功能)就放在一个页面里面,如果表多的话,就用多个UserControl来划分,而这些UserControl就可以提炼出来一个基类。

在这两个地方是真正的用到了一点OO的东东,其他的地方还是面对数据库的,面对过程的。

另外我的理解:SQL语句就是业务逻辑,对于我来说大部分的业务逻辑(和数据相关的)都是用SQL语句来体现的。


感谢楼主的回复。能在这里交谈也挺好玩的。

希望能加QQ:513281121。
2008-02-27 17:09 | 金色海洋(jyk)      

#53楼    回复  引用  查看    

文章很有意思,:)
2008-03-22 01:32 | Mouhong Lin      

#54楼    回复  引用  查看    

非常有意思.
2008-04-21 13:21 | 侯垒      

#55楼    回复  引用    

很好,原来最早的编程思想那么早就有了~~~
2008-04-25 13:14 | 撕烤者 [未注册用户]

#56楼    回复  引用  查看    

这个例子真好!
2008-06-10 12:09 | qiangchun      

#57楼    回复  引用  查看    

太秒了!
2008-07-09 16:45 | afei929      

#58楼    回复  引用    

很生动
2008-07-14 16:20 | 慕名而来 [未注册用户]

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-07-11 11:25 编辑过


相关链接: