阅读更多

6顶
4踩

编程语言

转载新闻 设计模式已经陨落了?

2014-03-11 11:47 by 副主编 WnouM 评论(40) 有18643人浏览
如果你是个程序员,在阅读下面的段落之前先写下你的答案吧。如果你现在坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你能回忆的设计模式的名字。”

设计模式是用来解决软件开发中重复出现的问题,久经考验的方法。当程序员遇到反复出现的问题时,他们通过应用合适的设计模式来解决问题。设计模式是由最聪明的电脑科学家设计出来的,历经了时间的考验,它们被认为是好的方法。使用设计模式,程序员不需要自己想方法去解决所有的编程难题,他们可以使用设计模式。设计模式节约开发时间,能开发出更灵活,可靠和健壮的软件。设计模式重用了概念的想法,解决方法的设计理念,考虑了他人的使用。它是非常棒的想法,让许多事情更合理了。

但事实是:设计模式已经(几乎)陨落了。

设计模式应用的成功的先决条件是程序员在遇到重复出现的问题时能够意识到它们的存在。但如果程序员不能意识到问题的存在,他们将不会知道已经有人解决过类似的问题了,也不会知道还有设计模式的存在。他们不是应用设计模式来解决这些普遍存在的问题,而是闭门造车,用自己的方法来解决问题。他们花了更多的时间却写出可靠性差的代码。

设计模式的陨落是因为大部分程序员不足够了解它们,要解决问题时不能意识那些重复出现的问题的存在。如果他们不能意识到问题,他们就不能用设计模式来解决问题。

在面试中我要求过几千个程序员解释设计模式背后的概念,让他们写下每个他们能够回忆起的设计模式的名字。但相当多的程序员根本就不知道什么是设计模式,或者他们的相关知识太薄弱,以致于就算碰到问题时,他们的知识也不够处理这些问题。很少的程序员可以说出他们对设计模式的理解。非常少的人知道多于四五种。更少的人可以描述出设计模式能够解决的问题。这意味着大多数程序员在日常工作中遇到一些普遍的问题时,他们会用自己的方法去解决,而不是采用很普遍的解决方法(设计模式)。

不了解设计模式的程序员们当读到用设计模式开发的代码时会感到迷惑。他们不能够理解其他程序员为什么要用这种方法来解决问题。他们面对这样一些非常普遍的问题时或者遇见设计模式的代码时,显得笨手笨脚。

设计模式也是一种通用语——一种程序员皆知的语言,可以用术语来阐述复杂的问题,便于让其他人明白。但设计模式已经陨落了;你不能用一种你不懂的语言来交流,大部分程序员都不能作为一种概念来使用它们。设计模式是一种很少人会说的通用语。

但设计模式还没有完全衰退,许多聪明的程序员仍然知道它们,使用它们。这些人是个例外。正是他们努力推广的结果,才能让MVC这个设计模式让所有程序员都熟知,就算是对设计模式知之甚少的人都熟知。

设计模式已经衰退了是因为大部分程序员没有意识到它在计算机科学中的重要性。许多雇主会考察应聘者对设计模式知识的理解。如果你是一个专业的程序员,你应该对设计模式有深入的理解。你应该记住设计模式能够处理的问题,这样你碰到它们时,你能快速识别出它们。没有理由找捷径,也不能对它只一知半解。去成为一个设计模式方面的专家吧——努力学习,成为真正的专家。我们需要更多的程序员成为设计模式方面的专家。如果有了足够的专家,可能有一天我们可以说设计模式是一个成功。

原文链接: supercoders   翻译: 伯乐在线 - 唐小娟
译文链接: http://blog.jobbole.com/21578/
来自: 伯乐在线
6
4
评论 共 40 条 请登录后发表评论
20 楼 hooluupig 2014-03-19 21:08
white_crucifix 写道
hooluupig 写道
设计模式本身的出现就说明一些OOP语言天生存在缺陷(例如不支持高阶函数,又例如花力气搞出的vistor模式其实在lisp等等这些函数式语言中不过是再自然不过的东西),用复杂的设计模式来弥补语言本身的不足。而现在随着函数式编程,多范式编程的出现和不断改进融合,为何还要搞这些东西。设计模式陨落是必然的。


