如何灵活运用设计模式

xzd109 2009-10-31 02:18:54
工作两年,起初只是一味去研究代码,实现功能,每实现一个功能,有一种成就感

但现在越来越感觉设计模式的重要性了,看了GOF23种设计模式后,但是就是不太会应用,
以前在单位时看过一个同事写的代码,确实到现在没有看懂,用其他同事的话说,你能学会他的代码,你的水平可以上升一个层次!

真的,那个同事的代码可能是彷Hinernate自己写的,封装性太强了,里面的实体类是代码是他自己写的一个代码生成器生成的代码,后来看了下他的代码生成器的代码,里面全是VB写的,水平有限 也确实没有怎么看懂!

真的很想了解下他的代码,可是不懂他的代码的工作原理,无从下手!

所以在此我想请教一下该如何学好设计模式,怎么让自己的代码能有一个新的突破??????

我主要做WEB的
...全文
273 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2009-11-02
  • 打赏
  • 举报
回复
呵呵,这个问题的确很难说明白。
设计模式实际是一种综合性技术的体现,而非单独的一种标准。他是 经验+思路+看问题的角度+技巧的综合体。

经验:你要看的出来,代码以后的变化。所谓高手下棋能看到后面7,8步,而新手能看到3步就算NB了

思路:既然看出变化的,就要做防范,如何防范这是思路问题

看问题的角度: 有经验+有思路是不错滴,如何是看问题的角度,所谓横看成岭侧成峰,同样一个问题,在不同的人和不同的时间地方,不同环境下有不同的应对,如何选择取决于你看问题的角度(我自己的故事,曾经的一个设计上的问题 我当天就想出了至少七种的解决方案,但是如何从这七种选择一个最适应那个项目的设计,我用了七天。实际这七种方案都没啥优劣之分,只是各自要封装隔离的出发点不同,他们只是从不同的角度去解决同一个问题)

技巧:想的出来不一定做的出来,这时候考的是技巧。



这个就像下围棋的,围棋有不同的研究方向:死活题,手筋,大局观,收官---------
如果你单独去玩一种东西,结果可以预见:
单独玩死活题:你杀死别人7颗,别人确在后面能很轻松的活11颗,你是吃亏还是占便宜了??

单独玩手筋:手筋代表效率,代表着“美”,看上去“美”的东西,有时候却未必有效

单独玩大局观:ok,大局观没错,"立二拆三"也没错,可是为啥明明看上去牢不可分的东西,被人几打几不打,就闹个筋崩形分??

单独玩收官:前面都没下好,你从哪里收起??


ok,说这么多,我只是想让你知道,别钻牛角尖,要综合提高。
liuhengwinner 2009-10-31
  • 打赏
  • 举报
回复
楼上的话好像反了, 出现楼上的问题时 应该看 重构!
lnwuyaowei 2009-10-31
  • 打赏
  • 举报
回复
1.如果感觉代码重复很多
2.代码很乱,自已也看不太明白了.
3.灵活性差,改动一个功能,要找很多地方,并且不能保证原来的功能正常运行.
4.实在想不出好的方法来理清自已的思路.

出现这些情况时,看看设计模式的书.
mohugomohu 2009-10-31
  • 打赏
  • 举报
回复
如果你真的写垃圾代码、重复代码多了,感到很烦,那就可以尝试设计模式了。
突破不是一两天的,常用的设计模式23种,要看完很容易,真正领悟并合理使用,要很长时间。

办法:
1.在写代码的时候,想一下:如果老板明天就要把这个功能改了,我该怎么设计。
2.操作数据库的时候,想一下如果要几个数据库一起用的,要怎么设计
3.坚决消灭重复代码!!
xzd109 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 caozhy 的回复:]
引用 7 楼 xzd109 的回复:
恕我直言,
我一直想说的是去研究一些开源的框架,比如.Net framework 等,里面设计模式运用的非常巧妙,
可是这方面经验不足,不知该如何研究下手

用网上话说,做WEB的程序员不叫程序员,这话我同意,
我也是做WEB的,平时代码写的再多,也充其量只能解决问题罢了,只是随心写的代码,确实很难有实质性的飞跃!
就和学书法一样,你个人认真的写,写的再漂亮,很难提高的,必需有一个专业大师来指点教导你,你才会有提高,设计模式难道不是一样吗?/???


真正的智慧来自内心的感悟,而不是所谓大师的指点。
道法自然。
我曾经设计了一个Web服务通讯框架,那时候我还没有接触到WCF。
当我看到WCF以后,发现我和它们的设计很多地方不谋而合,就是这个道理。
[/Quote]

当然对于到了一定层次的人来说是要悟的,可是对于基础都还没有掌握的来说这个,还不是时候
mbh0210 2009-10-31
  • 打赏
  • 举报
回复
楼上的仁兄讲的很好
threenewbee 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xzd109 的回复:]
恕我直言,
我一直想说的是去研究一些开源的框架,比如.Net framework 等,里面设计模式运用的非常巧妙,
可是这方面经验不足,不知该如何研究下手

用网上话说,做WEB的程序员不叫程序员,这话我同意,
我也是做WEB的,平时代码写的再多,也充其量只能解决问题罢了,只是随心写的代码,确实很难有实质性的飞跃!
就和学书法一样,你个人认真的写,写的再漂亮,很难提高的,必需有一个专业大师来指点教导你,你才会有提高,设计模式难道不是一样吗?/???

