我与一位同事讨论了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在几乎所有方面都可以胜任本机响应相关推荐

  1. java胜任理由_Java在几乎所有方面均能胜任本机响应

    java胜任理由 我与一位同事讨论了Java与JavaScript的话题,这是一个有问题的话题. 然后他提到React Native多么出色,我决定我必须研究一下,也许要为Codename One掌握 ...

  2. 搬书匠 mysql_如何java进阶,我一直都有在学习,可是感觉好久都没进步了,心里好焦急?...

    首先我觉得java真正的进阶如果都说是技术的话我认为太片面了!我给你分析一下我对初中高级开发的理解. 初级开发:其实就是有些java基础和一些框架运用的小白,技术栈不会太广也不会太深,很多技术可能停留 ...

  3. 学Java需要下载什么软件?都有什么作用?

    学习java并非大家想象中的那么简单,除了书本和老师面授,软件的使用也有很大的作用,接下来小编为大家分享的就是关于"学Java需要下载什么软件?都有什么作用?"的内容,希望能够给正 ...

  4. Java的3大框架都学习什么呢?

    Java是互联网行业的第一编程语言,相信大家都已经有了解了,事实也确实如此,Java还是世界第一编程语言,在学习Java的过程中,框架是程序员们必学的知识点,而且是十分重要的应用,Spring.Str ...

  5. java中所有的类都继承于_Java中所有的类都是通过直接或间接地继承( )类得到的...

    Java中所有的类都是通过直接或间接地继承( )类得到的 答:java.lang.Object 关于主机地址 192.168.19.125 (子网掩码: 255.255.255.248 ),以下说法正 ...

  6. 这些BATJ必考的Java面试题,你都懂了吗?

    转载自   这些BATJ必考的Java面试题,你都懂了吗? 题目一 请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别? 考点分析: 分析 Exception 和 Err ...

  7. java集合—— 链表(java中的所有链表都是双向链表)

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码 diy 的, 旨在理解 java集合-- 链表(java中的所有链表都是双向链表) 的相关知识: 0.2) ...

  8. Java比以往任何时候都摇滚

    在TIOBE索引上 ,Java和C长期以来一直排名第一和第二,并且随着最近发布的JDK 8 GA的发布,对于我们的社区来说,情况不会变得更糟. Java简直就是岩石! 它是构建几乎所有应用程序的最佳平 ...

  9. java控制硬件_厨师都开始用Python和Java了,现在C语言还值得我们学习吗?

    C语言是否值得我们学习? ? ? ? ? ? 最近几年,大数据.人工智能.机器学习越来越受人关注,甚至达到妇孺皆知的程度.但是精通这方面的人才供不应求,再加上薪资水平相当高,会有很多人想要学习Pyth ...

最新文章

  1. Eclipse中SVN的安装步骤(两种)和用法
  2. 东大教务处验证码破解
  3. leetcode 561. 数组拆分 I(Java版)
  4. Android平台RTMP/RTSP播放器开发系列之解码和绘制
  5. JAVA SSM框架+Redis 实现单点登录
  6. 线程之间通信 等待(wait)和通知(notify)
  7. java checkbox数组_Java中的复选框数组
  8. 获取当前网页的绝对URL地址
  9. LotusScript (转)
  10. mysql 主备心跳监测配置_mysql主备配置
  11. Python基础函数学习笔记(三)
  12. conflicting declaration ‘typedef struct LZ4_stream_t LZ4_stream_t’解决
  13. EdrawMax Crack,跨平台图表软件
  14. 神经体液调节网络,神经网络能干嘛
  15. confluence 制作流程图_怎么利用软件绘制结构示意图 软件流程图绘制
  16. 一年之计在于春,一日之计在于晨, 一生之计在于勤,清晨起来修手机
  17. Field baseMapper in xxxxx required a bean of type 'xxxxxx' that could not be found 问题
  18. PaddingError: Placeholder of length ‘30‘ too short in package
  19. 嵌入式系统硬件体系设计(一)
  20. 动态折线图,制作原来是这么简单

热门文章

  1. Object.keys方法拿到对象的key值
  2. 学生自定义的键盘,功能强大齐全!!!
  3. 你知道i=i++;的含义吗?原理其实没有你想的那么简单
  4. java中input表单中的type=date返回类型【切记】
  5. ssm(Spring+Spring mvc+mybatis)mybatis配置文件——mybatis-config.xml
  6. javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——测试
  7. 谁说表单只能发get和post请求了?
  8. Eureka服务注册中心---SpringCloud
  9. 单片机中存储器扩展位地址线怎么算_51单片机存储器小结
  10. HttpServletRequest中getAttribute()和getParameter()的区别