0000
作家
作家
  • 铜币143枚
  • 威望34点
  • 贡献值1点
阅读:847回复:4

How to Use Design Patterns[推荐]

楼主#
更多 发布于:2005-05-30 08:12
How to Use Design Patterns
A Conversation with Erich Gamma, Part I
by Bill Venners
May 23, 2005

Summary
Among developers, design patterns are a popular way to think about design, but what is the proper way to think about design patterns? In this interview, Erich Gamma, co-author of the landmark book, Design Patterns, talks with Bill Venners about the right way to think about and use design patterns.

check at:
http://www.artima.com/lejava/articles/gammadp.html --------------------            [a=http://northlight.digital-pulse.net/]寻找失落的路灯 @ North.Light[/a]
   有沒有事比死更容易? 有沒有事比活更難?
               ~     幸福是一雙溫暖的紅唇    ~
.--. |o_o | |:_/ | // \ \ (| | ) /'\_ _/`\ \___)=(___/
0000
作家
作家
  • 铜币143枚
  • 威望34点
  • 贡献值1点
1C#
发布于:2005-06-14 11:48
Re:How to Use Design Patterns[推荐]
翻译了一部分。。。哈哈。。作业字数够了。。
不好意思啊,跟金山快译的效果差不多,可能还有错的地方,大家见笑了。。惭愧ing..

设计模式之父谈如何使用设计模式
全文:
如何使用设计模式
Erich Gamma 访谈,第一部分
作者:Bill Venners
2005-5-23
摘要:
设计模式(design pattern)一直是一个在开发者之间流行的话题,借助于它开发者可以更好地思考设计问题。但怎样才是思考设计模式的正确方式?在接受Artima.com的采访时,经典著作《设计模式》一书的作者之一Erich Gamma介绍了自己的经验。
	Erich Gamma 在1995年以畅销书《Design Patterns: Elements of Reusable Object-Oriented Software》(Addison-Wesley, 1995) 作者之一的身份登上软件世界的舞台。这部经常被作为GoF的里程碑式的著作,包录了23 种详细的通用设计难题的解决方案。1998年,他和Kent Beck 带领团队着手开发JUnit —— java社区中事实上的测试工具。Gamma现在是位于瑞士苏黎世的IBM对象技术国际实验室的高级工程师。他主持Eclipse社区,并带来Eclipse在JAVA开发界的成就。
	2004年10月27日,Bill Venners 在加拿大范库弗山举行的OOPSLA会议上遇到Erich Gamma。这次会议上,Gamma展现了他在软件设计上的洞察力,并被多次分期地在Artima Developer上的Leading-Edge Java专栏发布。在第一部分,Gamma发表了他对正确使用设计模式的看法,并说明了模式库之间的不同,比如说GoF和另一种亚历山大港的模式语言。
设计模式的实际价值
Bill Venners: Bruce Eckel 和我都教授设计课程,我们发现很多人都非常想了解GoF模式。模式对产品说明会有很大帮助。而围绕设计模式有数不清的市场广告。
Erich Gamma: 十年后仍然如此吗?
Bill Venners: 是的。人们乐于了解模式,我怀疑很大一部分是因为模式仍是一个口号。我喜欢揭穿骗局找出人们到底用模式做些什么,他们对模式的看法如何,怎么来使用设计模式更好地完成工作,什么才是实际的价值。
Erich Gamma: 我把模式当作一个可以帮助人们学习面向对象思想的整体:怎样支持多态性、模块设计、权限管理、平衡功能,以及可插入功能。模式已经超出了把对象应用到有一个图形类和多个多态的描绘方法的图形例子。在理解了模式之后你才真正地开始学习多态性。所以说,模式对学习面向对象和常规设计都有好处。
	在熟练掌握以后,每个单独的模式在不同的方面协助你时都有不同的特性,取决于你需要更多的弹性或是更高的抽象和封装性能,又或者使代码更加松于耦合。在庞大的系统里,这确实是一个大问题。怎样保护私有层?怎样消除上层调用或是循环依赖?GoF 提供工具来对付这些问题,他们不是解释换位而是通过提供合适的解决方案来做到这点。尽管对于具体的用户来说模式是抽象的,但他们仍能提供有价值的执行方案。在我看来实际上模式是可实现的,这才使得它们如此地有价值。
	模式是从专家们的经验中沉淀出来的,它们使其他人一样能够做出成功的设计。有了它们你可站在巨人的肩膀上而不用从头开始造车轮。然而,由于模式带来了很多实行上的变化,所以你仍须保持头脑清醒。最后,因为模式提供了和名字一起的设计模块,所以实际上它们也提供了一个用以描述讨论精巧设计的词汇表。
	另一个问题是怎样来教授模式,我不能明确地知道你该怎么做,而只是知道你不能做的是已经分类列出来的23个模式。这种办法不能带来任何效果,你得自己体会糟糕设计的痛苦,我猜只有你感受到这种痛苦后你才会感激一种模式。