[/Quote]
真正的智慧来自内心的感悟,而不是所谓大师的指点。
道法自然。
我曾经设计了一个Web服务通讯框架,那时候我还没有接触到WCF。
当我看到WCF以后,发现我和它们的设计很多地方不谋而合,就是这个道理。
threenewbee 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xzd109 的回复:]
想请教下二楼这位朋友,您工作中,
熟练运用过哪些模式,工作经验是一个方面,但理论基础真的还是要有意识的学习的东西?如果现在都没有小的进步,真的很难有大的进步的?
我周围很多程序员做了5-6年了,什么TDD,敏捷开发中的一些概念都没有听说过,这可如何提高了?做程序员的目标基础都是做架构师,需求分析师,所以说了,个人认为理论,经验要两方面一起抓!

什么多想多做。这个要有针对性的去做!比如Nhibernate的工作原理都不知道,如何能掌握编程的本质了?
[/Quote]
Nhibernate的源代码设计的并不好。说白了,工作原理就是反射+工厂,而且明显很多设计模式是对一些编程语言的妥协。
还有,不同的项目用到的技术不同,不理解为什么这么做,光学会怎么做是没有用的。
设计模式在便于代码扩展的同时增加了代码的复杂性,你看不懂你同事的代码就说明了这个问题。
滥用设计模式比不用设计模式更糟糕。
所以多想多做才是正确的。
threenewbee 2009-10-31
  • 打赏
  • 举报
回复
设计模式不重要

首先搞明白OOP的5大原则。
单一职责原则(SRP)
开放-封闭原则(OCP)
Liskov替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP)
辉太郎 2009-10-31
  • 打赏
  • 举报
回复
偶尔也看看设计模式,也是不太明白。大多数的项目的框架已经是搭建好了的,有专门的人来维护。其他的就是往里写代码。哎,用的很少啊。
SimpleM 2009-10-31
  • 打赏
  • 举报
回复
总的来说,在写代码的时候要有一种前瞻性,要明白哪些地方需要经常改动的,那么我们就把这些经常需要变动的地方,给封装起来,力求把改动范围控制到最小,并且这个框架对于可扩展性要拥有比较好的支持。
mbh0210 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xzd109 的回复:]
恕我直言,
我一直想说的是去研究一些开源的框架,比如.Net framework 等,里面设计模式运用的非常巧妙,
可是这方面经验不足,不知该如何研究下手

用网上话说,做WEB的程序员不叫程序员,这话我同意,
我也是做WEB的,平时代码写的再多,也充其量只能解决问题罢了,只是随心写的代码,确实很难有实质性的飞跃!
就和学书法一样,你个人认真的写,写的再漂亮,很难提高的,必需有一个专业大师来指点教导你,你才会有提高,设计模式难道不是一样吗?/???

[/Quote]
只是随心写的代码,那为什么在写的时候不多想想,更好的扩展性,支持更好的可变性了?
mbh0210 2009-10-31
  • 打赏
  • 举报
回复
工厂模式肯定大家都用了,策略模式,单例模式,适配器模式,桥接模式,装饰模式都有时候用。

模式也只是前人对一些处理方式的总结,不要拘泥于模式。

多想,指的是编码过程中,这里的逻辑会产生很多变化,那就得好好想想怎么来支撑这个变化(变化包含现在,未来),采用何种方式,这都是一种提高。
xzd109 2009-10-31
  • 打赏
  • 举报
回复
恕我直言,
我一直想说的是去研究一些开源的框架,比如.Net framework 等,里面设计模式运用的非常巧妙,
可是这方面经验不足,不知该如何研究下手

用网上话说,做WEB的程序员不叫程序员,这话我同意,
我也是做WEB的,平时代码写的再多,也充其量只能解决问题罢了,只是随心写的代码,确实很难有实质性的飞跃!
就和学书法一样,你个人认真的写,写的再漂亮,很难提高的,必需有一个专业大师来指点教导你,你才会有提高,设计模式难道不是一样吗?/???
小y的CSDN博客 2009-10-31
  • 打赏
  • 举报
回复
多写代码;多碰到问题,这样才可以了解设计模式的精髓!
xzd109 2009-10-31
  • 打赏
  • 举报
回复
想请教下二楼这位朋友,您工作中,
熟练运用过哪些模式,工作经验是一个方面,但理论基础真的还是要有意识的学习的东西?如果现在都没有小的进步,真的很难有大的进步的?
我周围很多程序员做了5-6年了,什么TDD,敏捷开发中的一些概念都没有听说过,这可如何提高了?做程序员的目标基础都是做架构师,需求分析师,所以说了,个人认为理论,经验要两方面一起抓!

什么多想多做。这个要有针对性的去做!比如Nhibernate的工作原理都不知道,如何能掌握编程的本质了?
mbh0210 2009-10-31
  • 打赏
  • 举报
回复
在编写代码的时候,那写是固定的,那些是变化的。变化的东西怎么才能很好的支持变化或者以后的扩展性

这样你自然而然的就会用到一些设计模式了。
xzd109 2009-10-31
  • 打赏
  • 举报
回复
什么叫拔苗助长??
设计模式是软件开发的基础,

是必需要有意识提高的东西
mbh0210 2009-10-31
  • 打赏
  • 举报
回复
在使用模式之前,先搞明白为什么要使用模式,不要模式而模式

其次,随着经验的累积,代码量的加大,对模式的理解就更加透彻了。。。

多用多想
mohugomohu 2009-10-31
  • 打赏
  • 举报
回复
这个,好像有点拔苗助长吧

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