拆东墙补西墙的心态不可取,呵呵

这可不是拆东墙补西墙,而是这些东西早就有了,例如lisp比c语言还老。oop语言完全走到了另一个方向(推波助澜的主要推手还是GUI应用的兴盛,OOP最鼎盛的年代简直就是宗教般的存在,是一种信仰),现在发现这条路似乎走到头了走不下去了,这才开始反思oop自身的问题,于是FP当中好的东西又重新被重视起来,就这么回事。
19 楼 white_crucifix 2014-03-19 12:30
hooluupig 写道
设计模式本身的出现就说明一些OOP语言天生存在缺陷(例如不支持高阶函数,又例如花力气搞出的vistor模式其实在lisp等等这些函数式语言中不过是再自然不过的东西),用复杂的设计模式来弥补语言本身的不足。而现在随着函数式编程,多范式编程的出现和不断改进融合,为何还要搞这些东西。设计模式陨落是必然的。


拆东墙补西墙的心态不可取,呵呵
18 楼 hooluupig 2014-03-19 08:19
设计模式本身的出现就说明一些OOP语言天生存在缺陷(例如不支持高阶函数,又例如花力气搞出的vistor模式其实在lisp等等这些函数式语言中不过是再自然不过的东西),用复杂的设计模式来弥补语言本身的不足。而现在随着函数式编程,多范式编程的出现和不断改进融合,为何还要搞这些东西。设计模式陨落是必然的。
17 楼 white_crucifix 2014-03-15 14:26
andot 写道
设计模式是一种编程定式,对于初学编程的人,过早的学习设计模式要么学起来很困难,要么学成定式思维。所以就连设计模式的作者也不推荐初学者来学习设计模式。初学变成的人最重要的是练好编程的基本功,有了10年的编程基本功,再看设计模式,才能更好的领会到设计模式的精髓,掌握了精髓,才能灵活运用,而不是生搬硬套。

至于雇主对雇员设计模式的考察已经沦为了一种应试考察,通过这种方式即使找到对各种设计模式背诵的滚瓜烂熟的雇员,恐怕找到的也是书呆子型的,只能纸上谈兵,实际项目中生搬硬套设计模式,会让项目变得复杂,复杂,更复杂。


对                           
16 楼 andot 2014-03-15 12:05
设计模式是一种编程定式,对于初学编程的人,过早的学习设计模式要么学起来很困难,要么学成定式思维。所以就连设计模式的作者也不推荐初学者来学习设计模式。初学变成的人最重要的是练好编程的基本功,有了10年的编程基本功,再看设计模式,才能更好的领会到设计模式的精髓,掌握了精髓,才能灵活运用,而不是生搬硬套。

至于雇主对雇员设计模式的考察已经沦为了一种应试考察,通过这种方式即使找到对各种设计模式背诵的滚瓜烂熟的雇员,恐怕找到的也是书呆子型的,只能纸上谈兵,实际项目中生搬硬套设计模式,会让项目变得复杂,复杂,更复杂。
15 楼 sydra 2014-03-13 13:43
说了半天,一点实质的东西都没有,只是一番鼓励人的话.也许说的很好.但也只是废话.
但是我觉得这是更多优秀程序员努力的结果,并不是所有的软件开发者都想当个好程序员,很多的开发者,他们只关心业务逻辑,而很多优秀的程序员,通过优秀的代码,让更多的开发者可以只关心业务逻辑就可以实现他们的软件.并让软件保持了创新,我觉得这是好事.就让设计模式陨落吧.
14 楼 zoozooll 2014-03-13 09:01
alvin198761 写道
不能说陨落了,只能说更高级了

非常同意这种看法。而且更加抽象,还有把集中模式的思想混在在一起的
13 楼 a123159521 2014-03-12 16:58
设计模式: 只是解决特定问题的一种通用的,经过实践考验的方法。

比如状态模式,就像蒙奇D.路飞一样,当他处于正常状态的时侯有什么特征,有什么能力,当他处于二档,三档的时候又有不同的特征和能力。但路飞还是路飞,只是处于不同的状态而已,状态是可以切换的,通过改变状态来改变其内部形态。

