怪怪 | Nothing, Everything

"有过一个发疯的时刻,有感觉的钢琴以为它是世界上仅有的一架钢琴,宇宙的全部和谐都发生在它身上." - 狄德罗
随笔 - 104, 文章 - 3, 评论 - 2004, 引用 - 44
数据加载中……

两个过去的心得, 外加一个回帖整理

这些对我来说也有年头了, 最近改一个国外比较著名的已经重构了好几年的社区产品, 不断的产生意识形态的冲突, 拿出来说说,信不信由你了。

1. 在我们大拽面向对象之前, 请先用好静态方法。可怕的不是你没管理好对象的状态, 而是把明明不依赖任何状态的事情和不知道从哪儿被硬生生造出来的状态挂了勾。 当你需要状态, 需要更高级的面向对象特性的时候, 你会明显的得到一个“我该怎么办”感受,并非常容易的升级; 但是, 从一大堆乱七八糟相互依赖的状态中, 搞清楚什么实际上是不需要状态的, 就不那么容易了。

一个榜样: .NET类库里, 很多东西在最底下都是静态方法, 当需要面向对象手法搞些变换的时候, 再重新组织。 这些代码还是相当清晰的。

2. 当你做一个带ITemplate属性的Control的时候, 请不要忘记TemplateContainer标记。 通过这个标记和指定Container的类型, 我们就可以在aspx/ascx中写该控件的模板时,通过Container.Xxxxx获取数据。 何时应该搞一个带模板的控件呢? 当你发现你不断的嵌套一个又一个自定义控件,封装各种功能,使用这些控件的属性来定义行为和外观,并且来回获取和传递数据的时候。

至于具体的做法,请参阅MSDN, 以及查看Repeater的代码。

说实话, 这两条, 一个是基本的编程准则, 一个是写过两年ASP.NET的人都应该掌握的。 但是就我的经历, 偏偏很多从道理上来讲应该经验丰富的程序员, 都弄得一团糟, 所以做个提醒。



回帖整理: 原帖。文章很好, 例子也还合适, 不过:

引用“为什么我们要面向对象设计,为什么要使用设计模式.主要就是面向对象设计可以非常好的描述出事物本来的面目.事物的存在就有它存在的理由,这是自然规律,所以按照事物本身的特征去描述它自然也就是合理的.软件设计就是如此.”


类似的话不知道害了多少人。 对面向对象越熟悉, 越不会认为和现实世界对应是好的面向对象手法。 换个例子、扩大下场景, 比如看看那本《敏捷软件开发》C#版中咖啡壶那一章就知道了。

的确, 很多面向对象的设计结果和现实事物差不多,而且非常直白。 说实话, 这很难说是好的抽象思维, 而仅仅是一种具体化描述。 这种描述之所以看起来很合理, 不过是因为在这个问题上暂且不需要高级的抽象。在这一样一个设计中, 即使使用了设计模式之类的手法, 也不会真正得到面向对象的好处: 这些样本,如果重构为精心安排的面向过程式的描述, 也会是干净漂亮的。

既然回到自己的地盘, 多说两句。 就面向对象这个东西, 我现在非常迷惑, 不知道应不应该鼓励初学者去学习它。 当然, 不谦虚地说, 虽然我是个永远的菜鸟+初学者, 但是我不在此列; 不过这不是因为我NB, 而是因为我好比衣服被铁丝网给挂住那样, 没辙了。 鉴于现在的开发者社区和商业公司, 大多还在围绕面向对象打转, 面向对象肯定还是要掌握的。 可我见了太多的初学者,越学越不是那么一回事, 白白把精力消耗在错误的理解上, 还认为自己在“不断提高”。

