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

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


by 高焕堂

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

微博:@高焕堂_台北


Q-02: Scala语言的trait具有什么设计涵意?

Answer:

    大家都知道接口(Interface)的概念,也知道一个类(Class)或一个模块(Module)能实现多个接口。就像一个房间可以有多个门,或一座四合院可以有多个门口一样。如下图:

wKiom1SM0p7gRO4uAADKRTiSOPE682.jpg

将四合院的概念对应到软件上,一个软件的类可以实践多个接口,如下图:

wKioL1SM03vygOLMAABQoRJ-gwg376.jpg

    现在,先拿一个类和一个接口的设计架构来看看,如下图:

wKiom1SM0wfTSFiDAAB3es6DqvE969.jpg

在一般软件设计上,接口(Interface)意味着:它就是一个纯粹抽象类(Pure abstract class)。也就是说,它内含一个或多个抽象函数(Abstract function),而且是公用(Public)的函数。Gamma等人在其所着 Design Patterns书里主张:


 "Program to an interface, not an implementation."

(针对接口而写编程,不要针对实现。)


这意味了,通常架构师(团队)会先设计好接口,然后工程师(团队)再依循接口的定义而开发实现代码。于是,架构师团队与工程师团队,两个团队之间是相互分工合作(Collaboration)的。

wKiom1SM07fDBp1kAACtkx2mgkc079.jpg

   由于架构师团队里,也常常含有开发者(或架构师兼工程师),因而也常常会去写一些代码,来实现接口里的抽象函数,提供一些接口的默认行为(Default behavior)。此时,所设计的架构会变成为:

wKioL1SM1H7Q4pq7AACgbQqvf8Q770.jpg

    将上图里的IA接口和IA_impl类,看成一个整体,特别称之为特性(Trait),如下图:

wKiom1SM1AOC513MAACQJYBn4G4923.jpg

    以上是从架构设计的角度来思考的,若对应到Scala代码,可表示如下:

wKioL1SM1QGDAigvAABmpLyvYGc967.jpg

// trait的定义 

trait TA {

   def transact(){  //默认行为代码

   onTransact  // 调用抽象函数

   }

   def onTransact  // 抽象函数        

}    

// class的定义 

class EVAPlane extends TA {

       var manufacturer : String = ""

     var capacity : Int = 0

       var mfr_date : String = ""

       

       def pr_capacity {

            println(capacity)   

     }

       def onTransact {

           println("this is onTransact.") 

        }   

}    

// myApp

object myApp {

      def main( args: Array[String] ) {

           val p1 =  new EVAPlane

           val p2 =  new EVAPlane

           p1.transact  

           p2.transact     

}     


由于Scala代码编译(Compile)时,会转换成为JVM引擎可执行的ByeCode,其受限于JVM引擎的单继承(Single inheritance)的限制。在Scala语言里,无法实践架构师的多重接口及其默认行为的架构设计,如下:

wKiom1SM1ITxLAsHAACrUHzklZU110.jpg

    但是,却能善用Scala的Trait来实践之,如下:

wKiom1SM1TPQkAmfAACLI5AenS8168.jpg

    Scala借重JVM引擎的多重接口实现(Implement)机制,以及对象委托(Delegation)机制来实践上图的trait extends机制;而不是依赖 JVM引擎原有的class extends机制。如下图:

wKioL1SM1fiyKBBRAACv6Yisetw082.jpg

    运用了JVM引擎级别的Implement和Delegation机制来实践Scala源代码级别的trait extends机制。如下图:

wKioL1SM1kjzFhMVAACyCdZKLbg560.jpg

    这样,一方面架构师团队可以定义其接口(Interface),例如设计出下图里的IA和IB,并撰写其接口的默认行为(Default behavior)代码,如下图里的IA_impl和IB_impl类,并以Scala的trait形式表达出来。

wKiom1SM1dziAlMhAADRJ-iW_l0892.jpg

     然后,将该trait交给工程师团队去撰写EVAPlane类或其子类的实现代码。达成了架构师团队与工程师团队的美好分工合作了;也实践了 "Program to an interface, not an implementation."(针对接口而写编程,不要针对实现。)的设计原则。


高老师陪您成长...

  wKioL1XP7GXQd_ZbAAEShxXc7cA678.jpg 



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

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

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


~ end ~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 这本书绝不轻易放过每个知识点,全书包含有大量习题,要求你自己实现 Scala 标准库或者 Scalaz 中的既有功能。所以,当你读完本书,做完习题后,虽然你的应用开发能力并不会直接提升,但你会体会到构建函数式语言和框架时的难点和取舍,从而增进你的框架开发和语言设计的能力。   ——ThoughtWorks Lead Consultant 杨博   这本书所讲授的,正是基于 Scala 的函数式编程基础。基于 Scheme、Haskell 等老牌函数式语言的传统教材的问题在于,相关语言的语法和思维方式与读者现有的知识体系迥异,容易造成较为陡峭的入门门槛。此外,由于这些语言本身的实际应用机会不多,初学者也难以在实战中获得宝贵的直觉和经验。而在 Scala 的帮助下,这本书并不要求你抛开现有的思维方式另起炉灶,它所做的更像是为你现有的思维方式添砖加瓦,从而令你如虎添翼。   ——Spark committer from Databricks 连城   尽管函数式编程在近十多年用得越来越多,但市面上介绍其高阶特性的书却并不多。这本书在这方面是个重要的补充,它不仅仅面向 Scala 程序员,同样面向用任何编程语言开发的程序员,只要你充满好奇心。   ——挖财网首席架构师 王宏江   “让你洞察计算的本质。”   ——Martin Odersky, Scala的作者   “Scala和Java8开发者的函数式编程指南!”   ——William E. Wheeler, TekSystems   “本书向你展示了提升Scala技能的方法和理念,它已超过‘更好的Java’。”   ——Fernando Dobladez, Code54   “里面的练习有些挑战,很有趣,对你在真实世界中使用它很有益。”   ——Chris Nauroth, Hortonworks   “边干边学,而非只是阅读。”   ——Douglas Alan、Eli和Edythe L. Broad,哈佛和麻省理工学院
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值