比如工厂模式,就像弗兰奇一样,他用可乐作为原料, 通过身体的工厂方法,把可乐转化为“风来炮“, 每次只需要补充可乐,就能无限发射”风来炮“,工厂方法你需要定义”接口“ 比如”小型风来炮“,”中型风来炮“, ”大型风来炮“ 三个具体的实现,但是接口只有一个,那就是”风来炮“。 弗兰奇可以通过三个按钮来实现三种”风来炮“的发射,而”风来炮“的发射却都是一样的。

....
12 楼 chptcleo 2014-03-12 16:05
现在的项目基本上都会使用已有的开源框架,编码流程都是固定的,所以程序员对设计模式的使用越来越少了。
11 楼 hardPass 2014-03-12 15:27
面向过程万岁!
10 楼 hyper2k 2014-03-12 15:21
一般都是粘贴赋值,只有优化的时候才考虑模式
9 楼 freezingsky 2014-03-12 13:14
太多无谓的工作进度压力 ,导致很多像麻绳头一样的代码出现。设计模式,永不落后
8 楼 white_crucifix 2014-03-12 12:49
赞同7楼,设计模式本质上是架构或封装到一定层次的自然形态。
7 楼 thinkx 2014-03-12 10:12
道上的追逐 写道
赞一个,设计模式是面向对象的终极思想,程序员用自己的方法去解决问题大多是面向过程的,必然可拓展性和移植性差, 通常把程序写成木桶结构

