- 浏览: 604443 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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 910从设计理念层面看 abst ... -
深入浅出单实例Singleton设计模式
2013-09-11 00:14 757前序 单实例Singleton设计模式可能是被讨论和使用的 ... -
一些软件设计的原则
2013-09-11 00:12 717摘自http://coolshell.cn/arti ... -
API设计:用流畅接口构造内部DSL
2013-09-05 18:29 1026摘自http://coolshell.cn/art ... -
性能调优攻略
2013-08-29 00:12 886转载自http://coolshell.cn/a ... -
软件级负载均衡器(LVS/HAProxy/Nginx)的特点和对比
2013-05-17 11:11 798现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升 ... -
大型网站架构演变和知识体系
2013-05-13 11:39 962源自http://www.blogjava.net/ ... -
webservice通信原理
2013-05-13 11:17 1103当前,WebService是一个热 ... -
为什么要使用EJB?
2013-04-23 10:17 521源于http://www.jdon.com/arti ... -
分布式Web服务器架构
2013-04-15 09:52 904最开始,由于某些想法 ... -
分布式架构关键技术
2013-04-15 09:51 1346分布式的概念 所谓分 ... -
海量数据处理系列(二)系统过载保护
2013-04-03 17:47 1478前言:前段时间在网上看到腾讯后台开发总监bison分享的一篇 ... -
关于领域建模时考虑用户需求的出发点的理解
2012-12-12 15:32 1169摘自http://www.jdon.com/4275 ... -
关于软件的任务到底是什么的思考
2012-12-12 10:53 919摘自http://www.jdon.com/43127 ... -
应用架构设计的三个类型
2012-12-04 11:08 901转载http://www.jdon.com/43952 ... -
DCI架构是什么?
2012-11-12 17:19 1417摘自http://www.jdon.com/37976 ... -
DDD DCI和领域事件
2012-11-12 14:40 1694摘自http://www.jdon.com/jdonframe ... -
EDA事件驱动架构 领域事件 Event Sourcing
2012-11-12 10:11 2720摘自http://www.jdon.com/eda.html ... -
不变性immutablity设计
2012-11-08 14:39 1215摘自http://www.jdon.com/4296 ...
相关推荐
第一册:《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。 第二册:《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计...
### OO设计原则 -- OO设计的 DIP依赖倒置原则 #### 概述 在软件工程领域,特别是面向对象设计中,依赖倒置原则(Dependency Inversion Principle, DIP)是六大设计原则之一,由著名软件架构师Robert C. Martin提出...
总之,OO设计原则为软件开发者提供了一套实用的指南,帮助他们构建出更加健壮、灵活和易于维护的系统。通过理解并实践这些原则,开发者可以有效地应对软件开发过程中的常见挑战,提高软件的整体质量和性能。
具体而言,Kühne认为面向对象范式虽然增强了设计和维护大型复杂软件系统的能力,但并未能满足人们对于软件复用性和演化的高期望,因此探讨了函数式编程的高级概念如何能够被用于提升面向对象设计。 在文章的开头,...
【基于信息化教学时代背景下高职院校OO混合式教学模式设计研究】 在信息化教学时代,高职院校的教学方式正在经历深刻的变革。O2O(Online to Offline)混合式教学模式,结合线上和线下教学,成为提升教学质量的有效...
### OO设计原则——里氏替换原则详解 #### 一、引言 面向对象设计原则(Object-Oriented Design Principles)是一套指导软件开发者如何更好地设计类、接口等面向对象元素的原则集合,旨在提高代码的可复用性、可...
在面向对象编程(Object-Oriented Programming,OO)中,设计模式(Design Pattern)是指在软件设计中普遍存在的问题和解决方案的总结。OO 中的 23 种设计模式是指 GoF(Gang of Four)在《设计模式:可复用面向对象...
设计模式——可复用的OO软件
【学习oo好榜样(设计良品)】 设计良好的软件代码是每个程序员追求的目标,而避免“Bad Smells”(不良代码气味)并进行重构是实现这一目标的重要手段。本篇文章将探讨两个重要的代码质量指标——重复的代码...
标题和描述中提到的“23种设计模式,OO思想”,是软件工程领域的一个核心概念,尤其是对于面向对象编程(Object-Oriented Programming,简称OO)的深入理解和实践至关重要。设计模式是由Erich Gamma、Richard Helm、...
整体来说,OOALV的使用涉及到SAP ABAP中的一些高级编程概念,包括面向对象编程、动态程序设计、数据表的定义和查询等。在实际应用中,掌握这些知识点对于开发高效、用户友好的报表系统至关重要。OOALV的完整使用还...
**ABAP OOALV**(Object-Oriented Application List Viewer)是一种用于SAP系统的高级列表显示技术,主要用于生成复杂的报表和列表视图。自R/3 4.6C版本起,其名称由“ABAP ListViewer”更改为“SAP ListViewer”。...
软件工程软考认证,Java与设计模式,下午必考题,24种设计模式
《实战OO》是一本深入探讨面向对象(Object-Oriented, OO)编程技术的书籍,主要针对软件开发人员,特别是那些关注于软件设计流程和优化的开发者。此书的PDF版本是作者或读者为了个人学习和参考而留存的备份,包含了...
在CSS编程中,OOCSS(Object-Oriented CSS)和SMACSS(Scalable and Modular Architecture for CSS)是两种重要的设计模式,它们旨在提高CSS代码的可维护性和可扩展性。这两种模式都是为了优化CSS编写方式,降低对...
浅谈java中OO的概念和设计原则 OO(面向对象)是Java语言的核心概念,深入理解OO的概念和设计原则是每个Java开发者必备的技能。下面我们将从OO的设计基础、面向对象设计模式、设计目标、设计原则五大方面来浅谈Java...
《OO设计五个原则》深入探讨了面向对象设计(Object-Oriented Design,简称OO设计)中的五大核心原则,这些原则是软件工程领域公认的基石,旨在提高软件系统的稳定性、可维护性和可扩展性。本文将详细解析这五大原则...
OOP的核心在于其设计理念和原则,这些原则帮助开发者构建更加灵活、可扩展、易于维护的系统。在本文中,我们将详细探讨OOP设计中的五大原则:单一职责原则(Single Responsibility Principle,简称 SRP)、开放封闭...