Bill Venners: 什么样的痛苦?
Erich Gamma: 比如说认识到自己的设计不够灵活,一点改动会波及整个系统,必须重写代码或是使代码变得庞杂而且极其复杂。后来你在如此杂乱的情景中应用设计模式,你会发现痛苦不翼而飞而最终感觉非常棒。就像豁然开朗,就是这种模式,或是工厂或策略解决我的问题。我认为这是教授设计模式最有意思的方法。
	在刚开始教的时候真的是非常令人厌烦的,我只是在列举模式。我发现更有趣的是用真实的例子来应用模式。换句话说,你得把这些问题套到实际的例子里去而不是脱离实际。在OOPSLA上,我得到一本《Heads First Design Patterns》,真是本好书,不只是因为写得很有趣,也因为他们能用一种新颖和高度可视的方式表达设计模式的本质。
Bill Venners: 这就是模式的价值,然后,在实际的世界里当我感到有特定的麻烦的时候我能不能找到一种已知的解决方案呢?
Erich Gamma: 这是我推荐的明确的使用模式的方法。不要立即把模式用到设计当中去,而是在你知道更多的问题的时候来应用模式。因此我喜欢在了解实际之后应用模式,并重新分解模式。在模式刚开始流行的时候我在一个新闻组里看到一条评论抱怨说在一个实际的程序中他们试着去使用GoF的全部23个模式,他们做不到因为只能使用20个模式,他们希望有人能告诉他们怎么做来挤进去另外3个模式。
	想应用所有的模式并不是件好事,这将以杂乱的设计而告终,不确定的设计有着不必要的弹性。现在的软件都设计得太复杂了,我们不能忍受要去推测它还能做什么,我们得真正找到它需要什么。这就是为什么我喜欢重新分解模式。当遇到一个特别的问题或都是查觉到糟糕的代码的时候,人们得学会到模式工具箱内找到解决办法。
