Chapter 29《Modular Programming Using Objects》

  • Scala中允許你使用package將程序分為小的部分箭养,每一個(gè)小的部分叫做一個(gè)模塊徐伐,package無法表示抽象邑彪,也不能被繼承。而且在程序中只能有一種配置惯裕。
  • 隨著程序規(guī)模的增大,以模塊化的方式進(jìn)行程序組織十分重要绣硝,可以通過編譯不同的模塊來構(gòu)建系統(tǒng)蜻势,使得不同的小組互不干擾的工作,允許進(jìn)行靈活的插拔互換鹉胖,可以在不同的上下文中使用不同的系統(tǒng)配置握玛。
  • 模塊化編程的基本要求:
      1. 有一個(gè)很好地分離了接口和實(shí)現(xiàn)的模塊結(jié)構(gòu)够傍;
      1. 有方式可以替換具有相同接口的模塊,不需要改變或者重新編譯依賴該模塊的其他模塊挠铲;
      1. 有方式可以把模塊連接在一起冕屯。這種連接的任務(wù)可以被認(rèn)為是在配置該系統(tǒng)。其中一種方式是依賴注入拂苹,Java中使用的是Spring技術(shù)安聘,在Scala中將object當(dāng)做模塊使用就可以實(shí)現(xiàn)大規(guī)模的程序。
  • Scala使用對象表示模塊瓢棒,所以可以使用對象表示不同的模塊搞挣,比如數(shù)據(jù)庫模塊,應(yīng)用層模塊等音羞。程序可以按照各自的功能被分隔在不同的object中囱桨,但是目前的recipe數(shù)據(jù)庫recipe瀏覽器是硬連接,因?yàn)樵?code>recipe瀏覽器中直接提到了數(shù)據(jù)庫模塊的名稱
SimpleDatabase.allRecipes.filter(recipe => ...

這樣并不能輕易的修改SimpleDatabase而不影響到瀏覽器模塊嗅绰,瀏覽器模塊需要重新修改和編譯舍肠。當(dāng)使得模塊可插拔的時(shí)候,需要避免代碼重疊窘面,因?yàn)榭赡苡写罅康拇a在相同模塊的不同實(shí)現(xiàn)之間進(jìn)行共享翠语,解決的方式是抽象,模塊是對象财边,模塊的模板就是類肌括。

  • 模塊通常都比較大,因而不適合放在單個(gè)文件中酣难,可以使用特質(zhì)把模塊拆分為多個(gè)文件谍夭。
  • 如果在特質(zhì)A中需要使用特質(zhì)B中定義的類,可以在A中使用this來指定混入A的類必須是B憨募,如下所示:
trait SimpleRecipes { // Does not compile
    this: SimpleFoods =>
    // 可以保證在SimpleFoods中的Pear在這里可以被訪問
    object FruitSalad extends Recipe(

        "fruit salad",
        List(Apple, Pear), // Uh oh
        "Mix it all together."
    )

    def allRecipes = List(FruitSalad)
}

使用的時(shí)候紧索,如果一個(gè)實(shí)現(xiàn)類混入了SimpleRecipes,則其必須是個(gè)SimpleFoods

class Test extends SimpleRecipes with SimpleFoods
// 如果僅僅繼承了SimpleRecipes是不行的菜谣。

運(yùn)行時(shí)連接

Scala模塊可以在運(yùn)行時(shí)被連接在一起珠漂,并且還可以根據(jù)運(yùn)行時(shí)的計(jì)算決定將哪些模塊連接起來,其實(shí)也就是自主選擇接口的實(shí)現(xiàn)尾膊∠蔽#可以使用Scala代碼完成配置,提名需要使用的模塊冈敛,將其連接在一起待笑。使用父類的接口對象將模塊連接在一起可以,當(dāng)修改真正的實(shí)現(xiàn)模塊的時(shí)候莺债,相應(yīng)的依賴模塊并不需要重新編譯滋觉。

object GotApples {
def main(args: Array[String]) = {
val db: Database =
if(args(0) == "student")
StudentDatabase
else
SimpleDatabase
object browser extends Browser {
val database = db
}
val apple = SimpleDatabase.foodNamed("Apple").get
for(recipe <- browser.recipesUsing(apple))println(recipe)
}
}

