Scala 選擇瘦接口還是胖接口設(shè)計?

2018-09-28 18:18 更新

選擇瘦接口還是胖接口設(shè)計?

Trait 的一種主要應(yīng)用方式是可以根據(jù)類已有的方法自動為類添加方法。也就是說,Trait 可以使得一個瘦接口變得豐滿些,把它變成胖接口。

選擇瘦接口還是胖接口的體現(xiàn)了面向?qū)ο笤O(shè)計中常會面臨的在實現(xiàn)者與接口用戶之間的權(quán)衡。胖接口有更多的方法,對于調(diào)用者來說更便捷??蛻艨梢該煲粋€完全符合他們功能需要的方法。另一方面瘦接口有較少的方法,對于實現(xiàn)者來說更簡單。然而調(diào)用瘦接口的客戶因此要寫更多的代碼。由于沒有更多可選的方法調(diào)用,他們或許不得不選一個不太完美匹配他們所需的方法并為了使用它寫一些額外的代碼。

Java 的接口常常是過瘦而非過胖。例如,從 Java 1.4 開始引入的 CharSequence 接口,是對于字串類型的類來說通用的瘦接口,它持有一個字符序列。下面是把它看作 Scala 中 Trait 的定義:

trait CharSequence { 
  def charAt(index: Int): Char 
  def length: Int 
  def subSequence(start: Int, end: Int): CharSequence 
  def toString(): String 
}

盡管類 String 成打的方法中的大多數(shù)都可以用在任何 CharSequence 上,Java 的 CharSequence 接口定義僅提供了 4 個方法。如果 CharSequence 代以包含全部 String 接口,那它將為 CharSequence 的實現(xiàn)者壓上沉重的負(fù)擔(dān)。任何實現(xiàn) Java 里的 CharSequence 接口的程序員將不得不定義一大堆方法。因為 Scala 的 Trait 可以包含具體方法,這使得創(chuàng)建胖接口大為便捷。

在 Trait 中添加具體方法使得胖瘦對陣的權(quán)衡大大傾向于胖接口。不像在 Java 里那樣,在 Scala 中添加具體方法是一次性的勞動。你只要在 Trait 中實現(xiàn)方法一次,而不再需要在每個混入 Trait 的方法中重新實現(xiàn)它。因此,與沒有 Trait 的語言相比,Scala 里的胖接口沒什么工作要做。

要使用 Trait 加強接口,只要簡單地定義一個具有少量抽象方法的 Trait——Trait 接口的瘦部分——和潛在的大量具體方法,所有的都實現(xiàn)在抽象方法之上。然后你就可以把豐滿了的 Trait 混入到類中,實現(xiàn)接口的瘦部分,并最終獲得具有全部胖接口內(nèi)容的類。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號