这些对我来说也有年头了, 最近改一个国外比较著名的已经重构了好几年的社区产品, 不断的产生意识形态的冲突, 拿出来说说,信不信由你了。
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, 我的建议是: 不要动辄什么如何理解事物或者上升到本质之类的高度, 仅仅将面向对象当作一种表面的东西, 一个进行组织的工具, 并且谨慎对待; 有的剑, 出鞘越少越好。