我就想起Bob大叔说的, 11年前, 他写的例子也是这种和现实世界对应的东西; 一直改进到现在, 才像样了。 11年呀老兄们。 我自己的经验是,我用了3年, 但是我第一次和别人讨论接口, 已经是90年代的事情了, 我受到的熏陶算进去, 也有10来年了。 但是和这位大叔比,我想我的差距还很大。 比如我根本不敢保证, 使用面向对象手法,我能一次作出正确的建模和设计, 而是只能依赖于重构; 我也仅仅敢说自己能够理解那些做对了的面向对象: 对于错的,只要它有一定复杂度, 我本人必须在实践中切身经历,才敢说可以准确的指出。

也许面向对象的初学者和高手们对自己的掌握程度或者学习能力都比我自信, 甚至比Robert Martin自信, 但我总觉得这不是什么好事。 还有一个类型的哥们,嘴上总在说, XX是本质的(或者正好相反“XX不是万能的”,奇怪吗?:), 似乎只要过了某个境界,就能够做到具体问题具体分析;XXXX等等都不在话下,语言在他眼里也没有优劣之分, 已经无招胜有招了云云。 说实话, 当我自己真正有了些体会,再看到这些言论时都不知道做何感受; 我只知道, 不断演化来演化去的语言, 并不只是为了方便初学者准备的。

扣下提, 做个总结吧。第一, 我这篇文章不是骂面向对象的,面向对象现在不是好不好的问题, 因为大环境要求我们必须去学去用; 第二, 面向对象水平的提高,不可能一蹴而就;而且我个人认为万一学歪了, 10年之后也许悟出的“真谛”反而是进行软件设计时,思维中最大的障碍。 另外就是, 不要高估自己, 但也不要随便给自己找榜样; 在一些问题上我们找榜样时的眼光恰恰不足以分辨谁是榜样。其实我们找榜样时, 往往是为了肯定自己; 对于我们的学习来说, 无论怎么忽悠读者都不是作者的错, 错的是自我保护的心理。

最后,我自己的体会是,广泛的掌握面向对象的手法, 但不要因为自己学了什么就给自己下套子, 那和屁股决定脑袋差不多。 学的这些东西是备用的, 大环境让我们必然能够用得上。 与此同时, 根据需求出发, 当自己有强烈的感觉, 某个学习过的东西, 能够解决当下的问题时, 再去试着应用。 鉴于万事都需要练习,如果忍不住老想拿新学会的东西练练手, 不如写些开源小软件什么, 否则就要做好未来重构项目的准备了。

写程序、做设计是一个边学边干的活计,有一个著名的调侃, 就是如果程序员盖的房子, 你敢住吗? 结合顶头说的问题1, 我的建议是: 不要动辄什么如何理解事物或者上升到本质之类的高度, 仅仅将面向对象当作一种表面的东西, 一个进行组织的工具, 并且谨慎对待; 有的剑, 出鞘越少越好。

posted on 2008-07-15 05:56 怪怪 阅读(2363) 评论(22)  编辑 收藏

评论

#1楼    回复  引用  查看    

吃饭去,回来再看。

毕竟我们是在用.net来写程序,至少要知道封装、继承、多态、抽象,还有接口、委托等,还有设计原则若干。

我现在再看anytao的《你必须知道的.net》,巩固了一些这些知识,把基础弄得扎实一点,才能像你这样,说话有底气。

TemplateContainer标记 这个还没有用过。可能不是不用,而是还不知道怎么用。
2008-07-15 07:32 | 金色海洋(jyk)      

#2楼    回复  引用  查看    

現在也不敢動轍就面向對象了﹐很多時候簡單﹐易維護的代碼才是好的選擇
2008-07-15 07:33 | 小生      

#3楼    回复  引用  查看    

面向对象总归是好东西,可以想象一下如果写c#程序时不用任何面向对象特性的景象,就会感到我们已经离不开OO了。当然不用类的话,可以像C语言那样用Struct+静态方法也可以写出不错的程序,但是如果把Struct看作一个含有内部状态的系统,把静态方法看作改变这个系统的接口,那么这已经是面向对象的思想了^_^
当然面向对象好学不好用,经常导致过度设计、畸形设计,这也是个很严重的问题。
2008-07-15 08:38 | 1-2-3      

