我是一名大学生,我刚刚开始学习设计模式,并努力了解它们的目的。我尝试研究它们,但是我发现的所有资源似乎都是以学术而非专业的方式谈论它们。
他们的目的是什么,对学习重要吗?
我是一名大学生,我刚刚开始学习设计模式,并努力了解它们的目的。我尝试研究它们,但是我发现的所有资源似乎都是以学术而非专业的方式谈论它们。
他们的目的是什么,对学习重要吗?
Answers:
设计模式非常适合快速传达您的意图-每个人都知道工厂是什么。
要做的事情真的,真的,真的很糟糕,那就是开始尝试使您的代码适合于模式,或者根据模式来分离职责,诸如此类。说“此对象是工厂” 是一回事,而说“此对象应专门是工厂”是另一回事。
从维基百科上有关“ 设计模式”的文章:
讲模式的有用之处在于,有一个通用的术语来讨论设计师已经一遍又一遍的情况。
长期以来,我们在软件工程方面遇到了一个严重的问题:您雇用了一个项目的新手,无论他们对编程语言的了解程度如何,都需要花费数月的时间来了解您的工作情况。项目才能使他们富有成效。在硬件工程中,他们很久以前解决了这个问题:他们有一个通用的术语,称为“示意图”。您雇用了一名硬件工程师,在早上给他们硬件项目的原理图,让他们研究它们,直到晚上,在需要称呼这一天之前,他们可以拿起焊锡枪并提高生产率。我们一直在努力想办法使之变得更好。编程语言的标准化是一种方法。标准库(现今的类库)已经成为另一种方式。但是最重要的方法之一可能是设计模式。那么,它们重要吗?你打赌!
模式的存在确实有两个不同的实质性原因。
第一个已经被很好地解释了:模式的使用可以润滑开发人员之间的通信。如果您和我俩都明白,当我说“观察者”时,我是在谈论非常具体的代码结构,那么我可以非常快速地描述使用该模式的一些代码是如何工作的。另一种方法是完整描述解决方案,这既耗时又容易出错。(“好吧,我创建了这个纯虚拟类,它描述了消费者对象并与之建立了接口,然后我创建了一个类,其中维护了活动消费者的列表,...”)
模式的第二个好处是它们是常见问题形式的现成解决方案形式。如果您知道自己的模式,并且例如遇到一个问题,那么您需要找到一种很好的方法来将信息从(可能是多个)生产者对象获取到多个消费者对象,而又不会在类之间引入不必要的耦合,您将认识到“是观察员的工作!” 您将立即知道如何解决您的问题。
这些好处也确实彼此增强。它们使您可以快速解决某些常见的问题类别,然后在完成后就可以非常快速地传达解决问题的方式。
将此与“不存在”模式的世界进行对比。您遇到了这些问题之一,这些问题通常不是琐碎的设计问题,并且花费了大量时间来提出一个好的解决方案(顺便说一下,这很可能看起来很像适当的模式)。然后,您的同事出现,并且很想知道您如何解决该问题,并且花了一个小时讨论如何以及为什么。
所有这些都与警告有关,这似乎很明显:不要试图将问题变成不合适的模式。如果该模式不适合该问题,那么解决方案将最终陷入困境,并且您将失去模式所带来的减少工作量的好处。此外,由于您的工作将不再适合您的同事对模式含义的理解,因此您将失去沟通好处的成本。实际上,您可能会增加通信成本,超出无模式的成本,因为对模式的滥用会给您的同事对解决方案的错误理解,这比根本没有理解还差。
模式是关于思想和概念的重用,以及关于建立一个共同/一致的平台来交流它们的模式。
我们都同意(!),从理论上讲,代码重用是一件好事-但事实证明,重做比实际想做要难(在某些方面,这种情况正在发生变化,但这始终是一个挑战。 )。但是实际上,我们要重用的很多事情是一种处理方式,使用某种模板来构造特定问题的解决方案-这些就是模式。因此,您遇到这样的情况:您说解决问题X的好方法是使用模式Y,我们知道模式Y的元素是a,b和c,然后我们就开始了。因为模式已被广泛理解,所以您不必深入解释这是通信的好处。
模式的有趣之处在于,语言和框架正在不断发展,以为通用模式提供更好的支持,其最终结果是,我们获得了越来越多的代码重用(越来越多的乐高积木!),因为我们构建应用程序的方式(通过实现模式) )便于重用。
设计模式只是建立任何软件解决方案的基础。由于以下原因,它们很重要:
它们与语言无关。一旦知道适合给定问题/体系结构/任务的设计模式,就可以用任何多范式语言(例如C#,Java或Python)来实现它,在大多数情况下解决方案都是相同的,适应语法。这意味着您可以将自己的经验从一种语言编程转换为其他语言,只要您停留在同一问题域内(甚至跨域)即可。
尽管设计模式确实与编程范例绑定在一起,这意味着面向对象编程的设计模式(最著名的设计模式,也称为“四人帮”模式)。模式使您能够理解该范式最适合什么,并帮助您超越语法。例如,我已经看到了很多用C#和Java实现的方法,人们只是在Basic或Fortran中以编程的方式进行编程-他们有解决问题的完美命令,他们使用OOP来呈现此解决方案-无需继承,没有多态性,所有方法都是公开的等。设计模式可以帮助您了解这些概念,并了解它们在现实生活中的工作方式。同样适用于其他范例中的设计模式,例如函数式编程。
模式通常是表示思想的一种便捷方法,并且从体系结构进入计算机科学。一旦了解了某个“模式”背后的思想,就可以轻松地在其他问题中识别出该模式,并使用该模式来解决(可能稍作修改以更好地解决您的问题)。有很多不同的模式:在企业软件集成,源代码测试等中。只需在计算机科学书籍中查找模式即可。
除了通过学习模式来获取良好实践之外,您还可以通过学习反模式轻松地学习如何避免代码中的愚蠢错误。有很多书籍以反模式的形式展现了不同领域中的常见错误,它们既有趣又具有教育意义。顺便说一下,我喜欢这些反模式的名字!
设计模式的有用性取决于您选择的语言。您选择的语言越强大,就越不需要理解和实现设计模式。设计模式可能表明您的语言很烂,缺少内置功能。
Joe Gregorio 很好地谈论了Python中缺少设计模式的问题