- 浏览: 592256 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (300)
- Web前端 (27)
- Java疑难 (60)
- 面试 (59)
- 汇编语言 (1)
- 计算机组成原理 (2)
- 操作系统 (3)
- 计算机网络 (6)
- C/C++疑难 (9)
- SSH (2)
- Web开发 (15)
- 故障 (3)
- 软件开发 (16)
- Portal开发 (1)
- 后台开发 (6)
- 数据库 (35)
- 设计模式 (4)
- 数据结构与算法 (4)
- Linux (3)
- 项目管理 (10)
- 多线程 (12)
- 嵌入式 (9)
- 网络编程 (4)
- 架构设计 (20)
- 软件工具技巧 (7)
- 并行并发 (4)
- 窗口编程 (7)
- 串口编程 (0)
- Flex (2)
- 协议 (1)
- 通讯方式 (4)
- 性能分析优化 (5)
- 测试相关 (4)
- 海量数据处理 (2)
- JAVA核心技术 (10)
- SOA (3)
- 攻略规划 (1)
- 爬虫/搜索 (2)
- 正则表达式 (1)
- A Comparison Of NoSQL Database Management Systems And Models (1)
最新评论
-
charles751:
分析的很好!但有一点:只要同步组合操作就可以了,不一定非要sy ...
Vector 是线程安全的? -
S346618898:
core Java中有一段:Vector类对自己的所有可修改方 ...
Vector 是线程安全的? -
code_cj:
基本上明白了.但执行顺是否应该是/etc/profile -& ...
profile bashrc bash_profile之间的区别和联系 -
xd2008ck:
各自有各自的场景吧楼主不要太激进了
Vector 是线程安全的? -
zwt2001267:
写的不错,赞一个
Vector 是线程安全的?
摘自 http://www.jdon.com/43907
面向对象定位于系统高层次,面向函数编程是定位于低层次. 来自
Tell Above, and Ask Below - Hybridizing
OO
and Functional Design重新定义了面向对象,纠正了以往对OO
的错误观点:
Object-orientation
is better for the higher levels of a system, and functional programming
is better for the lower levels.
面向对象定位于系统高层次(更靠近人),面向函数编程是定位于低层次(更靠近机器).
文章首先各自重申定义了面向函数FP和面向对象OO
的定义:
(1)函数式编程是为了减少副作用,当没有副作用时,你就能透明引用,可以将表达式从一个地方拷贝到另外一个地方,只要给予同样输入,无论如何调用,总是给出同样的输出。这称为purity纯度。
纯度能够激活懒加载,在面向函数语言中,calling a function调用一个函数和apply a function应用一个函数意义是完全不一样的。
(2)
关于面向对象,作者引用了最初原始的对象定义:Alan
Kay认为对象是道法自然处理复杂系统的方式,使用对象方式来处理复杂软件系统,在生物学中,一个有机体中有很多神经元Cell,这些神经元之间通过化学
消息进行彼此联系,这点非常类似Smalltalk 使用消息发送message send而不是功能调用functional
call,两者不只是巧合。
对象结构的好处是它更显式强调Play,而不是Player,正如Alan Kay认为:消息比对象本身更加重要(banq注:JdonFramework基于事件
消息的特性反映了OO
本质),这在生物学也同理,你不可能通过杀死一个Cell来搞垮整个有机体,这就证明了越接近Erlang的处理模型就越是典型的面向对象系统。
早在2000年, Dave Thomas 和 Andy
Hunt写了一段设计指导,称为‘Tell, Don’t
Ask.’(只是告诉交代,别索要),当你吩咐对象应该为你做什么即可,而不是让他们带着他们数据,由你来处理这些数据,这样才会带来完美的封装。
(banq注:因为对象只要您吩咐一身,就自己内部搞定了。)
在生物学中,神经元之间化学消息是异步的,一个神经元发送消息并不会堵塞直
至接受到消息,但是,目前很多典型的面向对象系统是这样的(通常的方法调用就是这样,调用者堵塞直至被调用者的方法处理完毕),当我们调用另外一个对象的
方法,必须在那里等待直至那个对象的方法返回一个结果给我们,其实我们还有其他事情要做,对象很忙,这种同步方式调用实际侵犯了 'Tell,
Don't Ask'原则, 因为,等待返回结果是典型的‘ask’(索要结果)。
如果我们认为面向对象OO
类似生物神经元,那么目前我们大多数所谓OO
技术是错误的. 在这些编程语言如Java .NET中有类和对象,但是一旦我们实现同步方法调用,这些概念就不再是他们名字那样了,名非名了。
那么有比这些所谓OO
更加真正OO
吗?是的,IT架构中的消息系统。
前面文章提到:消息系统才是真正的OO
。下面以代码说明:
Class A{
void
m(){
}
}
Class B{
void
m1(){
...
a.m(); //同步堵塞方法
...
}
}
|
代码中,B对象中a.m()就是上文提到的同步堵塞方法,B在这里Ask索要A的m方法结果,自己的事情干不了,这是不符合类似神经元的工作原理,如果真是这样,可能是神经病的表现了。
那么,异步方法如何实现呢?Erlang或Scala的trait都能够优雅实现,而在Java中,可以使用基于Disruptor的Jdonframework 实现,具体可见:
非堵塞并发编程
以上B代码使用Jdon框架改写大概如下:
@Send ("事件名称")
a.m();
通过元注解即可完成异步方法调用。
真正OO 应该是异步消息交互的,这点在UML的顺序图中也是如此,如下图:
[该贴被banq于2012-04-23 13:16修改过]
综上所述,我们在看面向对象设计和函数编程时,他们其实是不矛盾,有并行存在的部分。
OO最适合Tell吩咐,当你吩咐时,对象封装切分其实最大化解耦实体之间的耦合,为了进一步防止耦合,你必须让你的消息异步发送。这些都是通过 tell 模型做到的.
函数编程FP最适合ask索取. 其实在纯函数编程中,如果一个函数方法不返回任何结果几乎是毫无意义的,除非是为了考虑副作用(边际影响),函数化Functional纯洁性purity将会激活懒加载,这非常类似OO
中激活异步一样。(banq注:在JdonFramnework中,可以用事件
实现消息发送,也可以实现懒加载,特别是数据库数据懒加载。)
好了,如果我们接受这些预设,那么我们如何组织我们的系统呢?
假设顶层有一个函数式层,当里面的表达式被演算后,执行消息的发送,但是这会造成系统理解上的问题,也会产生副作用,破坏函数的纯洁性。
那么有没有其他方向呢? 如果我们将对象层放在顶部,允许对象使用底部的函数片段?这好像真的没有什么问题。无副作用的函数适合内部机制,面向对象非常适合高层,能够解耦信息系统是最重要的。
现在有一个疑问,象Scala这样允许程序在任何抽象层次混合对象和函数,甚至你能够使用函数进行查询过滤对象,微软的LINQ技术也是在对象层面上建立函数层面,这些好像违背上面的预设。
无论如何,我们已经知道,真正的面向对象在现代软件架构中是存在服务或消息层面,那么在这样架构下,非常适合“tell above , ask below.”在上面吩咐,在下面索要。
发表评论
-
抽象类与接口选择
2013-12-06 00:20 846从设计理念层面看 abst ... -
深入浅出单实例Singleton设计模式
2013-09-11 00:14 715前序 单实例Singleton设计模式可能是被讨论和使用的 ... -
一些软件设计的原则
2013-09-11 00:12 684摘自http://coolshell.cn/arti ... -
API设计:用流畅接口构造内部DSL
2013-09-05 18:29 985摘自http://coolshell.cn/art ... -
性能调优攻略
2013-08-29 00:12 843转载自http://coolshell.cn/a ... -
软件级负载均衡器(LVS/HAProxy/Nginx)的特点和对比
2013-05-17 11:11 766现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升 ... -
大型网站架构演变和知识体系
2013-05-13 11:39 907源自http://www.blogjava.net/ ... -
webservice通信原理
2013-05-13 11:17 1072当前,WebService是一个热 ... -
为什么要使用EJB?
2013-04-23 10:17 482源于http://www.jdon.com/arti ... -
分布式Web服务器架构
2013-04-15 09:52 870最开始,由于某些想法 ... -
分布式架构关键技术
2013-04-15 09:51 1299分布式的概念 所谓分 ... -
海量数据处理系列(二)系统过载保护
2013-04-03 17:47 1435前言:前段时间在网上看到腾讯后台开发总监bison分享的一篇 ... -
关于领域建模时考虑用户需求的出发点的理解
2012-12-12 15:32 1128摘自http://www.jdon.com/4275 ... -
关于软件的任务到底是什么的思考
2012-12-12 10:53 881摘自http://www.jdon.com/43127 ... -
应用架构设计的三个类型
2012-12-04 11:08 854转载http://www.jdon.com/43952 ... -
DCI架构是什么?
2012-11-12 17:19 1376摘自http://www.jdon.com/37976 ... -
DDD DCI和领域事件
2012-11-12 14:40 1613摘自http://www.jdon.com/jdonframe ... -
EDA事件驱动架构 领域事件 Event Sourcing
2012-11-12 10:11 2677摘自http://www.jdon.com/eda.html ... -
不变性immutablity设计
2012-11-08 14:39 1178摘自http://www.jdon.com/4296 ...
相关推荐
第一册:《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。 第二册:《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计...
OO中对于23种设计模式的整理OO中对于23种设计模式的整理
基于信息化教学时代背景下高职院校OO混合式教学模式设计研究.docx
OO设计原则 --OO设计的LSP里氏替换原则 ,所以使用基类代码的地方,用派生类代码替换后,能够正确的执行动作处理。 ◇ 换句话说,如果派生类替换了基类后,不能够正确执行动作,那么他们的继承关系就应该废除。
A Functional Pattern System for Object-Oriented Design Thomas K¨uhne
依赖倒置原则的2个重要方针 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象 2.抽象不应该依赖于细节,细节应该依赖于抽象
关于设计模式的一些总结介绍!
设计模式——可复用的OO软件
面向对象,编程,OO设计的五大原则 OO的五大原则是指SRP、OCP、LSP、DIP、ISP。
23个设计模式标准OO结构,还有code和图
java oo 设计原则
软件工程软考认证,Java与设计模式,下午必考题,24种设计模式
好的软件设计对于软件项目的进度控制、质量提高具有关键的作用。设计文档则是记录、体现软件设计的主要方式。本文档的主要目的是为软件设计人员提供一种指南,详细描述了设计文档中应体现的设计内容,以及如何体现的...
OO设计五个原则.pdf
OO设计原则总结.doc 想回会帮助大家的
实战OO_用例建模 实战OO_用例建模 实战OO_用例建模
用OO设计 解决KEY WORD IN CONTEXT 问题
#资源达人分享计划#
总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果...
笔者认为分析模型正是OO设计的核心,而设计类只是OO的实现手段。分析模型是MVC模式的经典应用。对比分析类的名称,MVC模式,读者应该能够发现分析类在OO和商业目标中精妙的对应关系:人,事,物,规则--actor,...