有時(shí)候會遇到兩種類型是一樣的,但是編譯器不能識別齐邦。

browser.displayCategory(category: Database.Category)
browser.displayCategory(browser.database.allCategories.head) //可以
browser.displayCategory(db.allCategories.head)
GotApples2.scala:14: error: type mismatch;
found : db.FoodCategory
required: browser.database.FoodCategory
browser.displayCategory(category)

編譯器無法理解dbbrowser.database是同一個(gè)物體椎侠,就簡單的人為兩者的類型是不一致的,解決的方法是使用object措拇,必須明確的通知是使用db.type我纪,也就是下面的寫法:

val database: db.type = db
  • type指的是static type(編譯期類型),class指的是dynamic type(運(yùn)行期類型)
      1. type使用的都是.連接丐吓,new 出來的對象的type都是controllers.GotApples.Child這種形式浅悉,object的type是controllers.GotApples.Child.type這種形式。
    1. class使用的都是$連接券犁,如果是內(nèi)部類术健,是使用$連接的,如果是object粘衬,則類為Child$荞估,$同時(shí)起到連接和表示object class的作用,因此一個(gè)val或者varclasspackage是用.連接的稚新,類的嵌套關(guān)系是用$連接的勘伺,如果在object Father中有object Child,最后的類也是package.Father$Child$這樣的褂删。不會出現(xiàn)連著兩個(gè)$的情況飞醉。
    1. 最后在程序中使用內(nèi)部類,作為一個(gè)類型的時(shí)候屯阀,使用的是Outer#Inner這樣的寫法缅帘。如果表示一個(gè)object的類型,使用object.type难衰。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末股毫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子召衔,更是在濱河造成了極大的恐慌铃诬,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苍凛,死亡現(xiàn)場離奇詭異趣席,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)醇蝴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門宣肚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悠栓,你說我怎么就攤上這事霉涨“醇郏” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵笙瑟,是天一觀的道長楼镐。 經(jīng)常有香客問我,道長往枷,這世上最難降的妖魔是什么框产? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮错洁,結(jié)果婚禮上秉宿,老公的妹妹穿的比我還像新娘。我一直安慰自己屯碴,他們只是感情好描睦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著导而,像睡著了一般酌摇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗡载,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天窑多,我揣著相機(jī)與錄音,去河邊找鬼洼滚。 笑死埂息,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遥巴。 我是一名探鬼主播千康,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铲掐!你這毒婦竟也來了拾弃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摆霉,失蹤者是張志新(化名)和其女友劉穎豪椿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體携栋,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搭盾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了婉支。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸯隅。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖向挖,靈堂內(nèi)的尸體忽然破棺而出蝌以,到底是詐尸還是另有隱情炕舵,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布跟畅,位于F島的核電站咽筋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碍彭。R本人自食惡果不足惜晤硕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一悼潭、第九天 我趴在偏房一處隱蔽的房頂上張望庇忌。 院中可真熱鬧,春花似錦舰褪、人聲如沸皆疹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽略就。三九已至,卻和暖如春晃酒,著一層夾襖步出監(jiān)牢的瞬間表牢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工贝次, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崔兴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓蛔翅,卻偏偏與公主長得像敲茄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子山析,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的Q吡恰! 因?yàn)镾cala是基于Java虛擬機(jī)笋轨,也就是...
    燈火gg閱讀 3,444評論 1 24
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,324評論 0 85
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理秆剪,服務(wù)發(fā)現(xiàn),斷路器爵政,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 想有個(gè)可以讓我撒嬌的人鸟款,不用總是過成人的生活 想有張暖暖軟軟大床,陷進(jìn)去茂卦,像孩子一樣快速入睡 想有個(gè)屬于自己的家何什,...
    藍(lán)梓恩閱讀 151評論 0 0
  • 人生會遇到一些超出你理解和想象的事,郁悶不開心的同時(shí)能讓你更正視人性更了解自己等龙,不要成為那種人你要成為比那種人更厲...
    天空上面還是天空閱讀 394評論 0 0