scala akka 修炼之路5(scala特质应用场景分析)

时间:2023-02-02 18:51:21

    scala中特质定义:包含一些字段,行为(方法/函数/动作)和一些未实现的功能接口的集合,可以方便的实现扩展或混入到已有类或抽象类中。

     scala中特质(trait)是一个很有用的特性,在程序设计中可以 更好的抽象现实,使程序更关注各自功能和更好的将程序拆分成多个特质模块,使程序具有更强的扩展性。熟悉java的同学,可以将特质理解为抽象类,但是scala中可以在一个类中同时混入多个特质(使用extends 或with),而java中一个类只能继承一个抽象类,如果要实现多个抽象类就必需使用多继承。scala中很多基础类型功能扩展都使用了特质的特性,例如,基础类型中的布尔操作和比较接口功能扩展都是在Ordered[T]中实现,迭代功能的操作主要在TraversableOnce[+A],GenTraversableOnce[A]中实现,TraversableOnce中混入了GenTraversableOnce特质。小象认为更多使用特质可以更好的站在抽象的层面设计程序和系统框架。

    scala中使用Ordered特质实现基本类型的<,><=,>=功能

trait Ordered[A] extends Any with java.lang.Comparable[A] {
def compare(that: A): Int
def < (that: A): Boolean = (this compare that) < 0
def > (that: A): Boolean = (this compare that) > 0
def <= (that: A): Boolean = (this compare that) <= 0
def >= (that: A): Boolean = (this compare that) >= 0
def compareTo(that: A): Int = compare(that)
}

     在系统整体设计阶段,做核心结构或模块抽象时,可以把具有同类行为和属性的特征抽象出来形成一个特质,然后在类型顶层(超级抽象类)或核心或子类型中混入一个或多个需要的特质。这样做的好处在于可以按照特征对类型中主要功能进行分解和抽象,更好的任务分工,提高后期模块功能的可扩展和可维护性。这样到每一个开发者手里的都是一个特征,后期功能扩展更加高效和清晰。例如开发一个关于消费者电商购买力的一个数据数据挖掘系统,假设按照用户年龄对用户进行分类简单分类——青年,中年,老年,将衡量用户购买能力基本特征分为以下五类:时间处理特征,地点处理特征,消费处理特征,商品类型处理特征和潜在购买特征;抽象类按照计算维度定义多个钩子函数,实现评价用户购买能力指标的计算模型,特征汇聚等的实现。子类主要代表不同类型用户的平台个性信息,计算因子,权重等基本信息。通过这种设计方式可以将核心分析计算功能定义在抽象类中,实现功能的更高类聚性(专业的人做专业的事)。

scala akka 修炼之路5(scala特质应用场景分析)

如果使用java实现不管是使用多继承还是接口,想想都头大,而且不便于开发分工和后期维护,抽象类中实现的功能太多,很难理解维护。