`
mwei
  • 浏览: 123965 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

Scala:使用Curry实现AOP

阅读更多
业余时间学了学Scala,至今有3个多月了...这两天看到群(54813143)里有同学讨论AOP,于是就想出了如下实现;
见代码及注释,欢迎喜欢Scala的同学一起讨论:
//trait里没有任何抽象的值或方法
trait AOP{
	private var targets=List[Function1[String,Any]]() //List里放的都是函数对象
	private val placeholder="" //无意义,用来调用函数对象的

	def before=println("before...")
	def after=println("after...")
	def invoke(target:Function1[String,Any])={ //参数是个函数对象
		before
		target(placeholder) //什么时候调用,自己放置顺序
		after
	}
	def add(t:Function1[String,Any])= targets=t::targets  //收集所有被拦截的方法(函数对象)
	def invokeAll()={
		before
		targets.reverse.foreach(t=>t(placeholder)) //reverse:保证调用的顺序(FIFO)
		after
		//这里需要一个清空targets的方法,就不写了
	}
}

class Write extends AOP{
	def writeOne(x:String,y:String)(placeholder:String)={ //curry化,最后一个placeholder算是冗余参数
		println("one working..."+x+y)
	}
	def writeTwo(x:String,y:String,z:String)(placeholder:String)={
		println("two working..."+x+y+z)
	}
}

val w=new Write()
w.invoke(w.writeOne("hello"," world")_) //拦截的方式,使用了偏应用函数

w.add(w.writeOne("hello"," world")_) //收集
w.add(w.writeTwo("hello"," world"," more")_) //再收集
w.invokeAll //统一拦截

这里只是给喜欢Scala的同学一个思路,期望在此思路上进行扩展。
是不是很优雅? 还在等什么,快快加入到Scala的学习队伍中来吧。
分享到:
评论
4 楼 mwei 2011-03-19  
mefan 写道

不过这里主要展示的还是trait,curry好像没怎么用到,是否标题有误


偏应用函数的实现得益于curry化
3 楼 mefan 2011-02-01  
sirxenofex 写道
Scala作为函数式语言,根本用不着什么通用AOP把,随手一个Curry函数,就实现了

刚入javaeye就又见到placeholder你的aop了,呵呵
不过这里主要展示的还是trait,curry好像没怎么用到,是否标题有误

同样的,sirxenofex为什么会认为不需要切面aop呢


希望神样的scala在中国的推广越来越好!!!
2 楼 sirxenofex 2011-02-01  
Scala作为函数式语言,根本用不着什么通用AOP把,随手一个Curry函数,就实现了
1 楼 liusong1111 2011-01-30  
使用trait实现AOP的一般思路是利用它的stackable modification特性。我平时接触的AOP多在一个实现上进行若干次切面,楼主这个正好相反,倾向于基于多个实现的顺序调用,对应固定的两个切面(一个before一个after),这样就更象使用了偏函数的observer模式,没有更详细的场景不好更深入讨论下去。
如果按常规AOP套路考虑,我觉得重点是切面(before/after)的灵活性,比如,可以绑多个before/after方法,其签名与主实现一致,同时考虑before里可以控制是否把控制转向下一个,after里可以拿到主实现的返回值等等。这个在scala里由于有更强大的类型系统和偏函数等概念,会更有意思,我也没想清楚,请大家继续讨论。

相关推荐

    CrossCuttingConcern_Scala:在 Scala 中使用面向切面编程 (AOP) 实现横切关注

    在 Scala 中使用 Aspects4s 实现AOP通常包括以下步骤: 1. **定义切点(Joinpoint)**:确定需要插入切面的代码位置,这可能是一个方法调用、类初始化等。切点通过正则表达式或自定义条件来指定。 ```scala import...

    glicko2-scala:Scala中实现的Glicko2排名系统

    总结来说,`glicko2-scala`项目为Scala开发者提供了一种实现Glicko2评级系统的解决方案,结合了Glicko2的精妙算法和Scala的编程优势,适用于各种竞技游戏环境。通过理解和应用该项目,开发者能够更好地理解和管理...

    Scala:Applied Machine Learning

    Scala:Applied Machine Learning by Pascal Bugnion English | 23 Feb. 2017 | ISBN-13: 9781787126640 | 1843 Pages | EPUB/PDF (conv) | 33.15 MB Leverage the power of Scala and master the art of building, ...

    Scala: Guide for Data Science Professionals

    "Scala: Guide for Data Science Professionals (Learning Path)" ASIN: B06XCJVY21, eISBN: 1787282856 | 2017 | True PDF | 1100 pages | 15 MB Scala will be a valuable tool to have on hand during your data...

    Scala:jenrey-adv-master.zip

    在广告流量实时统计中,Scala常常与Apache Spark结合使用。Spark提供了一套分布式计算框架,能够高效地处理大规模数据流。它支持Scala API,使开发者能够快速构建高性能的数据处理应用程序。 3. **Apache Spark** ...

    scala:scala代码

    在"scala: scala代码"的描述中,我们可以推测这是一个关于Scala编程语言的学习资源或者项目源代码。 1. **面向对象编程**:Scala是基于Java虚拟机(JVM)的语言,因此它兼容Java的所有类库。它支持类、对象和继承等...

    Spark技术实战之基础篇 -Scala语言从入门到精通 Scala编程详解 含课件和资料 共21个章节.rar

    【课程大纲】第1讲-Spark的前世今生第2讲-课程介绍、特色与价值第3讲-Scala编程:基础语法第4讲-Scala编程:条件控制与循环第5讲-Scala编程:函数入门第6讲-Scala编程:函数入门之默认参数和带名参数第7讲-Scala编程...

    chess-game-scala:用Scala编程语言简单实现象棋游戏

    "chess-game-scala" 这个标题明确指出了我们要讨论的是一个使用Scala编程语言实现的象棋游戏项目。"scala" 是关键标签,表明这个项目是用Scala这一现代、函数式编程语言编写的。通过标题我们可以预见到,这个项目将...

    Programming.Scala_Tackle.Multi-Core.Complexity.on.the.Java.Virtual.Machine[2009][EN][PDF]

    Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine by Venkat Subramaniam Scala is an exciting, modern, multi-paradigm language for the JVM. You can use it to write ...

    Scala:在Scala中实现的所有算法

    用Scala编程语言实现各种算法 如何使用此存储库进行学习? 在本地计算机上克隆存储库 git clone https://github.com/TheAlgorithms/Scala.git 使用IDE(最好是IntelliJ)打开存储库 启用自动导入以从build.sbt...

    ddd-on-scala:Scala的DDD示例实现

    《ddd-on-scala:Scala中的领域驱动设计实践》 领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,旨在通过深入理解和表达业务领域,来构建复杂的软件系统。在Scala这一强大的函数式编程语言中,...

    matlab有些代码不运行-plotly-scala:Scally的plotly.js绑定

    将org.plotly-scala::plotly-almond:0.8.1依赖项添加到笔记本中。 (最新版本:)然后初始化plotly-scala,并像使用它一样使用它 import $ivy . `org.plotly-scala::plotly-almond:0.8.1` import plotly . _ import

    testcontainers-scala:用于在Scala中进行测试的Docker容器

    Testcontainers-scala 用于Scala包装器,允许使用容器进行功能/... 行动中的Testcontainers-scala: ://dimafeng.com/2016/08/01/testcontainers-selenium/松弛设置对于scalatest用户: libraryDependencies + = " ...

    design-patterns-scala:用Scala语言实现设计模式

    7. **代理模式**:Scala可以通过实现相同接口的匿名类或者使用特质来创建代理对象,实现代理模式,提供额外的功能或控制。 8. **策略模式**:在Scala中,策略模式通常通过定义一系列算法策略的特质,然后在运行时...

    hello-grpc-scala:使用ScalaPB的gRPC简介

    gRPC支持多种编程语言,包括Java、Go、Python等,而在这个场景中,我们将关注如何使用Scala和ScalaPB来构建gRPC服务。 **一、gRPC与ScalaPB** 1. **gRPC**:gRPC的核心概念是定义服务和消息类型,这些定义被存储在...

    ember-cli-scala:将使用 Scala.js 编译成 JavaScript 的 Scala 文件导入您的 Ember 应用程序

    将使用编译为 JavaScript 的文件导入您的应用程序。 安装 ember install:addon ember-cli-scala 用法 app/scala/Robot.scala : package robot import scala . scalajs . js import js . annotation . JSExport @...

    curryhoward:通过Curry-Howard同构为Scala函数和表达式自动生成代码

    在这个项目中,可能使用了Scala宏来扩展语言,实现从逻辑表达式到Scala代码的转换。 "curryhoward"项目中的文件"curryhoward-master"很可能是项目源代码的主分支或主版本,包含了项目的完整结构和实现。这个文件...

    vertx-lang-scala:Scala的Vert.x

    vertx-lang-scalaCI结构vertx-lang-scala:包含实际语言实现的主模块vertx-lang-scala-stack:所有当前可用的模块vertx-lang-scala-on-the-fly:一种编译器实现,允许从源/类路径编译Scala代码。

    c-scala:C 作为 Scala 中的嵌入式语言

    C.scala:C 的浅层 DSL 该项目为核心 C 语言定义了一个 Scala 库和一些有用的 C 库。 它还提供了 Scala 集合的实现,例如 C DSL 中的 HashMap 或 List。 安装 浅层 C 定义伴随着使用 JNI 的实现。 sbt compile将...

Global site tag (gtag.js) - Google Analytics