大数据Scala编程.问题集(01)


高老师陪您成长...

  大数据Scala编程问题集(01) 



by 焕堂

洞庭国际智能硬件检测基地 中云大数据中心(IDC) 首席架构师

微博:@高焕堂_台北



Q-01: 如何使用ScalaSingleton机制来表达Class-level的数据。

Answer:

    在面向对象编程(OOP,Object-Oriented Programming)概念里,属性(Attribute)和函数(Function)都分为两个不同级别(Level)。例如,厦门的科技谷(厦门)公司的大数据平台上,含有各航空公司的飞机数据,包括:东方航空(CEA,ChinaEasternAirlines)、南方航空(CSA, ChinaSouthernAirlines)、长荣航空(EVA, EvergreenAirlines)等公司的飞机数据。

大数据Scala编程问题集(01)

    于是,Scala程序员的脑海里,想到长荣航空公司有许多架飞机在天空上飞,或者在机场停机平等待客人等。

大数据Scala编程问题集(01)

    每一架飞机都是一个实例(Instance)。人类天赋就有抽象的能力,于是从实例中抽象出概念(Concept):长荣航空飞机(EVAPlane)。

大数据Scala编程问题集(01)

    Scala程序员将上述领域(或业务)概念,对应到软件代码的类(Class),得到一个EVAPlane类:

大数据Scala编程问题集(01)

    兹以UML图形表示这个类:

大数据Scala编程问题集(01)

一谈到类(Class),就会联想到有两种对象:

1) 类对象(Class object)<长荣航空飞机>(概念)可以对应到一个对象,它又称为妈妈对象(Meta object),可担任创建实例(小孩)对象(Instance object)的任务。

2) 实例对象(Instance object)每一架长荣飞机都是一个实例,各对应到一个对象,这是大家熟悉的对象了。


在软件执行时,会创建上述的两种对象,每一个对象都需要占用一块内存(Memory)空间。

大数据Scala编程问题集(01)

    为了让计算机在执行时,能创建上述这两种对象,程序员就必须撰写Scala代码来指示计算机。其代码结构如下:

大数据Scala编程问题集(01)

于是可看出来,无论属性或函数都分为两个级别:

Instance-level(实例级别或称对象级别)这是一般大家都知道的,例如每一架飞机都是一个实例或对象,各自都有它的厂牌、载客量、年龄等属性数据。这些数据值都储存于(内存的)实例对象里。

l Class-level(类级别)例如,<长荣航空飞机>类的目前实例总数,是重要的属性数据值,它不属于某一架飞机(实例)的属性数据,而是属于整个<长荣航空飞机>类的属性数据。这相当于在问:EVAPlane类目前在内存里共创建了多少个实例对象呢?像这种数据,必须储存于上图的类对象里,这称为Class-level的属性数据。


    既然有了Class-level的属性,为了存取(Access)这种属性的数据值(Value),当然我们就会定义某些函数来存取或处理之。这种函数,就称为Class-level的函数或方法了。


// Instance-level 属性和函数的定义 

class EVA Plane{

       var manufacturer : String = ""

    var capacity : Int = 0

       var mfr_date : String = ""

       

       def pr_capacity {

            println(capacity)   

     }

       EVA Plane.inrc_amt

}    

// Class-level 属性和函数的定义 

object EVAPlane {

       var instance_amount : Int = 0

       def apply() = new EVAPlane 

       def incr_amt {

           instance_amount = instance_amount + 1    

     }

       def pr_amt {

             println(instance_amount)    

     }

}    

// myApp

    object myApp {

         def main( args: Array[String] ) {

              val a1 = EVA()

              val a2 = EVA()

              val a3 = EVA()

              EVA.pr_amt

}     

    其中的capacity是Instance-level属性,pr_capacity是Instance-level函数。而instance_amt是Class-level属性,而pr_amt是Class-level函数。在执行这个程序时,首先载入(Load)代码到内存(Memory),让JVM来执行之。

    当执行到指令: val a1 = EVAPlane(),此时先执行等号(=)右边的EVAPlane(),就载入(Load)上数代码,立即拿object EVAPlane定义(做为模板)来创建一个类对象。

大数据Scala编程问题集(01)

也就是说,EVAPlane类本身就是一个对象,所以就创建一个VEAPlane类对象,来储存EVAPlane类有关的属性(数据)值。例如,定义一个instance_amt属性来纪录目前EVAPlane类共创建了多少个实例对象。接着执行到apply()函数里的指令:new EVAPlane,就拿class EVAPlane定义(做为模板)来创建一个实例对象,用来储存一架长荣飞机的属性值。

    大数据Scala编程问题集(01)

同时执行class EVAPlane的构造式(Constructor)来设定实例对象的初值,并且将其类对象的instance_amt值加1,表示增加了一个实例对象。

    大数据Scala编程问题集(01)

    继续执行到:

     val a2 = EVA()

        val a3 = EVA()


就多创建了2EVAPlane的实例对象,并更新了EVAPlane对象里的instance_amt值。

    大数据Scala编程问题集(01)

    此时,在内存里共有4个对象,包括1个EVAPlane类对象,以及3个EVAPlane实例对象(上图里的a1, a2和a3)。以上,藉由长荣航空的例子,说明Scala语言如何表达Instance-level属性和函数,以及表达Class-level属性和函数。


請繼續學習:高老師的相關視頻

相关文章:大数据Scala编程问题集(02)

相关文章:大数据Scala编程问题集(03)



~ end ~