<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    好好生活,努力工作,天天向上!

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

       如果你是一名Java程序員,并且關(guān)注這編程語(yǔ)言方面的發(fā)展,比如經(jīng)常去TIOBE網(wǎng)站了解編程語(yǔ)言流行度排行,那么你應(yīng)該聽(tīng)說(shuō)過(guò)Scala,如果你還沒(méi)有開(kāi)始學(xué)習(xí)Scala,或者打算下個(gè)禮拜開(kāi)始學(xué)的話(huà),請(qǐng)先看看下面這篇文章,看看能不能改變你的想法。下面的內(nèi)容為Programming In Scala 這本書(shū)的節(jié)選,到目前為止,國(guó)內(nèi)好像還沒(méi)引進(jìn),你可以從亞馬遜上面購(gòu)買(mǎi)http://booksites.artima.com/programming_in_scala (有國(guó)內(nèi)的朋友翻譯了其中的前11章,真是非常感謝) 

       Scala是為你準(zhǔn)備的嗎?你必須自己看明白并做決定。除了伸展性之外,我們發(fā)現(xiàn)喜歡用Scala編程實(shí)際上還有很多理由。最重要的四個(gè)將在本節(jié)討論的方面該是:兼容性,簡(jiǎn)短,高層級(jí)抽象和高級(jí)的靜態(tài)類(lèi)別。

     Scala是兼容的

       Scala不需要你從Java平臺(tái)后退兩步然后跳到Java語(yǔ)言前面去。它允許你在現(xiàn)存代碼中加點(diǎn)兒東西——在你已有的東西上建設(shè)——因?yàn)樗辉O(shè)計(jì)成無(wú)縫地與Java實(shí)施互操作。Scala程序會(huì)被編譯為JVM的字節(jié)碼。它們的執(zhí)行期性能通常與Java程序一致。Scala代碼可以調(diào)用Java方法,訪問(wèn)Java字段,繼承自Java類(lèi)和實(shí)現(xiàn)Java接口。這些都不需要特別的語(yǔ)法,顯式接口描述,或粘接代碼。實(shí)際上,幾乎所有Scala代碼都極度依賴(lài)于Java庫(kù),而經(jīng)常無(wú)須在程序員意識(shí)到這點(diǎn)。

       交互式操作的另一個(gè)方面是Scala極度重用了Java類(lèi)型。ScalaInt類(lèi)型代表了Java的原始整數(shù)類(lèi)型intFloat代表了floatBoolean代表boolean,等等。Scala的數(shù)組被映射到Java數(shù)組。Scala同樣重用了許多標(biāo)準(zhǔn)Java庫(kù)類(lèi)型。例如,Scala里的字串文本"abc"java.lang.String,而拋出的異常必須是java.lang.Throwable的子類(lèi)。

       Scala不僅重用了Java的類(lèi)型,還把它們“打扮”得更漂亮。例如,Scala的字串支持類(lèi)似于toInttoFloat的方法,可以把字串轉(zhuǎn)換成整數(shù)或者浮點(diǎn)數(shù)。因此你可以寫(xiě)str.toInt替代Integer.parseInt(str)。如何在不打破互操作性的基礎(chǔ)上做到這點(diǎn)呢?JavaString類(lèi)當(dāng)然不會(huì)有toInt方法。實(shí)際上,Scala有一個(gè)解決這種高級(jí)庫(kù)設(shè)計(jì)和互操作性不相和諧的通用方案。Scala可以讓你定義隱式轉(zhuǎn)換:implicit conversion,這常常用在類(lèi)型失配,或者選用不存在的方法時(shí)。在上面的例子里,當(dāng)在字串中尋找toInt方法時(shí),Scala編譯器會(huì)發(fā)現(xiàn)String類(lèi)里沒(méi)有這種方法,但它會(huì)發(fā)現(xiàn)一個(gè)把JavaString轉(zhuǎn)換為ScalaRichString類(lèi)的一個(gè)實(shí)例的隱式轉(zhuǎn)換,里面定義了這么個(gè)方法。于是在執(zhí)行toInt操作之前,轉(zhuǎn)換被隱式應(yīng)用。

        Scala代碼同樣可以由Java代碼調(diào)用。有時(shí)這種情況要更加微妙,因?yàn)?/font>Scala是一種比Java更豐富的語(yǔ)言,有些Scala更先進(jìn)的特性在它們能映射到Java前需要先被編碼一下。第29章說(shuō)明了其中的細(xì)節(jié)。

     Scala是簡(jiǎn)潔的

        Scala程序一般都很短。Scala程序員曾報(bào)告說(shuō)與Java比起來(lái)代碼行數(shù)可以減少到1/10。這有可能是個(gè)極限的例子。較保守的估計(jì)大概標(biāo)準(zhǔn)的Scala程序應(yīng)該有Java寫(xiě)的同樣的程序一半行數(shù)左右。更少的行數(shù)不僅意味著更少的打字工作,同樣意味著更少的話(huà)在閱讀和理解程序上的努力及更少的出錯(cuò)可能。許多因素在減少代碼行上起了作用。

        首先,Scala的語(yǔ)法避免了一些束縛Java程序的固定寫(xiě)法。例如,Scala里的分號(hào)是可選的,且通常不寫(xiě)。Scala語(yǔ)法里還有很多其他的地方省略了東西。比方說(shuō),比較一下你在JavaScala里是如何寫(xiě)類(lèi)及構(gòu)造函數(shù)的。在Java里,帶有構(gòu)造函數(shù)的類(lèi)經(jīng)常看上去是這個(gè)樣子:

    // 在Java里
    class MyClass {
        
    private int index;
        
    private String name;
        
    public MyClass(int index, String name) {
            
    this.index = index;
            
    this.name = name;
        }
    }

       在Scala里,你會(huì)寫(xiě)成這樣:

    class MyClass(index: Int, name: String)

       根據(jù)這段代碼,Scala編譯器將制造有兩個(gè)私有成員變量的類(lèi),一個(gè)名為indexInt類(lèi)型和一個(gè)叫做nameString類(lèi)型,還有一個(gè)用這些變量作為參數(shù)獲得初始值的構(gòu)造函數(shù)。這個(gè)構(gòu)造函數(shù)還將用作為參數(shù)傳入的值初始化這兩個(gè)成員變量。一句話(huà),你實(shí)際拿到了與羅嗦得多的Java版本同樣的功能。Scala類(lèi)寫(xiě)起來(lái)更快,讀起來(lái)更容易,最重要的是,比Java類(lèi)更不容易犯錯(cuò)。

       有助于Scala的簡(jiǎn)潔易懂的另一個(gè)因素是它的類(lèi)型推斷。重復(fù)的類(lèi)型信息可以被忽略,因此程序變得更有條理和易讀。

       但或許減少代碼最關(guān)鍵的是因?yàn)橐呀?jīng)存在于你的庫(kù)里而不需要寫(xiě)的代碼。Scala給了你許多工具來(lái)定義強(qiáng)有力的庫(kù)讓你抓住并提煉出通用的行為。例如,庫(kù)類(lèi)的不同方面可以被分成若干特質(zhì),而這些有可以被靈活地混合在一起。或者,庫(kù)方法可以用操作符參數(shù)化,從而讓你有效地定義那些你自己控制的構(gòu)造。這些構(gòu)造組合在一起,就能夠讓庫(kù)的定義既是高層級(jí)的又能靈活運(yùn)用。

      Scala是高層級(jí)的

        程序員總是在和復(fù)雜性糾纏。為了高產(chǎn)出的編程,你必須明白你工作的代碼。過(guò)度復(fù)雜的代碼成了很多軟件工程崩潰的原因。不幸的是,重要的軟件往往有復(fù)雜的需求。這種復(fù)雜性不可避免;必須(由不受控)轉(zhuǎn)為受控。

        Scala可以通過(guò)讓你提升你設(shè)計(jì)和使用的接口的抽象級(jí)別來(lái)幫助你管理復(fù)雜性。例如,假設(shè)你有一個(gè)String變量name,你想弄清楚是否String包含一個(gè)大寫(xiě)字符。在Java里,你或許這么寫(xiě):

    // 在Java里
    boolean nameHasUpperCase = false;
    for (int i = 0; i < name.length(); ++i) {
        
    if (Character.isUpperCase(name.charAt(i))) {
            nameHasUpperCase 
    = true;
            
    break;
        }
    }

       在Scala里,你可以寫(xiě)成:

    val nameHasUpperCase = name.exists(_.isUpperCase)

        Java代碼把字串看作循環(huán)中逐字符步進(jìn)的低層級(jí)實(shí)體。Scala代碼把同樣的字串當(dāng)作能用論斷:predicate查詢(xún)的字符高層級(jí)序列。明顯Scala代碼更短并且——對(duì)訓(xùn)練有素的眼睛來(lái)說(shuō)——比Java代碼更容易懂。因此Scala代碼在通盤(pán)復(fù)雜度預(yù)算上能極度地變輕。它也更少給你機(jī)會(huì)犯錯(cuò)。

        論斷,_.isUpperCase,是一個(gè)Scala里面函數(shù)式文本的例子。它描述了帶一個(gè)字符參量(用下劃線(xiàn)字符代表)的函數(shù),并測(cè)試其是否為大寫(xiě)字母。

        原則上,這種控制的抽象在Java中也是可能的。為此需要定義一個(gè)包含抽象功能的方法的接口。例如,如果你想支持對(duì)字串的查詢(xún),就應(yīng)引入一個(gè)只有一個(gè)方法hasProperty的接口CharacterProperty

    // 在Java里
    interface CharacterProperty {
        
    boolean hasProperty(char ch);
    }

        然后你可以在Java里用這個(gè)接口格式一個(gè)方法exists:它帶一個(gè)字串和一個(gè)CharacterProperty并返回真如果字串中有某個(gè)字符符合屬性。然后你可以這樣調(diào)用exists

    // 在Java里
    exists(name, new CharacterProperty {
        
    boolean hasProperty(char ch) {
            
    return Character.isUpperCase(ch);
        }
    });

        然而,所有這些真的感覺(jué)很重。重到實(shí)際上多數(shù)Java程序員都不會(huì)惹這個(gè)麻煩。他們會(huì)寧愿寫(xiě)個(gè)循環(huán)并漠視他們代碼里復(fù)雜性的累加。另一方面,Scala里的函數(shù)式文本真地很輕量,于是就頻繁被使用。隨著對(duì)Scala的逐步了解,你會(huì)發(fā)現(xiàn)越來(lái)越多定義和使用你自己的控制抽象的機(jī)會(huì)。你將發(fā)現(xiàn)這能幫助避免代碼重復(fù)并因此保持你的程序簡(jiǎn)短和清晰。

    Scala是靜態(tài)類(lèi)型的

        靜態(tài)類(lèi)型系統(tǒng)認(rèn)定變量和表達(dá)式與它們持有和計(jì)算的值的種類(lèi)有關(guān)。Scala堅(jiān)持作為一種具有非常先進(jìn)的靜態(tài)類(lèi)型系統(tǒng)的語(yǔ)言。從Java那樣的內(nèi)嵌類(lèi)型系統(tǒng)起步,能夠讓你使用泛型:generics參數(shù)化類(lèi)型,用交集:intersection聯(lián)合類(lèi)型和用抽象類(lèi)型:abstract type隱藏類(lèi)型的細(xì)節(jié)。這些為建造和組織你自己的類(lèi)型打下了堅(jiān)實(shí)的基礎(chǔ),從而能夠設(shè)計(jì)出即安全又能靈活使用的接口。

        如果你喜歡動(dòng)態(tài)語(yǔ)言如PerlPythonRubyGroovy,你或許發(fā)現(xiàn)Scala把它的靜態(tài)類(lèi)型系統(tǒng)列為其優(yōu)點(diǎn)之一有些奇怪。畢竟,沒(méi)有靜態(tài)類(lèi)型系統(tǒng)已被引為動(dòng)態(tài)語(yǔ)言的某些主要長(zhǎng)處。絕大多數(shù)普遍的針對(duì)靜態(tài)類(lèi)型的論斷都認(rèn)為它們使得程序過(guò)度冗長(zhǎng),阻止程序員用他們希望的方式表達(dá)自己,并使軟件系統(tǒng)動(dòng)態(tài)改變的某些模式成為不可能。然而,這些論斷經(jīng)常針對(duì)的不是靜態(tài)類(lèi)型的思想,而是指責(zé)特定的那些被意識(shí)到太冗長(zhǎng)或太不靈活的類(lèi)型系統(tǒng)。例如,Alan KaySmalltalk語(yǔ)言的發(fā)明者,有一次評(píng)論:“我不是針對(duì)類(lèi)型,而是不知道有哪個(gè)沒(méi)有完痛的類(lèi)型系統(tǒng),所以我還是喜歡動(dòng)態(tài)類(lèi)型。”

        我們希望能在書(shū)里說(shuō)服你,Scala的類(lèi)型系統(tǒng)是遠(yuǎn)談不上會(huì)變成“完痛”。實(shí)際上,它漂亮地說(shuō)明了兩個(gè)關(guān)于靜態(tài)類(lèi)型通常考慮的事情(的解決方案):通過(guò)類(lèi)型推斷避免了贅言和通過(guò)模式匹配及一些新的編寫(xiě)和組織類(lèi)型的辦法獲得了靈活性。把這些絆腳石搬掉后,靜態(tài)類(lèi)型系統(tǒng)的經(jīng)典優(yōu)越性將更被賞識(shí)。其中最重要的包括程序抽象的可檢驗(yàn)屬性,安全的重構(gòu),以及更好的文檔。

    可檢驗(yàn)屬性。靜態(tài)類(lèi)型系統(tǒng)可以保證消除某些運(yùn)行時(shí)的錯(cuò)誤。例如,可以保證這樣的屬性:布爾型不會(huì)與整數(shù)型相加;私有變量不會(huì)從類(lèi)的外部被訪問(wèn);函數(shù)帶了正確個(gè)數(shù)的參數(shù);只有字串可以被加到字串集之中。

        不過(guò)當(dāng)前的靜態(tài)類(lèi)型系統(tǒng)還不能查到其他類(lèi)型的錯(cuò)誤。比方說(shuō),通常查不到無(wú)法終結(jié)的函數(shù),數(shù)組越界,或除零錯(cuò)誤。同樣也查不到你的程序不符合式樣書(shū)(假設(shè)有這么一份式樣書(shū))。靜態(tài)類(lèi)型系統(tǒng)因此被認(rèn)為不很有用而被忽視。輿論認(rèn)為既然這種類(lèi)型系統(tǒng)只能發(fā)現(xiàn)簡(jiǎn)單錯(cuò)誤,而單元測(cè)試能提供更廣泛的覆蓋,又為何自尋煩惱呢?我們認(rèn)為這種論調(diào)不對(duì)頭。盡管靜態(tài)類(lèi)型系統(tǒng)確實(shí)不能替代單元測(cè)試,但是卻能減少用來(lái)照顧那些確需測(cè)試的屬性的單元測(cè)試的數(shù)量。同樣,單元測(cè)試也不能替代靜態(tài)類(lèi)型。總而言之,如Edsger Dijkstra所說(shuō),測(cè)試只能證明存在錯(cuò)誤,而非不存在。因此,靜態(tài)類(lèi)型能給的保證或許很簡(jiǎn)單,但它們是無(wú)論多少測(cè)試都不能給的真正的保證。

    安全的重構(gòu)。靜態(tài)類(lèi)型系統(tǒng)提供了讓你具有高度信心改動(dòng)代碼基礎(chǔ)的安全網(wǎng)。試想一個(gè)對(duì)方法加入額外的參數(shù)的重構(gòu)實(shí)例。在靜態(tài)類(lèi)型語(yǔ)言中,你可以完成修改,重編譯你的系統(tǒng)并容易修改所有引起類(lèi)型錯(cuò)誤的代碼行。一旦你完成了這些,你確信已經(jīng)發(fā)現(xiàn)了所有需要修改的地方。對(duì)其他的簡(jiǎn)單重構(gòu),如改變方法名或把方法從一個(gè)類(lèi)移到另一個(gè),這種確信都有效。所有例子中靜態(tài)類(lèi)型檢查會(huì)提供足夠的確認(rèn),表明新系統(tǒng)和舊系統(tǒng)可以一樣的工作。

    文檔。靜態(tài)類(lèi)型是被編譯器檢查過(guò)正確性的程序文檔。不像普通的注釋?zhuān)?lèi)型標(biāo)注永遠(yuǎn)都不會(huì)過(guò)期(至少如果包含它的源文件近期剛剛通過(guò)編譯就不會(huì))。更進(jìn)一步說(shuō),編譯器和集成開(kāi)發(fā)環(huán)境可以利用類(lèi)型標(biāo)注提供更好的上下文幫助。舉例來(lái)說(shuō),集成開(kāi)發(fā)環(huán)境可以通過(guò)判定選中表達(dá)式的靜態(tài)類(lèi)型,找到類(lèi)型的所有成員,并全部顯示出來(lái)。

        雖然靜態(tài)類(lèi)型對(duì)程序文檔來(lái)說(shuō)通常很有用,當(dāng)它們弄亂程序時(shí),也會(huì)顯得很討厭。標(biāo)準(zhǔn)意義上來(lái)說(shuō),有用的文檔是那些程序的讀者不可能很容易地從程序中自己想出來(lái)的。在如下的方法定義中:

               def f(x: String) = ...

        知道f的變量應(yīng)該是String是有用的。另一方面,以下例子中兩個(gè)標(biāo)注至少有一個(gè)是討厭的:

               val x: HashMap[IntString] = new HashMap[IntString]()

        很明顯,x是以Int為鍵,String為值的HashMap這句話(huà)說(shuō)一遍就夠了;沒(méi)必要同樣的句子重復(fù)兩遍。

        Scala有非常精于此道的類(lèi)型推斷系統(tǒng),能讓你省略幾乎所有的通常被認(rèn)為是討厭的類(lèi)型信息。在上例中,以下兩個(gè)不太討厭的替代品也能一樣工作:

              val x = new HashMap[IntString]()

              val x: Map[IntString] = new HashMap()

         Scala里的類(lèi)型推斷可以走的很遠(yuǎn)。實(shí)際上,就算用戶(hù)代碼絲毫沒(méi)有顯式類(lèi)型也不稀奇。因此,Scala編程經(jīng)常看上去有點(diǎn)像是動(dòng)態(tài)類(lèi)型腳本語(yǔ)言寫(xiě)出來(lái)的程序。尤其顯著表現(xiàn)在作為粘接已寫(xiě)完的庫(kù)控件的客戶(hù)應(yīng)用代碼上。而對(duì)庫(kù)控件來(lái)說(shuō)不是這么回事,因?yàn)樗鼈兂3S玫较喈?dāng)精妙的類(lèi)型去使其適于靈活使用的模式。這很自然。綜上,構(gòu)成可重用控件接口的成員的類(lèi)型符號(hào)應(yīng)該是顯式給出的,因?yàn)樗鼈儤?gòu)成了控件和它的使用者間契約的重要部分。

    posted on 2009-08-03 12:13 VWPOLO 閱讀(3179) 評(píng)論(6)  編輯  收藏

    Feedback

    # re: 為什么選擇Scala 2009-08-03 14:02 herowzz
    scala缺乏的是一個(gè)好用的ide和一個(gè)殺手級(jí)的應(yīng)用  回復(fù)  更多評(píng)論
      

    # re: 為什么選擇Scala[未登錄](méi) 2009-08-03 14:57 vwpolo
    @herowzz
    IDE的確是個(gè)大問(wèn)題,twitter用scala構(gòu)建高性能消息服務(wù)  回復(fù)  更多評(píng)論
      

    # re: 為什么選擇Scala[未登錄](méi) 2009-08-03 15:11 無(wú)名
    就日前IDE,intelliJ對(duì)scala的支持會(huì)好一點(diǎn),但是做的還很不夠。maven對(duì)它的支持也不是很夠,有比較多的bug。希望日后能有更進(jìn)一步的發(fā)展。  回復(fù)  更多評(píng)論
      

    # re: 為什么選擇Scala 2009-08-03 18:40 日月雨林@gmail.com
    netbeans 對(duì)scala 的支持很好的,不過(guò)博主不喜歡. 為什么不給netbeans 一個(gè)機(jī)會(huì)呢?  回復(fù)  更多評(píng)論
      

    # re: 為什么選擇Scala 2009-08-04 09:08 VWPOLO
    @日月雨林@gmail.com
    呵呵,我想Eclipse 基金會(huì)應(yīng)該會(huì)出手來(lái)拯救Scala IDE的世界  回復(fù)  更多評(píng)論
      

    # re: 為什么選擇Scala 2009-08-04 12:19 凡客誠(chéng)品
    是大方快多少積分  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲日本一区二区三区在线| 免费看大美女大黄大色| 日韩免费精品视频| 毛片免费在线观看网站| 国产高清在线精品免费软件| 免费在线观看黄网| 亚洲成A人片在线观看WWW| 亚洲黄色免费在线观看| 亚洲欧美综合精品成人导航| 牛牛在线精品观看免费正| 久久青草免费91线频观看站街| 四虎免费影院ww4164h| 国产极品粉嫩泬免费观看| 国产亚洲美女精品久久久2020| 亚洲黄色中文字幕| 337p日本欧洲亚洲大胆人人| 黄色网站软件app在线观看免费| 亚洲免费在线视频观看| 国产免费黄色大片| 亚洲av中文无码乱人伦在线播放| 亚洲人成电影在线观看青青| 理论秋霞在线看免费| 亚洲免费视频在线观看| 日韩一级视频免费观看| 国产精品亚洲一区二区三区在线| 亚洲三级在线视频| 久久免费观看视频| www.黄色免费网站| 国产亚洲AV夜间福利香蕉149 | 永久免费av无码网站大全| 永久亚洲成a人片777777| 亚洲卡一卡2卡三卡4麻豆| 四虎国产精品永免费| 日本免费一区二区在线观看| 亚洲国产婷婷香蕉久久久久久| 亚洲乱码一区av春药高潮| a一级毛片免费高清在线| 成年女人免费视频播放体验区| 亚洲国产精品无码久久久秋霞2| 亚洲AV无码一区二区大桥未久| 99精品视频在线免费观看 |