阅读更多

6顶
4踩

编程语言

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

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

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

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

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

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

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

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

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

但设计模式还没有完全衰退,许多聪明的程序员仍然知道它们,使用它们。这些人是个例外。正是他们努力推广的结果,才能让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
    我在很多优秀的开源软件中都看到了设计模式的影子,所以说设计模式陨落是不正确的,这是人们没有真正热爱开发程序而已。

    发表评论

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

    相关推荐

    • 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应用程序开发详解

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

    • 嵌入式开发 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 开发包括选择开发板和硬件平台、选择交叉编译工具链、获取 Linux 内核源代码、配置和编译 Linux 内核、编写应用程序代码、交叉编译应用程序以适用于目标嵌入式系统、将内核映像和应用程序烧录到目标设备等步骤。以上是一个简要的嵌入式 Linux 开发步骤的概述,每个步骤都可以进一步细化和定制,以满足具体的开发需求和硬件平台的要求。最后一步是将编译好的内核映像和应用程序烧录到目标嵌入式设备中。不同的开发板和硬件平台有不同的架构和特性,因此选择合适的硬件平台对于开发工作的顺利进行非常重要。

    • 嵌入式Linux应用开发

      嵌入式Linux应用开发

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

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

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

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

    • Linux嵌入式系统开发,嵌入式Linux开发教程

      嵌入式有不少组合名词,例如嵌入式系统,嵌入式软件,Linux嵌入式,Android嵌入式,嵌入式Web,等等。通常对嵌入式的定义其实是对"嵌入式系统"的定义。 学习Linux,必须先获得一个Linux主机环境,通常情况下,可以通过以下三种方式获得Linux环境。 双系统安装 如果没有闲置的计算机,或者现有Windows系统的计算机有足够的硬盘空间,可以考虑划分一部分硬盘空间,用于安装Linux...

    • 嵌入式系统开发入门

      嵌入式系统开发 项目1-Hello world 1、创建STM32项目 2、选择型号 3、配置项目名称 4、项目初始化概览 5、根据需求,查看文档引脚说明 打开提供的:MB1296D-01.PDF,次出是控制LED灯,因此找到LED等引脚相关信息。 6、到CUB IDE配置对应的模式 分别配置PA5、PB5、PB6、PB7的模式为输出,高电平有效等。 7、保存修改 保存会提示弹出一些对话框,都选择Yes 8、创建完成 查看对应的文件结构,其中CMSIS是ARM等定义的HAL,硬件抽象层。

    • 对于linux下system()函数的深度理解(整理)

      这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不稳定?

    • 《Linux嵌入式实时应用开发实战(原书第3版)》—— 导读

      前  言使用minix的朋友们,大家好!我正在为386(486)AT系列编写一个(免费的)操作系统(这仅仅是业余爱好,不会太大,也不会像GNU那样专业)。我从4月份开始酝酿,现在快准备好了。我希望得到任何关于minix的反馈,包括你们在使用过程中喜欢和不喜欢的地方。因为我的操作系统和它多少有点类似(比如文件系统具有相同的物理布局(出于实用的原因)...

    • 嵌入式Linux操作系统

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

    • 什么是实时操作系统(RTOS)

      同时,由于实时操作系统的特性,它并不是一个应用场景广泛的系统,一些人认为学嵌入式就是学实时操作系统,这种认识其实是不正确的,现在嵌入式开发,不一定需要在实时操作系统下完成。由于关中断等原因,通常情况下,操作系统的调度器不会太精确的产生周期性的调度,比如x86早期的默认60的时钟周期(clock rate),抖动范围可能在15-17ms之间。由于应用场景的差异,会出现有些用户需要实时性的驱动,有些用户需要高性能的驱动,因此实时操作系统实际上要提供多种形式的配置以满足不同实时性需求的用户。

    • 《Linux嵌入式实时应用开发实战(原书第3版)》——1.5 开源协议

      本节书摘来自华章计算机《Linux嵌入式实时应用开发实战(原书第3版)》一书中的第1章,第1.5节,作者:(美)Doug Abbott 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.5 开源协议 多数软件终端用户协议都明确限制了你只可以使用协议范围内的功能。典型的限制条件是不允许复制或重新发布。你通常会被警告不要试图对软件进行“逆向工程”。...

    • 《Linux嵌入式实时应用开发实战(原书第3版)》——3.7 shell

      本节书摘来自华章计算机《Linux嵌入式实时应用开发实战(原书第3版)》一书中的第3章,第3.7节,作者:(美)Doug Abbott 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 3.7 shell Linux系统启动最后所做的事情之一是调用叫做shell的命令解释程序。它主要的工作是解析你在控制台输入的命令并执行相应的程序。但是shell不...

    • 【复习】第一章 嵌入式系统开发基础概述

      第一章 嵌入式系统开发基础概述 嵌入式系统定义 ​ 以应用为中心,以计算机技术为基础,软件硬件可裁剪,功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。 嵌入式系统三要素 嵌入、专用、计算机 嵌入式系统的特点(由三要素引出) 嵌入性:嵌入到对象体系中,有对象环境要求 专用性:软、硬件按对象要求裁剪 计算机:实现对象的智能化功能 嵌入式系统重要特征 系统内核小; 专...

    • Linux嵌入式开发

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

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

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

    Global site tag (gtag.js) - Google Analytics