设计模式根本不是什么终极思想,只是实现良好软件系统的惯用法罢了。
如果一个软件系统本身有了良好的特性,里面的东西拆出来你会发现几乎都是各种模式,哪怕在开发过程中没刻意的使用模式。
为了使用模式而使用模式,则是舍本逐末,落了下乘。
6 楼 道上的追逐 2014-03-12 09:45
赞一个,设计模式是面向对象的终极思想,程序员用自己的方法去解决问题大多是面向过程的,必然可拓展性和移植性差, 通常把程序写成木桶结构
5 楼 LinApex 2014-03-11 20:52
在中国,只要能做出产品即可
4 楼 月思景 2014-03-11 18:09



      
3 楼 uuleaf 2014-03-11 16:19
[flash=200,200][flash=200,200][flash=200,200][url][url][img][img][img][img][img][list]
[*][list]
[*][*][list]
[*][*][*][list]
[*][*][*][*][list]
[*][*][*][*][*]
引用
  • [*][*][*][/list]
  • [*][*][*][/list]
    [*][*][/list]
    [*][/list]
    [/list][/img][/img][/img][/img][/img][/url][/url][/flash][/flash][/flash]
    |
    2 楼 alvin198761 2014-03-11 14:41
    不能说陨落了,只能说更高级了
    1 楼 nalan 2014-03-11 14:06
    我在很多优秀的开源软件中都看到了设计模式的影子,所以说设计模式陨落是不正确的,这是人们没有真正热爱开发程序而已。

    发表评论

    您还没有登录,请您登录后再发表评论

    相关推荐

    • 嵌入式操作系统事件调度机制设计与实现

      使用VS2010编译环境,基于C语言编写的一个事件调度机制 1) 假设有6个事件E1、E2、E3、……、E6, 2) 每个事件触发后需执行对应的任务 :Task_1,Task_2,Task_3,……,Task_6。其中,Task_i的功能是:每0.6秒打印字符串“Task_i is running\n”,连续打印的次数为i次。 3) 事件执行的优先级为E1>E2>E3>……>E6。 4) 事件触发的时间点为:事件 Ei在main函数执行后的第(7-i)秒触发。每当一个事件触发时,打印字符串“Ei is active\n”。

    • RT-LINUX测试

      1、sudo apt-get install rt-tests安装 2、运行测试程序 sudo cyclictest -t 5 -p 80 -n 注释: 运行五个线程,线程优先级为80,无限循环 -d DIST 设置线程间间隔,单位为us(默认为 500us)。当调用 cylictest 时使用了 -t 选项时并且超过一个线程被创建,那么这个间隔值被增加到线程之间。间隔(线程 N)=间隔...

    • 编译RT-tests对Linux实时性测试

      1,下载源码 git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git git checkout origin/stable/v1.0 2,交叉编译 修改Makefile中的编译器 CC = arm-linux-gnueabihf-gcc AR = arm-linux-gnueabihf-ar 执行make ...

    • 嵌入式系统Linux实时化(一)Linux实时化技术路径

      实时系统要求任务能够在规定的时间内完成响应,对于硬实时任务,错过截止时间可能会导致系统失败甚至产生严重后果。在诸如工业控制、汽车电子、航空航天等许多嵌入式应用场景中,需要系统对外部事件进行快速、确定性的响应,这就促使了 Linux 系统实时化技术的发展。

    • Linux嵌入式开发

      面向对象的体系结构使代码结构化、 可重用并且运行快速, 与其他 GUI 相比, Qt GUI 非常快, 没有分层, 成为基于 Qt 的程序的最紧凑环境,并延续了 Qt 在 X 上的强大功能, 在底层摒弃了 X lib, 仅采用 FrameBuffer 作为底层图形接口。Microwindows 提供了相对完善的图形功能和一些高级的特性。除支持 256 色的线性显存模式, 目 前, OpenGUI 也支持其他显示模式, 并且支持多种操作系统平台, 如, MS-DOS、 QNX 和 Linux, 等等。

    • 嵌入式Linux操作系统

      嵌入式Linux操作系统介绍  嵌入式Linux操作系统,是个与生俱来的网络操作系统且成熟稳定。其为开源软件且源代码开放,不存在黑箱技术,按照GPL公约任何人都可以对它进行修改添加新的功能形成自己的产品。可以对系统进行内核定制做到最小,一个带有中文系统及图形化界面的核心程序可以

    • 嵌入式Linux应用程序开发详解

      嵌入式系统通常是指一种特定用途的计算机系统,它被嵌入到各种设备中,如家用电器、汽车、医疗设备等。嵌入式 Linux 应用程序开发涉及到多个方面,包括硬件选型、系统定制、应用程序开发、调试测试等,需要开发人员具备丰富的嵌入式系统开发经验和技能。配置根文件系统,包括选择合适的文件系统类型(如 ext4、YAFFS、JFFS2 等)、挂载点等。考虑嵌入式系统的安全性,采取必要的安全措施,防止恶意攻击和数据泄露。管理系统资源,包括内存、CPU、网络等,以确保系统运行稳定。搭建开发环境,包括开发板、调试工具等。

    • 嵌入式Linux:如何进行嵌入式Linux开发?

      嵌入式Linux开发主要有四种方式:裸机开发、SDK开发、驱动开发和应用开发。

    • 嵌入式开发 Linux基础

      带你走进Linux世界: Linux环境搭建,Linux系统操作快捷键,Linux基本命令,添加共享文件夹 根目录和家目录,快捷键T N T L,路径,pwd,bcd-lsp,ls[-a],ls[-l], 文件权限划分,cd ~ / .. ,mkdir -p,rmdir -p,rm -r,cp -r,mv,利用*.name多个文件操作 共享文件夹/mnt/hgfs

    • 新手答疑 | 零基础该怎么学习嵌入式?嵌入式Linux学习路线是什么?嵌入式开发板推荐?

      嵌入式Linux开发,是软硬件结合的,这里说的硬件,不是需要初学者去画PCB板子,而是要了解硬件的一些基本结构,因为应用需要在硬件上运行,系统需要移植到硬件上,驱动得针对硬件外设去编写,所以需要对处理器ARM(微控制器MCU或者微处理器MPU或者性能更高的NPU)有一定的了解。总之,零基础学习嵌入式Linux开发并非煎水作冰,只要按照上述路线,循序渐进地学习与实践,将理论基础打扎实,大胆实践并不断拓展深入,初学者也会成长为一名合格的嵌入式Linux开发者,预祝您在嵌入式Linux学习道路上取得丰硕成果!

    • Linux——嵌入式学习——C++学习(1)

      对象——对象具有状态和行为。例如:一只狗的状态-颜色,名称,品种 或 行为-摇动,叫唤,吃.对象是类的实例。类——类可以定义为描述对象行为/状态的模板,蓝图。方法-从基本上说,一个方法表示一种行为。。一个类可以包含多个方法。可以在方法中写入逻辑以及执行的动作计时变量-每个对象都有其独特的即时变量对象的装特都是由这些即时变量的值创建的。定义一个类需要使用关键字 class,然后指定类的名称,并类的主体是包含在一对花括号中,主体包含类的成员变量和成员函数。

    • 【嵌入式操作系统(Linux篇)】知识点期末复习(2)

      1、嵌入式OS(EOS):2、嵌入式操作系统的特点3、嵌入式Linnx的优势4、Linnx是什么?是一种UNIX操作系统的克隆5、Linux操作系统整体介绍.(1)Linux os体系结构(2)Linux内核源代码目录结构(3)Linux os目录结构详解(4)LinnX系统文件类型+文件属性(5)Linux用户管理命令(6)linux常用操作命令(7)Linux软件管理命令(8)Linux下 shell编程、Vim编辑器GCC编译器GDB调试器文件IOMakefileBootLoaderLinux内核

    • 嵌入式开发之Linux学习笔记day07

      1.在opt目录下创建嵌入式目录,用于安装嵌入式框架。所有者为嵌入式部门的领导张总,所属组是嵌入式部门,张总有全部的权限,部门其他开发人员有读写的权限,其他人只有读的权限。

    • 嵌入式Linux应用开发

      嵌入式Linux应用开发

    • 用Linux开发嵌入式项目拢共分几步?

      微控制器制造商的开发板,以及他们与开发板一起提供的软件项目例程,在工程师着手一个新设计时可以提供很大帮助。但在设计项目完成其早期阶段后,进一步设计时,制造商提供的软件也可能会导致一些问题...

    • 嵌入式Linux系统的构成和启动总结

      以下内容源于网络资源的整理,如有侵权请告知删除

    • 嵌入式实时操作系统的设计与开发(一)

      轮询系统也称为简单循环控制系统,是一种最简单的嵌入式实时软件体系结构模型。在单个微处理器情况下,系统功能由多个函数(子程序)完成,每个函数负责该系统的一部分功能。这些函数被循环调用执行,它们按照一个指向顺序构成一个单向的有序环(轮循环),依次占用CPU。每个函数访问完成之后,才将CPU交给下一个函数使用。对于某个函数而言,当它提出执行请求时,必须等到它被CPU接管后才能执行。

    • 使用嵌入式 Linux 进行实时系统开发

      对于实时、决策或者低延时应用,Linux能够提供多种方案。第一种方法是和 Linux 内核一起运行一个 hypervisor或者co-kernel。这种方案中hypervisor或者co-kernel的优先级高于 Linux,实时任务则运行于其中。另外一种方式是使用非对称异构多核系统,Linux和另外一个实时内核分别运行在不同处理器内核上。最后,还可使 Linux 更具抢占性从而提高其实时性能。这

    • 自己动手设计并实现一个linux嵌入式UI框架(设计)

      看了“自己动手设计并实现一个linux嵌入式UI框架”显然没有尽兴,因为还没有看到庐山真面目,那我今天继续,先来说说,我用到了哪些知识背景。如:C语言基础知识,尤其是指针、函数指针、内存分布,linux 基础知识、如消息队列、framebuffer、多线程、多线程同步、等,数据结构、算法(如链表、队列等),window .netframework 框架设计思想,设计模式如 mvc、观...

    • 嵌入式实时操作系统设计

      嵌入式实时操作系统(RTOS)设计 摘要 本文从实时操作系统实时性的重要性出发,引出了基于优先级和时间片的实时性的实现方案:链表+位图,并在此基础上提出了一种嵌入式实时操作系统的实现方案——ATOP操作系统。关键词:嵌入式 实时操作系统 优先级调度 时间片轮询 1 前言实时操作系统(RTOS)是指能满足实时控制系统的实时性要求,可有效管理系统任务及资源的操作系统软件。实时性是指对物理过程发生的...

    Global site tag (gtag.js) - Google Analytics