Bill Venners: 这挺有意思的,因为我第二个问题是我发现人们总是觉得最符合模式的设计才是最好的。在我们的设计研究会上,我参与设计一个在研究会的最后公布的项目。无一例外地,发布者总是想展示他们在这个项目中用到了多少模式,尽管我尽量去说明最终目标是一个干净易懂的API,而不是去赢得一个“我用了最多的模式”的争辩。刚听到你说到同样的内容,那种做法不是考虑模式的正确方式。如果不是,什么才是使用设计模式的正确的理由?
Erich Gamma: 相当一部分模式是与可扩展性和重用性有关的。当你真正需要可扩展性的时候,模式提供支援用以达到这个目的,这非常有用。但是如果你不需要它,你就要保持设计简单不添加不必要的间接层。我们Eclipse的格言之一就是我们只在紧要的地方需要可扩展性。实际上,如果你对我们怎么在Eclipse中应用模式感兴趣,我努力在《Contributing to Eclipse》一书中说明。在这章里我使用设计模式来详细解释Eclipse的体系结构。
Bill Venners: 可扩展性,你的意思是?
Erich Gamma: 你可以定制软件的行为而不用修改现有的代码——最古老的面向对象的风格,并在特定的问题中能够重用一些东西。
设计模式围绕的核心
Bill Venners: 在一篇你和Kent Beck合写的文章《JUnit: A Cook’s Tour》中,你用这样的语言来带领读者领悟JUnit的设计:“从什么都没有开始,一个一个地应用模式,直到你有了整个系统的体系结构。”我觉得这个方法的灵感来自于Christopher Alexander,他从软件运动中得到结构的灵感而研究设计模式。你是否认为一种模式压在另一种模式之上直到有结果是一种有效的设计方法?
Erich Gamma: 《JUnit: A Cook’s Tour》是种综合,我们重新构建我们在JUnit中的设计。但是,我们并不是按照那种模式驱动的方式来开发JUnit的,而是严格的测试驱动地方式。实际上JUnit里包含着一种核心抽象用来测试,围绕着这个核心你能看到很多显现出来的依次物化的模式实例的设计点。这是在成熟的设计中经常可以看到的。一些关键的抽象经常以设计中心的形式出现,而你会想要围绕这些关键抽象完成不同的事。所以你会看到模式是从这样一个中心而来,但是我不会使用这些质量标准。
Bill Venners: 这就是你说“模式密度”时所指的?
Erich Gamma: 是的,准确地说,模式围绕着中央抽象而突然出现。
Bill Venners: 你说过TestCase是JUnit中的核心抽象。
Erich Gamma: 实际上是指被TestCase引用的Test接口,但是的确,我们是从TestCase开始并扩散的。
Bill Venners: 接下来,你能不能详细说明下密度?围绕着它的模式的数目?你刚说《JUnit: Cook’s Tour》是种综合。
Erich Gamma: 综合感觉cook’s tour一文是在测试驱动的开发中去掉所有的测试后留下的来。因此它是一种非常简洁的表述,密度围绕着测试表现出来。
	在设计JUnit的时候我们不只是把模式串起来,我们用测试驱动的办法来做,从第一个测试开始,我们希望它能成功并且告诉我们要怎么来改进代码。开发一个测试框架并不在它的挑战之外,但是一旦你有了最基础的工作,它就非常容易变得令人惊讶了。Kent和我在设计JUnit的时候熟练地使用模式。理所当然,我们可能会像这样说话:“嘿,那是合成的。”合成是JUnit里的一种模式。我们也使用模板方法,那才是基础的。我们有命令,很显然这是关键的。我们从测试的时候说:“这是一个命令,而这是一个模板。”因为我们非常熟练模式,我们交谈起来真的很快,得到一个高效的设计。
--------------------            [a=http://northway.blogchina.com/]寻找失落的路灯 @ North.Light[/a]
   有沒有事比死更容易? 有沒有事比活更難?
               ~     幸福是一雙溫暖的紅唇    ~
.--. |o_o | |:_/ | // \ \ (| | ) /'\_ _/`\ \___)=(___/
0000
作家
作家
  • 铜币143枚
  • 威望34点
  • 贡献值1点
2C#
发布于:2005-06-02 15:01
Re:How to Use Design Patterns[推荐]
I hate translations....
God retrieval me. --------------------            [a=http://northlight.digital-pulse.net/]寻找失落的路灯 @ North.Light[/a]
   有沒有事比死更容易? 有沒有事比活更難?
               ~     幸福是一雙溫暖的紅唇    ~
.--. |o_o | |:_/ | // \ \ (| | ) /'\_ _/`\ \___)=(___/
0000
作家
作家
  • 铜币143枚
  • 威望34点
  • 贡献值1点
3C#
发布于:2005-06-02 13:55
Re:How to Use Design Patterns[推荐]
三頁翻譯完應該有三千字左右吧。。拿來做專外大作業得了。 --------------------            [a=http://northlight.digital-pulse.net/]寻找失落的路灯 @ North.Light[/a]
   有沒有事比死更容易? 有沒有事比活更難?
               ~     幸福是一雙溫暖的紅唇    ~
.--. |o_o | |:_/ | // \ \ (| | ) /'\_ _/`\ \___)=(___/
ApH
ApH
知名人士
知名人士
  • 铜币0枚
  • 威望0点
  • 贡献值0点
4C#
发布于:2005-05-30 18:48
Re:How to Use Design Patterns[推荐]
就喜欢这句话“There's a lot of marketing hype around design patterns.”,不过 Bill Venners 没有意识到 Bruce Eckel 也是hyper呀!
游客

返回顶部