乐趣区

关于code:走近设计模式写代码一定要用设计模式吗

摘要:不少人对设计模式都有些疑难或者说是质疑:写代码肯定要用设计模式吗?用了设计模式的代码就比没用的好吗?

本文分享自华为云社区《走近设计模式:写代码肯定要用设计模式吗?》,原文作者:技术火炬手。

不少人对设计模式都有些疑难或者说是质疑:

  1. 写代码肯定要用设计模式吗?
  2. 用了设计模式的代码就比没用的好吗?

为了解答第一个问题,咱们须要去调研一下什么是设计模式,这包含理解设计模式产生的初衷、设计模式是否帮咱们解决软件问题等;而为了解答第二个问题,就须要去把握如何应用设计模式,何时何地应用何种设计模式,什么时候应该应用、什么时候须要远离。

什么是设计模式?

前段时间面试候选人的时候问过这个问题——“什么是设计模式?”。候选人答到,“设计模式有单例模式、观察者模式、代理模式 ……“。我没有打断他,还是顺着问了他对这几个模式的了解。尽管这并不是我想问的,但我猜想会这样答复的人应该不在少数。

“设计模式”或者是“Design Patterns”,无非是一种设计的模式,设计这里是指软件设计,再具体一点是“面向对象的软件设计”,而模式这个概念比拟抽象,各行各业都有模式,用文言说就是一种“套路”,是一种能够复制的教训。

提起设计模式,有一本绕不开的经典《设计模式:可复用面向对象软件的根底》,除了设计模式,还有一个副标题——可复用面向对象软件的根底,限定了复用和面向对象。书中首先是抛出了几个观点:

  1. 设计面向对象软件比拟艰难,而设计可复用的面向对象软件就更加艰难。
  2. 有教训的面向对象设计者能做出良好的设计,而老手却无从下手。
  3. 不是解决任何问题都要从头开始,外行的设计者更违心复用以前应用过的解决方案。

而后给出了一个不是很好了解的设计模式的定义:对用来在特定场景下解决个别设计问题的类和互相通信对象的形容。讲人话就是 特定问题的可复用的解决方案 。这里可复用的概念比拟含混,我更违心了解为 理论我的项目中总结进去的,解决特定问题的最佳实际。

这种最佳实际能够来自于别人总结,典型的起源是各种书籍和源码;还有一个更重要的起源便是本身软件开发教训的总结。

什么时候应用什么模式?

解决特定问题的最佳实际。显然解决问题 A 的最佳实际往往并不能解决问题 B,至多不会是解决问题 B 的最佳实际,那么我想这里至多要面临两个问题:

  1. 某种设计模式解决的是什么问题?
  2. 我的问题等于某种设计模式解决的问题吗?

失去了下面两个问题的答案后,接下来的才是设计模式如何解决我的问题。

这两个问题是以我的思路提出来的,同时我也感觉这是两个很蹩脚的问题,上面我会做阐明。

首先,我并不倡议老手间接学习如何应用各种设计模式,比方那 23 种。学习的后果往往是把握了如何用编程语言实现某种设计模式,却对该设计模式解决了什么问题没有粗浅的印象。这种先入为主会让学者感觉设计模式很简略,而后在理论的开发中为了应用模式而应用,并没有解决理论的问题。因为我是这么干的,所以感觉有更好的形式。

一个倡议是,在老手阶段,按这个步骤去学习设计模式:

  1. 多花点工夫去理解软件设计上有哪些常见的设计问题、疑难杂症
  2. 哪些问题曾经有了最佳实际的解决方案,或者说设计模式,哪些还没有
  3. 深刻领会设计模式解决该问题的过程,最好能亲自参加该过程

这个思路是先有问题后有模式,大脑中造成的思路是通过问题检索模式,而不是孤立的模式,或者是模式检索问题的回路。

到这里咱们在看一下下面两个问题,是一种拿着答案找问题的思路。理论的场景应该拿着问题找答案。咱们从新调整一下:

  1. 我要解决的问题是什么?
  2. 我的问题是否等于曾经存在的问题 A
  3. 是否有解决问题 A 的设计模式

通过学习有哪些常见的设计问题以及对应的模式,咱们也只能答复问题 3。

而问题 1 和问题 2 跟设计模式没有任何关系,却是能不能利用某种设计模式的第一步。这也是导致设计模式滥用的本源,同时也是很多人放弃设计模式的起因。

对于如何去答复这两个问题,小弟临时没法给大家解答。剖析问题的能力,可能须要工夫的积攒吧。

设计模式的牢笼

设计模式按解决特定问题的最佳实际来定义自身没有错,但往往有人陷进了设计模式的牢笼。

以 GoF 设计模式为例,尽管那 23 中设计模式是由比你我更加聪慧的程序员总结进去的,但应用它们也不是没有代价的。

  1. 设计模式不是现成的代码,它不像类库能够间接应用
  2. 设计模式大都是解决代码扩展性的问题,但这里的扩展性真的是你须要的吗,是不是适度设计
  3. 设计模式晋升扩展性的形式往往是减少形象,这就就义了简略性

这里再看一下开篇的两个问题:

问:写代码肯定要用设计模式吗?

答:不是,不是所有问题都有现成的解决方案。

问:用了设计模式的代码就比没用的好吗?

答:不是,兴许更差。

学习设计模式的益处

尽管设计模式不是银弹,把握设计模式也不肯定能帮你解决你正面临的问题,但学习一下设计模式对你的软件开发工作还是大有裨益的,就算你永远不应用它。

如果不忽悠下读者学这个还是有点用的,那写后续的系列文章意义在哪 ……

1. 应答面试中的设计模式相干问题

就很间接,如果你是被面试的,被问到的概率不低;如果你面试他人,能够用来考查下候选人的了解水平。

2. 让读源码、学框架事倍功半

优良的开源我的项目中类的个数都会比拟多,类构造、类之间的关系极其简单,经常调用来调用去。为了保障代码的扩展性,代码中会应用到很多设计模式,当然也不排除作者秀的嫌疑,然而如果你不懂设计模式,看开源代码常常摸不着作者的设计思路,看起来找不到北。

3. 为你的职场倒退做铺垫

公司外面 code review,你连几个设计模式都说不出来,一看就不是“大牛”,嗯,就是这样的。

4. 晋升你的代码设计能力

这一点要看造化,但这是客观存在的,你总会遇到须要设计简单零碎的时候,早接触早筹备。

点击关注,第一工夫理解华为云陈腐技术~

退出移动版