`
talentluke
  • 浏览: 604443 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

混合OO和Functional设计

 
阅读更多

摘自 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.”在上面吩咐,在下面索要。


分享到:
评论

相关推荐

    《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导

    第一册:《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。 第二册:《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计...

    OO设计原则 -- OO设计的 DIP依赖倒置原则

    ### OO设计原则 -- OO设计的 DIP依赖倒置原则 #### 概述 在软件工程领域,特别是面向对象设计中,依赖倒置原则(Dependency Inversion Principle, DIP)是六大设计原则之一,由著名软件架构师Robert C. Martin提出...

    OO设计原则总结

    总之,OO设计原则为软件开发者提供了一套实用的指南,帮助他们构建出更加健壮、灵活和易于维护的系统。通过理解并实践这些原则,开发者可以有效地应对软件开发过程中的常见挑战,提高软件的整体质量和性能。

    A Functional Pattern System for oo design

    具体而言,Kühne认为面向对象范式虽然增强了设计和维护大型复杂软件系统的能力,但并未能满足人们对于软件复用性和演化的高期望,因此探讨了函数式编程的高级概念如何能够被用于提升面向对象设计。 在文章的开头,...

    基于信息化教学时代背景下高职院校OO混合式教学模式设计研究.docx

    【基于信息化教学时代背景下高职院校OO混合式教学模式设计研究】 在信息化教学时代,高职院校的教学方式正在经历深刻的变革。O2O(Online to Offline)混合式教学模式,结合线上和线下教学,成为提升教学质量的有效...

    OO设计原则-里氏替换原则

    ### OO设计原则——里氏替换原则详解 #### 一、引言 面向对象设计原则(Object-Oriented Design Principles)是一套指导软件开发者如何更好地设计类、接口等面向对象元素的原则集合,旨在提高代码的可复用性、可...

    OO中对于23种设计模式的整理

    在面向对象编程(Object-Oriented Programming,OO)中,设计模式(Design Pattern)是指在软件设计中普遍存在的问题和解决方案的总结。OO 中的 23 种设计模式是指 GoF(Gang of Four)在《设计模式:可复用面向对象...

    设计模式——可复用的OO软件

    设计模式——可复用的OO软件

    学习oo好榜样(设计良品)

    【学习oo好榜样(设计良品)】 设计良好的软件代码是每个程序员追求的目标,而避免“Bad Smells”(不良代码气味)并进行重构是实现这一目标的重要手段。本篇文章将探讨两个重要的代码质量指标——重复的代码...

    23种设计模式,OO思想

    标题和描述中提到的“23种设计模式,OO思想”,是软件工程领域的一个核心概念,尤其是对于面向对象编程(Object-Oriented Programming,简称OO)的深入理解和实践至关重要。设计模式是由Erich Gamma、Richard Helm、...

    OOALV常用功能完整简例

    整体来说,OOALV的使用涉及到SAP ABAP中的一些高级编程概念,包括面向对象编程、动态程序设计、数据表的定义和查询等。在实际应用中,掌握这些知识点对于开发高效、用户友好的报表系统至关重要。OOALV的完整使用还...

    ABAP OOALV学习文档

    **ABAP OOALV**(Object-Oriented Application List Viewer)是一种用于SAP系统的高级列表显示技术,主要用于生成复杂的报表和列表视图。自R/3 4.6C版本起,其名称由“ABAP ListViewer”更改为“SAP ListViewer”。...

    OO与设计模式

    软件工程软考认证,Java与设计模式,下午必考题,24种设计模式

    实战OO的pdf自留备份

    《实战OO》是一本深入探讨面向对象(Object-Oriented, OO)编程技术的书籍,主要针对软件开发人员,特别是那些关注于软件设计流程和优化的开发者。此书的PDF版本是作者或读者为了个人学习和参考而留存的备份,包含了...

    浅谈CSS编程的OOCSS和SMACSS设计模式

    在CSS编程中,OOCSS(Object-Oriented CSS)和SMACSS(Scalable and Modular Architecture for CSS)是两种重要的设计模式,它们旨在提高CSS代码的可维护性和可扩展性。这两种模式都是为了优化CSS编写方式,降低对...

    浅谈java中OO的概念和设计原则(必看)

    浅谈java中OO的概念和设计原则 OO(面向对象)是Java语言的核心概念,深入理解OO的概念和设计原则是每个Java开发者必备的技能。下面我们将从OO的设计基础、面向对象设计模式、设计目标、设计原则五大方面来浅谈Java...

    OO设计五个原则.pdf

    《OO设计五个原则》深入探讨了面向对象设计(Object-Oriented Design,简称OO设计)中的五大核心原则,这些原则是软件工程领域公认的基石,旨在提高软件系统的稳定性、可维护性和可扩展性。本文将详细解析这五大原则...

    面向对象编程,OO设计的五大原则

    OOP的核心在于其设计理念和原则,这些原则帮助开发者构建更加灵活、可扩展、易于维护的系统。在本文中,我们将详细探讨OOP设计中的五大原则:单一职责原则(Single Responsibility Principle,简称 SRP)、开放封闭...

Global site tag (gtag.js) - Google Analytics