GoF设计模式三作者15年后再谈模式
Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF设计模式发表15年以后,再谈模式,另外一位作者,也是四色原型的发明者Peter已经过世。
提问者:如今有85,000 iPhone的小应用遍布全球,使用PHP就能够写一个简单的"Hello, World! The time is X"Web网页,那么,面向对象设计是难的,这句话是否还正确呢?
Richard Helm: 软件设计总是很难的,尽管大多数现代开发环境已经降低了复杂性,通过重用库和工具(Eclipse, Apple, Microsoft), 设计一个解决业务问题的软件依然是难的。
Erich Gamma: 是的,iPhone非常有趣. The iPhone SDK 是基于NeXTStep面向对象框架 object-oriented frameworks,如AppKit. 但我们15年前写GoF设计模式时就已经存在,也是驱动力之一.我们实际上已经在书中提到框架的几个模式: Adapter, Bridge, Proxy, and Chain of Responsibility.
提问者:是否可以表明好设计能够延长软件生命,它能够在不同技术形态中延续生存呢?
Ralph Johnson: 今天有时写一行代码也许就可以,软件经过多年已经提高很多,许多系统过去需要仔细的设计,今天已经能够被重用,但是还是还有一些系统写100K代码并不比15年前容易。它能实现更多功能,但是耗费也是同样的。
软件设计是难的,这正使它变得有趣,善于软件设计的人会从解决难问题中得到乐趣:将混乱变得秩序,克服困难。过去是难的事情现在变得容易,但是我们今天面临的问题是15年前不可能面临的,OO编程有帮助,但是不能消除设计的困难。
提问:关于重用,在90年代作为OO的主要好处,但是过去几年,很多程序员离开重用,开始使用框架,对于重用的观点变得:你不可能需要它, 那么是否重用还是今天开发这的主要目标呢?
Richard: 我认为在复杂层次有一个进化,重用软件已经演变成在系统语言层次,以框架和工具形式出现,大部分工作留给框架设计专家来实现。
....
Erich: 实际上,我补充的是,最难的是可重用面向对象软件的演进使用,比如 factories, adapters 和facades模式能够改变和演进一个可重用的库.。
.....
Ralph: 大多数程序员都不是被聘请为编写一个可重用的软件,但是你必须知道一个可重用的软件是如何工作的,我们的模式是重用软件的通用方式,如今他们还是有用的。
Erich: 我同意,但我学习iPhone SDK时,我注意到这些库非常熟悉,因为他们是我熟悉的模式。
提问者: 曾经有一段时间,每件事都是模式,有模式架构,组织行为,分析等等,如今是否有23种模式的拓展,比如架构模式,是否有新的设计模式关系图?
Ralph: 如果你的意思是我们是否有,回答是没有,如果你意思是是否有人做了新图,回答是有。
....
提问者:在模式热潮中,有一种反模式anti-patterns,你们是怎么看的。反模式是模式吗?
Richard: 有可能,他们提供了一种方法,分享他们犯过的错误。
Ralph: 我愿意使用这样概念"代码味道code smells," or "设计味道design smells"/"架构味道architecture smells"等等,他们并不总是错误. 有时他们实际就是你必须面临的问题, 比如"stove pipe"系统出现,部分是因为公司软件之间并没有一个好的互联通讯方式。 部分因为技术变化太快,部分因为公司之间不同架构,z增长快的公司收购了其他公司也造成,所以,并不是架构领导力的强度能够消除这个问题的
我的一些学生写了一个模式叫大泥球"Big Ball of Mud." 大部分知道这个模式的人知道它是一个反模式,但是一些IT组织的人,至少我看到过的,并不做得更好。
...
提问者:如今一些听到一些面向functional或dynamic语言者宣称他们的语言不需要模式,你们如何反应?
Erich: 需要注意的是,但我们写设计模式时,还没有Java和C#
Ralph: 这些语言不需要模式,是因为这些语言提供了一种解决问题的方式,我们的模式是对于语言C++ 和 Smalltalk,包括今天的大部分叫OO的语言, 当然不适合所有语言,我并不认为使用其他语言就不需要模式,只不过他们使用另外一种其实等同于模式的概念。
Erich: 设计模式最终融入任何语言. 尽管这些经验并不总是表达为模式,但是他们存在,Erlang的设计原理就是这样。
提问者:: 有关于dynamic 和面向功能functional语言的模式吗?
Ralph: 如果动态语言如Smalltalk, Ruby or Python, 那么我们的模式依然有效,. Functional性语言需要不同的模式,但是目前我不知道有谁发布。
提问者: OOP 提供一个静态和动态结构的结合,允许设计意图能在在不同流程中传达,今天强调面向功能和元编程, 有"domain-specific language" 或 "fluid interface流体接口" 这些概念和模式有什么区别和联系?
Richard: 是一种补充. 使用好设计的丰富的类图结构,可以获得DSL的特性和功能,库构成DSL的名词和动词。
Erich: 有的是补充设计模式,元编程能够替代设计模式, 例如JUnit 3 到JUnit 4演变是一个例子, JUnit 3 是一个使用Composite, Template Method 和Command等模式小框架. JUnit 4 导入Annotations meta-programming . 以前的模式使用就消失了,演变成一系列小的元注解。
....
其他不是非常重要的可见原文:Erich Gamma, Richard Helm, and Ralph Johnson talk to Larry O'Brien about Design Patterns, 15 years later.
GoF设计模式三作者15年后再谈模式的更多相关文章
- 8.4 GOF设计模式三: 外观模式 Facade
GOF设计模式三: 外观模式 Facade “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...
- Java虚拟机15:再谈四种引用状态
JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分 ...
- C++ Primer第四版 15.9 再谈文本查询 程序实现
编程过程中发现书本中的示例程序并不完全,某些地方存在错误,现已改正并添加少许注释.. 1 #include<iostream> 2 #include<fstream> #inc ...
- 002-创建型-00-简单工厂【非23种GOF设计模式】
一.概述 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实 ...
- 漫谈 GOF 设计模式在 Spring 框架中的实现
原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 漫谈 GOF 设计模式在 Spring ...
- 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器
目录(?)[-] Transaction的一些操作 再谈FragmentManager 调用其他fragment的方法 唤起activity 唤起fragment和相互通信 一些其它 Transact ...
- [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例
[转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15 | 0 Comments | 阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...
- Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章
原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
随机推荐
- 使用coding云作为git远程库
1.在命令行中创建GIT仓库 mkdir DriveAssistant cd DriveAssistant git init echo "# DriveAssistant" > ...
- normalize.css阅读笔记
最近在被各种浏览器的CSS兼容折磨,所以看了看normalize的源代码来了解一些常见的浏览器间不一致的CSS渲染问题…… 源代码在这里 text-size-adjust 用法参见Apple的文档和M ...
- day1 作业编写登录窗口
作业一:编写登录接口 (1)输入用户名和密码: (2)认证成功后显示欢迎信息: (3)输错三次后锁定. 思路:我们知道,要想让程序记住之前输入多少次,锁定用户,那么可以使用数据库来保存用户的状态,然而 ...
- 用strtok函数分割字符串
用strtok函数分割字符串 需要在loadrunner里面获得“15”(下面红色高亮的部分),并做成关联参数. //Body response 内容: <BODY><; PRE&g ...
- 搭建 GIT 服务器
Git 是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 此实验以 CentOS 7.2 x64 的系统为环境,搭建 git 服务器. 安装依赖库和编译工具 为了后续安装能 ...
- 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]
洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...
- Python并发编程-多进程socketserver简易版
普通版的socketserver #server.py import socket sk = socket.socket() sk.bind(('127.0.0.1',8080))#建立连接 sk.l ...
- Python序列化模块-Pickel写入和读取文件
利用pickle 存储和读取文件 1.存储文件: #引入所需包,将列表元素存入data2的文件里面 import pickle mylist2 ={'1','nihao','之后','我们',1,2, ...
- Linux中磁盘还有空间,但创建文件时提示空间不足
首先需要知道创建文件时,需要满足两个条件:1.磁盘上还有空间:2.inode号还有剩余. 这两个条件可以分别使用"df -h"以及"df -i"查看使用情况 [ ...
- Maven的安装及修改为阿里云下载依赖
使用JAVA工程管理越来越多的jar包,担心导错了,多导了,漏导了怎么办? 换一个IDE项目后项目会不会出一堆BUG,看的头皮发麻? 自己写的代码放在别人的机器上运行会不会出问题? Maven的强大毋 ...