#4楼    回复  引用  查看    

尽量少违反原则,有时也得违反。程序让大家看的顺眼。
2008-07-15 08:55 | 张中健      

#5楼    回复  引用  查看    

面向对象的思想还是需要的,在一些复杂的商业应用软件中,如果不利面向对象的思想去抽象、去封装、去提练接口,真不知道该怎样运作,整个系统象蜘蛛网似的耦合在一起,还有重见天日的时候吗?
2008-07-15 09:07 | Goumh      

#6楼    回复  引用  查看    

“最后,我自己的体会是,广泛的掌握面向对象的手法, 但不要因为自己学了什么就给自己下套子, 那和屁股决定脑袋差不多。 学的这些东西是备用的, 大环境让我们必然能够用得上。 与此同时, 根据需求出发, 当自己有强烈的感觉, 某个学习过的东西, 能够解决当下的问题时, 再去试着应用。 鉴于万事都需要练习,如果忍不住老想拿新学会的东西练练手, 不如写些开源小软件什么, 否则就要做好未来重构项目的准备了”这个总结不错
2008-07-15 09:18 | xjb      

#7楼    回复  引用  查看    

“在我们大拽面向对象之前, 请先用好静态方法。”非常赞同
2008-07-15 09:26 | CowNew开源团队      

#8楼    回复  引用  查看    

看完了,又看得不怎么懂,一看,又是怪怪的文章...
2008-07-15 09:28 | 狼Robot      

#9楼    回复  引用  查看    

.
2008-07-15 09:32 | bmrxntfj      

#10楼    回复  引用  查看    

"一个榜样: .NET类库里, 很多东西在最底下都是静态方法, 当需要面向对象手法搞些变换的时候, 再重新组织。 这些代码还是相当清晰的。"

底层的东西要是用面向对象设计的话会是个错误的选择,但是应用层的东西要是使用面向过程设计的话个人觉得也不是很好!

面向对象主要是在应用层或中间的某一层使用比较好!尤其是在大型应用软件中!
当然没有绝对的!
2008-07-15 09:43 | thriving.country      

#11楼    回复  引用  查看    

对象过程,没有绝对啊
2008-07-15 09:51 | Tony Zhou      

#12楼    回复  引用  查看    

呵呵,越简单越明了嘛,好多系统确实用静态方法就O了,没那么复杂,写asp的时候不都那么写吗?不过底层的东西,肯定都是一些工具方法,web服务不也都是一些方法吗,还有SOA。
2008-07-15 09:54 | 蛙蛙池塘      

#13楼    回复  引用  查看    

从一开始就感觉面向对象是个好东西,但也是从一开始就没想着把它贯彻到底
2008-07-15 10:36 | 丁学      

#14楼    回复  引用    

算法属于纯理论的数学抽象,在漫长的人类文明史中它是可靠值得信赖的,缺点是永远只专注于抽象的事物。而面向对象的实质则是对事物行为、性质的“探测性”的抽象,可靠性?呵呵哈哈。
这有点类似哲学的抽象思想,但它基于计算机系统原理而进行,兼顾物理运作的效能和进行这些抽象工作的群体自身的抽象能力,而面向对象语言,将这其中一部分“共性”的东西从程序设计人员眼前给透明掉了,然后一帮人鼓吹各种方法论,似乎抽象是多么简单有效的事情,并且最重要的是你的抽象会是“普遍真理”,甚至于你也可以象在画素描画一样很容易的“重构”你的抽象,听起来真是美妙极了,程序设计终于成了艺术活,于是我们常听到“咱就先这样抽象吧,等到‘重构’的时候再。。。”。
2008-07-15 11:15 | A1 [未注册用户]

