Java在几乎所有方面都可以胜任本机响应
我與一位同事討論了Java與JavaScript的話題,這是一個有問題的話題。 然后,他提到React Native多么出色,我決定我必須研究一下,也許要為Codename One掌握一些想法……
那里有一些不錯的主意,但是它們都不是革命性的或例外的,而且對于在Java 8中運行的Codename One開發人員來說,大多數都不是什么新鮮事。
我喜歡的一件事是React演示代碼看起來有多短,所以我將其移植到Codename One上,最終得到了大致相同數量的代碼,并且可以說是更好/更簡單的代碼!
退房的完整列表,在文章的結尾,或在github上的項目在這里 ,但讓我們首先回顧了為什么Java代碼是“更好”。
同步執行
JavaScript愛好者討厭這一點,但它仍然是一個事實,即同步代碼更易于閱讀,跟蹤和調試。 例如,這是獲取數據的代碼的React Native版本:
fetchData: function() {fetch(REQUEST_URL) .then((response) => response.json()) .then((responseData) => { this.setState({ dataSource: this.state.dataSource.cloneWithRows(responseData.movies), loaded: true, }); }) .done(); },我擁有20多年的專業編程經驗,這仍然很難遵循。 顯然,如果省略了done() ,您將不會得到任何錯誤處理?
它很奇怪,容易出錯。 我覺得這背后隱藏了許多代碼,這使簡潔性比簡化更為混亂(有點像通過Twitter進行政治辯論之后)。 對我來說,我們的代碼是這樣簡單:
react.add(BorderLayout.CENTER, new InfiniteContainer() {public Component[] fetchComponents(int index, int amount) {try {Collection data = (Collection)ConnectionRequest.fetchJSON(REQUEST_URL).get("movies");Component[] response = new Component[data.size()];int offset = 0;for(Object movie : data) {response[offset] = createMovieEntry(Result.fromContent((Map)movie));offset++;}return response;} catch(IOException err) {Dialog.show("Error", "Error during connection: " + err, "OK", null);}return null;} });請注意,這與上面的代碼并不完全等效,因為我們還創建了組件,將它們添加到UI并處理所產生的錯誤! 比較公平的比較是:
try {Collection data = (Collection)ConnectionRequest.fetchJSON(REQUEST_URL).get("movies");... } catch(IOException err) {... }這實際上是一行代碼,甚至可能更短,之后我們得到結果……沒有流程,沒有回調!
開發人員經常討厭Java的檢查異常功能,我必須同意它們有時會很痛苦(如果InterruptedException是愚蠢的),但這就是為什么檢查異常很重要的一個很好的例子。 我們必須正確地處理錯誤,并且在我們的代碼以這種可愛的“ TODO”注釋正式投入生產之前,不能無視它,沒人會打擾閱讀。
一種語言-更少的代碼
清單的大小大致相等,但是您會注意到,在處理JavaScript代碼時,react代碼會忽略本機特定于平臺的代碼。 我們的清單包含所有內容,不需要其他代碼,也不需要其他樣板,項目等。
React Native通過將標簽與JavaScript代碼混合來進一步有效地將聲明性代碼混合到常規流中。 是的,它縮短了代碼,但也消除了聲明式編程價值的很大一部分,即職責分離。
重新加載==應用代碼更改
可以通過重新加載來調試React Native,這在使用糟糕的 Android模擬器時會有所幫助。 幸運的是,代號不需要該模擬器,也不需要重新啟動應用程序即可重新加載已編譯的更改……例如,在NetBeans中,只需在調試器中使用“應用代碼更改”,您的更改就會立即鏡像到正在運行的應用程序中。
腳本語言在“設備上”存在問題
這不是“ React Native”特有的語,它與將JavaScript打包在應用程序捆綁包中的所有工具有關。 腳本語言非常適合網絡使用,就像“管道膠帶”一樣。 告訴我一個不喜歡膠帶的黑客!
發行帶有這種管道膠帶的應用程序的誘惑很大,但是與網絡不同,在網絡上,您可以通過部署新更新來修復生產中的“怪異未定義”錯誤。 使用應用程序時,您需要通過蘋果的審批流程…這意味著在您觀察評分下降時,仍會存在生產錯誤。
是的,單元測試,lint和許多其他解決方案應該可以解決這些問題,但是當您使用現代IDE時,由于嚴格的語言語法,它可以檢測到潛在的null推理,這真是太神奇了!
例如,關于JavaScript簡化問題的一個好例子將是這樣的代碼:
function reduce(var a) {if(...) {a = a - 1;} else {a = a + 1;} }如果這是Java代碼,那么我們可以確切地知道這里會發生什么……在JavaScript中情況并非如此! 讓我們假設由于錯誤,只要條件為真(某種情況下在所有測試用例中都是這樣),a就是某種方式為"11"的字符串,那么它將像數字一樣起作用。 例如a將變為"10" 。 但是在生產中,如果條件由于某種原因變為假,則a將變為"111" 。 如果a代表某種有價值的東西(例如債務,信用等),那么在商店中有一個帶有此錯誤的應用可能真的很痛苦。
環境
React native使用本地開發環境,這意味著它需要Mac才能進行iOS開發。 這也意味著您需要在Android IDE中完成部分工作,在Xcode中完成部分工作,并使用文本編輯器來完成JavaScript工作。 對于我來說,令人驚訝的是,開發人員愿意放棄30年的IDE演變而獲得一些語法糖果??? 我們是否受到Eclipse的傷害? 今天的IDE令人贊嘆,您可以通過單個IDE跟蹤/調試整個代碼這一事實非常寶貴。 我們團隊具有立即查看誰使用了什么軟件以及出于什么目的的功能,這真是令人震驚,我無法理解一個這樣的事情是如何由兩人以上的團隊使用的,尤其是在分散的勞動力中。
我喜歡JavaScript的地方
我真正喜歡使用JavaScript的一件事是使用JSON的簡易性,而在下面的代碼中,我將其大大減少到幾乎與它一樣優雅的大小。 我仍然不喜歡鴨子類型或腳本語言,但是我真的很想將諸如屬性對象之類的東西添加到Codename One中,并改進集成的解析。
最后的話
我在簡潔的編程中發現的問題之一是,人們使用它來隱藏基本概念,以至于太多的事情以“不言而喻”的方式發生。 不幸的是,這使得簡潔的代碼像Tweet一樣易于閱讀,不幸的是,即使您需要表達一個中等復雜的想法,Twitter也不會削減它,而其中一些API就是一個大問題。
React native有它的粉絲,畢竟它可能比PhoneGap更好,PhoneGap有其自身的局限性。 但是,它仍然是腳本基礎架構的雞腿上的一個有限的概念。 與Codename One相比,它沒有真正的優勢,并且存在一些明顯的潛在問題。
Java清單
public class ReactDemo {private static final String REQUEST_URL = "https://raw.githubusercontent.com/facebook/react-native/master/docs/MoviesExample.json";private Form current;private EncodedImage placeholder;public void init(Object context) {UIManager.initFirstTheme("/theme");}public void start() {if(current != null){current.show();return;}placeholder = EncodedImage.createFromImage(Image.createImage(53, 81, 0), false);Form react = new Form("React Demo", new BorderLayout());react.add(BorderLayout.CENTER, new InfiniteContainer() {public Component[] fetchComponents(int index, int amount) {try {Collection data = (Collection)ConnectionRequest.fetchJSON(REQUEST_URL).get("movies");Component[] response = new Component[data.size()];int offset = 0;for(Object movie : data) {response[offset] = createMovieEntry(Result.fromContent((Map)movie));offset++;}return response;} catch(IOException err) {Dialog.show("Error", "Error during connection: " + err, "OK", null);}return null;}});react.show();}Component createMovieEntry(Result data) {Container entry = BorderLayout.center(BoxLayout.encloseY(new SpanLabel(data.getAsString("title"), "Line1"), new Label(data.getAsString("year"), "Line2"))).add(BorderLayout.WEST, URLImage.createToStorage(placeholder, data.getAsString("id"), data.getAsString("posters/thumbnail")));return entry;} public void stop() {current = Display.getInstance().getCurrent();}public void destroy() {} }翻譯自: https://www.javacodegeeks.com/2015/11/java-is-superior-to-react-native-in-practically-every-way.html
總結
以上是生活随笔為你收集整理的Java在几乎所有方面都可以胜任本机响应的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven原型_Maven原型创建技巧
- 下一篇: 11寸多大 11寸屏幕的尺寸是怎么计算出