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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

魅蓝android底层是什么,魅蓝E2的手机系统是什么

魅蓝E2的手机系统是什么魅蓝E2的手机系统是Flyme 6系统。魅蓝E2搭载了基于YunOS底层深度定制的Flyme 6系统,相交于Flyme 5系列,Flyme 6拥有更轻巧明快的设计元素,辅以让人称颂的人工智能技术One Mind,可以有效保障魅蓝E2日常使用流…

android夜间模式揭露动画,Android Material Design系列之夜间模式

今天我们讲讲夜间模式的实现,这篇文章的名字应该叫:《Android Material Design系列之夜间模式》。在Android 5.0 之后,实现夜间模式并非很难了,支持的5.0库提供了非常简单的实现方式。不信,你就往下看。首先说&#xf…

reader dc

https://get.adobe.com/cn/reader/otherversions/转载于:https://www.cnblogs.com/zengkefu/p/5981109.html

jboss drools_JBoss Drools –入门

jboss drools这篇文章是关于我如何掌握JBoss Drools的 。 其背后的原因是:SAP收购了我公司当前的规则引擎,而Drools是我们将寻找的另一种选择,只要有人有能力提高概念验证的能力。 尽管似乎有大量的文档,但是我总是会通过示例来发…

Android开发环境(IDE)

一:Eclipse 1、装JDK; 2、装Eclipse;//应与JDK同为32/64位。 3、装ADT; 4、装android sdk; 推荐下载ADT bundle包(包含Eclipse,Android SDK Manager,sdk)。此Eclipse已经…

华为荣耀30pro鸿蒙内测版,荣耀手机用户放心了 消息称荣耀30 Pro正在内测华为鸿蒙OS...

2021-5-11 13:12【天极网手机频道】鸿蒙OS2.0手机版目前正在大规模开发者公测阶段,有消息称6月份将开始大规模向华为手机用户推送。而对于不少荣耀手机用户来讲,他们也十分期待体验鸿蒙OS,但荣耀品牌已经与华为品牌分离,这让不少荣…

Docker容器中的WildFly Swarm JAX-RS微服务

这些天,每个人都在谈论微服务。 关于如何在企业级应用这些原则,有很多意见和想法,而很少有示例。 可以肯定的是,即使在几天前的会议上,我也很少发现有人在生产环境中运行Docker容器。 当我问起初次体验以及是否有人玩过…

iterator and iterable

前者是迭代器 后者是接口,List等继承这个接口 转载于:https://www.cnblogs.com/mayidudu/p/5986649.html

C#解析json文件的方法

C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。 JSON采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写&#x…

spring 线程池_Spring线程池服务

spring 线程池线程池对于执行同步和异步过程非常重要。 本文介绍如何使用Spring开发和监视线程池服务。 创建线程池已通过两种替代方法进行了说明。 二手技术 : JDK 1.6.0_21 春天3.0.5 Maven的3.0.2 步骤1:建立已完成的专案 创建一个Maven项目&…

arrayQueue

用数组实现队列&#xff1a; 定义头文件&#xff1a; 1 #include<stdio.h>2 #include<stdlib.h>3 #define MAX_SIZE 104 int queue[MAX_SIZE];5 int front-1;6 int rear-1;7 8 int IsFull(int queue[]); //判断队列是否已满 9 int IsEmpty(int queue[]); …

109. Convert Sorted List to Binary Search Tree

不定期更新leetcode解题java答案。 采用pick one的方式选择题目。 题意为将一个增序单链表转换成为二叉搜索树。 可以采用递归的方式依次确认该层应选择的单链表位置作为树的节点依次向下进行。每次选择做树该层的节点为链表的中间值。 代码如下&#xff1a; 1 /**2 * Definit…

带有骆驼,ActiveMQ,Elasticsearch的HL7关键用例

对于可以说HL7协议格式的系统&#xff0c; HL7 over MLLP是一种非常常见的传输机制。 JBoss Fuse是一个非常强大的微服务样式集成平台&#xff0c;在为关键医疗保健提供者构建灵活&#xff0c;有弹性&#xff0c;高可用性的集成方案方面拥有良好的记录。 此外&#xff0c;在JCA…

android 包裹内容,Android开发中Bundle用法 包裹数据

SDK里是这样描述&#xff1a;A mapping from String values to various Parcelable types。它帮助我将数据打包传入intent里面&#xff0c;为使用这些数据提供了便利。protected void onListItemClick (ListView l, View v, int position, long id){super.onListItemClick(l, v…

安卓高级6 SnackBar

引言 文&#xff0f;李牧羊&#xff08;简书作者&#xff09; 原文链接&#xff1a;http://www.jianshu.com/p/2654e6bda3b1 著作权归作者所有&#xff0c;转载请联系作者获得授权&#xff0c;并标注“简书作者”。 在之前我有提到这一篇Android Design Support Library系列文章…

html语言及语法结构,HTML语法结构.ppt

HTML语法结构HTML超文本标识语言 HTML超文本标识语言 HTML概念 HTML(Hyper Text Markup Language 超文本标识语言) 是一种用来制作超文本文档的简单标记语言。用HTML编写的超文本文档称为HTML文档。 HTML超文本标识语言 HTML文档的编写方法 1.手 工 直 接 编 写 记事本等&#…

利用Aspose.Word控件实现Word文档的操作

Aspose系列的控件&#xff0c;功能都挺好&#xff0c;之前一直在我的Winform开发框架中用Aspose.Cell来做报表输出&#xff0c;可以实现多样化的报表设计及输出&#xff0c;由于一般输出的内容比较正规化或者多数是表格居多&#xff0c;所以一般使用Aspose.Cell来实现我想要的各…

html编码自动识别,html实体编码遇上js代码

摘要&#xff1a; 在js中单、双引号引起来的是字符串&#xff0c;如果我们要在字符串中使用单、双引号&#xff0c;需要反斜杠进行转义。而如果字符串出现在html标签中&#xff0c;我们需要做转义处理。单双引号在js代码中在js中单、双引号引起来的是字符串&#xff0c;如果我们…

jpa动态扩展sql_扩展您的JPA POJO

jpa动态扩展sql可扩展性是许多体系结构的重要特征。 它衡量是否容易&#xff08;或困难&#xff09; 它是在不影响现有核心系统功能的情况下添加或更改功能。 让我们举一个简单的例子。 假设您的公司拥有一个核心产品来跟踪体育俱乐部中的所有用户。 在您的产品体系结构中&…

手机 html 折叠效果,HTML5仿苹果手机的面板合拢折叠效果

passbook仿苹果手机的面板合拢折叠效果-html5特效.pocket{width:300px;height:460px;padding: 10px;overflow: hidden;float: left;border: 1px solid #EDEDED;margin: 4px;border-radius: 8px;box-shadow:0 -5px 30px rgba(0,0,0,0.2) inset;}.passcard {float: left;width:30…