Scala讲座:面向对象和函数式的特点总结(1)
2015-04-20 15:54
253 查看
转载自:http://developer.51cto.com/art/200909/153910.htm
本文继续Scala讲座第七篇的最后一部分内容,总结了Scala中面向对象和函数式的特点,希望读者们通过这一系列的讲座会有所收获。
记住一句话:怎么用方便,怎么用,开始可能觉得依据java的形式进行编写,但是慢慢的就会适应函数式编程了。
这篇是Scala讲座第七篇的第五部分,通过比较命令式、面向对象式和函数式编程的例子来阐述了他们的特点。一句话,可以从两个方面来说明“面向对象式”和“函数式”。
从分治法概念上来说,可以分为两个轴上的问题,分别为模块层次上的面向对象还是函数式,以及方法层次上的命令式还是函数式。从Java语言来说在模块上是面向对象,在方法上是命令型。从Haskell语言来说模块和方法层次上都是函数式。
那么说到Scala语言,他在模块层次上既可以用面向对象又可以用函数式,在方法层次上既可以用命令又可以用函数式方法描述。例如可以在模块层次上用面向对象,在方法层次上用命令式来描述。笔者个人觉得,在模块层次上用面向对象方式则比较容易理解,在方法层次上用函数式则在很多情况下代码会变得很简单。
通过这次学习,说明了一下很可能成为函数式编程的障碍的基本思考方法。Scala有趣的地方是,它不仅可以用函数式方法来编程,用传统的面向对象和命令式方法也行的特点。应此刚开始即使没有“函数脑”也可以享受他的好处。
最后尽笔者所能写了一个将函数式和面向对象式编程方法混在一起的程序。感觉上是使用了函数式的函数,然后在上面盖上类,然后再使用多态技术。这个程序虽然没有实用性,但是可以感觉到由于有了Scala这类有趣的语言将来可能会诞生混合了“函数式”和“面向对象式”特点的创意或模式。
case class Person(val name:String, val num:Int){
def say = {
"[" + num + "] "
}
def introduceMySelf = {
"My name is " + name
}
}
case class Sekaino(override val name:String, override val num:Int) extends Person(name, num){
override def say = {
num match {case 3 => "[Sir]"
case _ => super.say
}
}
}
object Count{
def main(args:Array[String]):Unit = {
val persons = (1 until 5).map(x => factory(args(0), x))
persons.foreach(show)
}
def show(person:Person) :Unit = {
println(person.introduceMySelf)
println(person.say)
}
def factory(name:String, num:Int) = {
name match {
case "nabe" => Sekaino(name, num)
case _ => Person(name, num)
}
}
}
顺便说明一下,内容为数一下执行结果的个数,只有3才打印。
本文继续Scala讲座第七篇的最后一部分内容,总结了Scala中面向对象和函数式的特点,希望读者们通过这一系列的讲座会有所收获。
记住一句话:怎么用方便,怎么用,开始可能觉得依据java的形式进行编写,但是慢慢的就会适应函数式编程了。
这篇是Scala讲座第七篇的第五部分,通过比较命令式、面向对象式和函数式编程的例子来阐述了他们的特点。一句话,可以从两个方面来说明“面向对象式”和“函数式”。
从分治法概念上来说,可以分为两个轴上的问题,分别为模块层次上的面向对象还是函数式,以及方法层次上的命令式还是函数式。从Java语言来说在模块上是面向对象,在方法上是命令型。从Haskell语言来说模块和方法层次上都是函数式。
那么说到Scala语言,他在模块层次上既可以用面向对象又可以用函数式,在方法层次上既可以用命令又可以用函数式方法描述。例如可以在模块层次上用面向对象,在方法层次上用命令式来描述。笔者个人觉得,在模块层次上用面向对象方式则比较容易理解,在方法层次上用函数式则在很多情况下代码会变得很简单。
通过这次学习,说明了一下很可能成为函数式编程的障碍的基本思考方法。Scala有趣的地方是,它不仅可以用函数式方法来编程,用传统的面向对象和命令式方法也行的特点。应此刚开始即使没有“函数脑”也可以享受他的好处。
最后尽笔者所能写了一个将函数式和面向对象式编程方法混在一起的程序。感觉上是使用了函数式的函数,然后在上面盖上类,然后再使用多态技术。这个程序虽然没有实用性,但是可以感觉到由于有了Scala这类有趣的语言将来可能会诞生混合了“函数式”和“面向对象式”特点的创意或模式。
case class Person(val name:String, val num:Int){
def say = {
"[" + num + "] "
}
def introduceMySelf = {
"My name is " + name
}
}
case class Sekaino(override val name:String, override val num:Int) extends Person(name, num){
override def say = {
num match {case 3 => "[Sir]"
case _ => super.say
}
}
}
object Count{
def main(args:Array[String]):Unit = {
val persons = (1 until 5).map(x => factory(args(0), x))
persons.foreach(show)
}
def show(person:Person) :Unit = {
println(person.introduceMySelf)
println(person.say)
}
def factory(name:String, num:Int) = {
name match {
case "nabe" => Sekaino(name, num)
case _ => Person(name, num)
}
}
}
顺便说明一下,内容为数一下执行结果的个数,只有3才打印。
相关文章推荐
- 黑马程序员《java基础总结(三)》(面向对象特点--继承)
- 第2课 Scala面向对象彻底精通及Spark源码SparkContext,RDD阅读总结
- 黑马程序员《java基础总结(二)》(面向对象特点--封装)
- Java面向对象必会的知识点--对象的特点总结
- scala与函数式编程——面向对象模式在函数式编程下的实现
- 程序员--java面向对象特点总结
- java面向对象特点总结
- 黑马程序员《java基础总结(四)》(面向对象特点--多态)
- C++内容总结--面向对象语言特点
- javase_09(面向对象总结)
- 疯狂java讲义的笔记总结1: 语法和面向对象基础
- 黑马程序员--03.面向对象--01.静态方法调用非静态成员【个人总结】
- c++==简介及面向对象特点(1)
- 一步步学spark之一scala面向对象中包的定义与使用2.7
- c++面向对象语法总结
- 面向对象总结
- 面向对象设计模式总结
- 黑马程序员_java基础知识总结(1)面向对象基础总结
- 面向对象总结-设计思想
- 百度俱乐部(public@hustbaidu.com)面向对象讲座---封装变化的事物 by Kai.Zhang