#15楼    回复  引用  查看    

OO确实是非常难把握得好的。
2008-07-15 13:16 | Klesh Wong      

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

@Goumh
过去没有面向对象的时候, 现在一些Unix系C高手写的程序, 也不是粘在一起的...

@狼Robot
@bmrxntfj
5555,我怎么就写不出大家都看得懂的文章呢?

@thriving.country
不是底层, 指的无需依赖状态的那些过程, 说底下, 只是因为它们在调用的链条上处于最后了。

@A1
嗯, 现在是个“艺术”泛滥的年代...
2008-07-15 13:26 | 怪怪      

#17楼    回复  引用  查看    

其实自己都还没完全了解什么是面向对象,看来我需要学的东西还很多!!!
2008-07-15 14:06 | zagelover      

#18楼    回复  引用  查看    

怪怪的意思是不把面向对象当方法论看,而是当工具看?

如果单纯从代码的角度讲,
个人感觉面向对象应该是组织代码的一种方式,通过类、接口等使代码的“沙度”扩大,这样更容易达到代码的重用。

但是,如果把面向对象升华到思想和方法论的高度,有很多东西就模糊和难以探索,尤其是design的时候!

还是 深度不够啊 !
恩,应该弄个标记,11年后再来看这个回复! 呵呵

2008-07-15 14:57 | xiao_p      

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

@xiao_p
从设计的角度讲, 也仅仅是辅助工具。如果是个想法都叫做思想, 那么思想也就很难说得上是一个武器了。

方法论必然联系着世界观。 虽然软件设计仅仅是一个领域, 但是这个领域由于要和多种多样的业务交融, 所以总会碰到各种各样的待解决问题。

正是因为这样的特征, 所以如果非要总结世界观和方法论,要求非常的高。 面向对象这个东西还是太局部、太具体了, 想要涵盖各种变化太勉为其难了。

这样的东西,如果强硬的升华它, 我个人认为碰壁非常正常。 “方法论”和“方法”只有一字之差, 但万万不能混淆。

其实这个问题可以换个角度看,如果两个人具体理解和手段掌握上水平相仿, 对于其中一人是思想和方法论的东西, 对另一个人来说只不过相当于工具和方法,那么谁的天地更广阔呢?
2008-07-15 15:50 | 怪怪      

#20楼    回复  引用  查看    

讲得很有道理!
2008-07-15 21:58 | zqwuwei      

#21楼    回复  引用  查看    

“写程序、做设计是一个边学边干的活计”
呵呵,的确如此啊。。。
2008-07-16 08:44 | 钢钢      

#22楼    回复  引用  查看    

--引用--------------------------------------------------
怪怪: @xiao_p
从设计的角度讲, 也仅仅是辅助工具。如果是个想法都叫做思想, 那么思想也就很难说得上是一个武器了。

方法论必然联系着世界观。 虽然软件设计仅仅是一个领域, 但是这个领域由于要和多种多样的业务交融, 所以总会碰到各种各样的待解决问题。

正是因为这样的特征, 所以如果非要总结世界观和方法论,要求非常的高。 面向对象这个东西还是太局部、太具体了, 想要涵盖各种变化太勉为其难了。

这样的东西,如果强硬的升华它, 我个人认为碰壁非常正常。 “方法论”和“方法”只有一字之差, 但万万不能混淆。

其实这个问题可以换个角度看,如果两个人具体理解和手段掌握上水平相仿, 对于其中一人是思想和方法论的东西, 对另一个人来说只不过相当于工具和方法,那么谁的天地更广阔呢?
--------------------------------------------------------

恩,受教育了!!!

目前阶段因为感受到了一些面向对象的好处,所以确实有些过分的依赖面向对象!!!

还是站的不够高,看的不够远啊!!!
2008-07-16 09:19 | xiao_p      

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-15 07:01 编辑过
成果网帮您增加网站收入


相关链接: