zoukankan      html  css  js  c++  java
  • 走近设计模式:写代码一定要用设计模式吗?

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

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

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

    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.提升你的代码设计能力

    这一点要看造化,但这是客观存在的,你总会遇到需要设计复杂系统的时候,早接触早准备。

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    MyEclipse和Microsoft Visual Studio常用快捷键
    数据源与JNDI资源实现JSP数据库连接池实例
    Tomcat配置+JSP页面模板修改UTF-8
    jquery插件
    jsp地址栏传中文显示乱码解决方法
    Java Web Project自定义错误页面,log4j记录日志。
    [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)
    测试上传图片
    js获取日期:昨天今天和明天、后天
    Axure谷歌浏览器Chrome扩展程序下载及安装方法
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/14830344.html
Copyright © 2011-2022 走看看