全棧技巧:從Javascript跳轉到Java能有多難?

banq發表於2019-04-15

這種轉換是不是我自尋煩惱?Javascript是有史以來最好的語言?
現在大多數軟體公司都希望能夠擁有“廣泛的Javascript知識,特別是React,Redux和TDD [測試驅動開發]經驗”的人。一些Java知識也很有用。這是現實生活。
簡而言之,隨著編碼領域的發展,以及“伺服器工作確實繁重”和“前端展示好東西”之間的界限模糊,對具有多個知識方面的開發人員的需求正在增長。他們想要能夠做到這兩點的人。這意味著如果你是一個對Javascript有深入瞭解並擁有大量技術堆疊的開發人員,你可以很愉快編寫Angular,React等,但是當用Java啟動Tomcat伺服器時會嚇壞了你。
大約3個月前,我專門在前端堆疊中工作,而且,或多或少完全在Javascript中。我們的應用程式有一個Angular前端和一個連線到資料庫的Java伺服器,這是一個相當標準的應用程式設定。我對Angular的任何知識都有廣泛的瞭解,但是如果涉及到後端任務工作,我立即被困住了,不得不尋求幫助。這意味著當我等待伺服器更改完成時,我最終等待一段時間或者嘗試切換焦點並處理其他事情,這會減慢我的速度,也會減慢要求為我做出改變的人。
我決定解決這個問題並決定學習儘可能多的Java來開始理解伺服器程式碼庫,並在我們構建的應用程式開發過程中(略微!)對所需的更改做出貢獻。在我正在構建的當前應用程式上,我一直在尋找(並參與)Java程式碼庫,僅僅六週多,我雖然不是一個Java專業嚮導,但我取得了很好的進展,我現在可以有效地為我們團隊正在開發的整個技術棧做出貢獻。
下面列出了一些簡單的建議,它幫助我彌合Javascript和Java之間的差距。這個列表並非詳盡無遺,我想有些Java純粹主義者在閱讀時會窒息,但我希望我所學到的經驗可能會讓其他人成為一個“全棧”開發人員變得更容易比我做的!

在Javascript中以“type型別”開頭
雖然這似乎是一個相當無害的概念,但明確定義“型別”的想法(在我看來)是Java和Javascript之間最大的差異之一。那麼,什麼是型別?
如果我們看一個例子,我們將很快掌握什麼是“型別”!
在Java中,如果將字串定義為:

String myString = "Java is great!";
// OK


一切正常,因為myString的型別被正確識別為String型別。
但是,我們要呼叫:

Boolean myString = "Java is great!";
// Compiler error!


這將遇到問題,編譯將失敗。我們已經明確地將myString設定為布林型別,但之前是將其定義為String型別。
型別本身可能很複雜。具有靜態型別的語言(如Java)被稱為靜態型別語言,並在編譯時檢查型別,例如上面的示例。另一方面,具有動態型別的語言被稱為動態型別語言,並且 - 至關重要 - 在執行時檢查型別。
JavaScript是動態型別語言的一個示例,它採用不同的方法。它允許上下文確定正在定義的資料型別。這意味著型別仍然是Javascript中的一個東西,它們只是在引擎蓋下處理。所以,在Javascript中定義:

const myString = 'Javascript is easier!';
// OK


這將在執行時確定myString是一個String型別。靜態型別語言開發人員最大的一個問題是:無法理解以下是完全有效的(如果設計非常嚴格)程式碼,它不會在執行時或編譯時中斷。

let result = 'Javascript is sometimes a bit daft';
// result is type string
if(result === 'Javascript is sometimes a bit daft') {
    result = 10;
    // result is type int
} else {
    result = true;
    // result is type boolean
}
return result;
// 10 - all compiles OK (?!)


顯然,在像Java這樣的靜態型別語言中,這會引發一堆錯誤。長話短說:動態型別語言不要求您宣告資料型別。JavaScript意味著資料型別,而像Java這樣的靜態型別語言直接宣告它,要求您在使用它們之前宣告構造的資料型別。
如果您一直在使用Javascript進行開發並且沒有仔細檢視您的型別但是您已經正確編碼,那麼這應該做些轉變:逐漸習慣於在Javascript語言內部分配型別是轉向靜態型別語言(在我們的例子中,特別是Java)。通常有兩種方法可以在Javascript程式碼中明確引入型別:
  • 遷移到Typescript:如果你有容量,那麼我真的建議你將你的Javascript移動到Typescript。Typescript編譯回Javascript,現在很多編譯器可以同時處理這兩個問題。
  • 使用flow:作為遷移到Typescript之間的一種中間立場,只是嘗試使用Javascript而更多地關注型別推斷,Flow充當媒介,推斷自己每個變數的型別是什麼,並突出顯示任何問題更改.js檔案中的型別。


學會喜歡流Stream
一個優秀的Javascript開發人員可以使用的最強大的工具之一是能夠在陣列上執行許多不同的運算子,採集資料來源採取大而笨重地轉換連線方法將結果修改為您想要的任何內容。

const myAwesomeArray = ['Java', 'is', 'different', 'to', 'Javascript'];
myAwesomeArray
    .filter(entry => { return entry.includes('Java'); })
    .map(javaEntries => { return javaEntries.toUpperCase(); })
    .slice(-1)
    .reduce((acc, entry) => { return `${entry} is a dynamically typed language!`},'');
    // JAVASCRIPT is a dynamically typed language!


當你開始使用Java時,你首先注意到的是有大量的Lists和Collections,而不是那麼多的陣列!突然間,你所有的精彩鏈條都毫無意義,你需要重新學習一切。不要擔心!Java 8引入了流媒體的概念。它支援列表和集合的功能操作。意思突然之間,您可以透過Javascript(或至少非常相似的東西)重新使用您知道和喜愛的連結和運算子!

myAwesomeList.stream()
    .filter(entry -> entry.contains("Java")
    .findFirst()
    .ifPresent(entry -> system.Print(entry.toUpperCase() + "is a statically typed language!");
    // JAVA is a statically typed language


注意那些有多相似?我接受有一些小的差異,但通常有很多重疊。遠遠超過大多數人的期望!一切都是透過Stream()的力量實現的!

正確設定IDE
這個有點不太明顯,乍一看是可以忽略的。使用JavaScript,因為事實上它的動態型別,通常有點對全域性和區域性變數更寬鬆,您使用IDE可以是些基本的記事本(我仍然不會推薦它,雖然!)為Javascript編輯的黃金標準(目前對我來說肯定是Visual Studio Code!)
但是,由於編譯的複雜性,可以透過正確設定IDE來製作或破壞Java。我不得不建議使用IntelliJ。我目前正在使用終極版。我知道使用它需要花錢,但(對我自己來說,從Javascript學習語言)能夠迴圈每個類和變數的選項,並檢視錯誤和警告,因為值得花錢!

不要害怕問專家!
如果你從Javascript轉向Java,不要害怕提出很多問題,這是改進的最快方法!
 

相關文章