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”注释正式投入生产时,我们才不能忽略它,没有人会打扰阅读。

一种语言-更少的代码

清单的大小大致相等,但是您会注意到react代码在处理JavaScript代码时会忽略本机特定于平台的代码。 我们的清单包含所有内容,不需要其他代码,也不需要其他样板,项目等。

React Native通过将标签与JavaScript代码混合来进一步有效地将声明性代码混合到常规流中。 是的,它缩短了代码,但也消除了声明式编程价值的很大一部分,即职责分离。

重新加载==应用代码更改

可以通过重新加载来调试React Native,这在使用糟糕的 Android模拟器时会有所帮助。 幸运的是,Codename One不需要该模拟器,也不需要重新启动应用程序即可重新加载已编译的更改…例如,在NetBeans中,只需在调试器中使用“ Apply Code Changes”即可,您的更改将立即镜像到正在运行的应用程序中。

脚本语言在“设备上”存在问题

这并不是“ React Native”特有的rant语,它与将JavaScript打包在应用程序捆绑包中的所有工具有关。 脚本语言非常适合网络使用,就像“管道胶带”一样。 告诉我一个不喜欢胶带的黑客!

发行带有这种胶带的应用程序的诱惑很大,但是与网络不同,在Web上,您可以通过部署新的更新来修复生产中的“奇怪的未定义”错误。 使用应用程序时,您需要通过苹果的审批流程…这意味着在您观察评分下降时,仍会存在生产错误。

是的,单元测试,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跟踪/调试整个代码这一事实非常宝贵。 我们团队具有立即查看谁使用了什么软件以及出于什么目的的功能,这真是令人震惊,我无法理解一个这样的事情是如何由超过2个人的团队使用的,尤其是在分散的员工队伍中。

我喜欢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胜任理由

java胜任理由_Java在几乎所有方面均能胜任本机响应相关推荐

  1. 用java的io做一个代码计数器,如何制作Java页面计数器_java

    大庆采油六厂采油工艺研究所 王兵 王波 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想 ...

  2. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  3. 【源码+教程】Java桌球游戏_Java初级项目_Java练手项目_Java项目实战_Java游戏开发

    今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~课程详细讲解了一个桌球游戏的编写思路和流程,即使你刚学Java没多久,也可以跟随该教程视频完成属于你自己的桌球游戏!同时,还可以加深和 ...

  4. 【源码+项目部署】Java课程设计项目_Java人力资源管理系统

    对就业和毕业都有帮助的Java实战项目来咯--人力资源管理系统! 人力资源管理系统 |Java项目2小时上手编写_源码+数据库拿走不谢!Java实战项目_Java开发https://www.bilib ...

  5. java servlet 请求_Java中前台JSP请求Servlet实例(http+Servlet)

    1.前台jsp代码 himily.jsp,定义了用户名和密码两个输入框,使用post方式提交:/order-web/HimilyServlet其中order-web为站点名称,HimilyServle ...

  6. java框架知识_java框架知识点总结

    java框架知识点总结 面对Java丰富的知识资料,很多初学者难免觉得迷惘,下面是小编为大家整理的java框架知识点总结,欢迎参考~ 1 对象的初始化 (1) 非静态对象的初始化在创建对象时,对象所在 ...

  7. java培训机构_java编程软件培训机构

    java编程软件培训机构,南京小码王科技培训有限公司,欢迎来电预约试听课:13851536647(郑老师)小码王实施以成就感驱动发自内在的建构主义教育,以面向未来高层次人才素质模型为导向,锻炼学生抽象 ...

  8. win7 java jna找不到_java – 资源路径中找不到JNA本机支持(/com/sun/jna/linux-arm/libjnidispatch.so)...

    我已经开始构建一个 java服务,它包含JNA以加载本机C/C++库,我想在Raspberry PI aka arm平台上运行java服务.我已成功建立了稳定的服务基础,它在 Windows7和lin ...

  9. java and运算_JAVA中逻辑运算符“|”和“”与“||”和“”的用法

    1.使用规则: (1)& 可以用作逻辑与的运算符,表示逻辑与(and) a.当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false ...

最新文章

  1. 我的《机器学习》课程的课件合集下载
  2. 解决python2.7 UnicodeDecodeError和UnicodeEncodeError问题
  3. Bash Shell学习笔记四
  4. Windows注销后nginx.exe文件仍能继续运行
  5. R语言探索性因子分析练习
  6. 从0开始:win10系统下基于V831的目标检测
  7. 《网络攻防技术与实践》(诸葛建伟)读书笔记
  8. [前端框架]-VUE(下篇)
  9. python获取鼠标的当前坐标
  10. VS2019安装教程(C语言)
  11. 神经性脚臭案例整理(五)
  12. 你的链上资产存储安全吗?交易自由吗?
  13. hexo 博客创建、部署、美化过程记录
  14. 如何制作动态海报?教你一招在线合成GIF海报
  15. 深度学习之环境配置--配置d2lzh_pytorch包
  16. 京东一面,面试官问我如何用 Nginx 禁止国外 IP 访问网站,我直接凉凉!
  17. 16进制unicode编码转string
  18. 在农村一年能收入20万以上的生意项目,现在还有哪些?推荐一下
  19. 【企业管理】72套初创公司创业团队股权分配方案
  20. 微信帐号开发:sae bae微信上墙|微信墙完美版(php源码,lidc虚拟主机源码(idc虚拟主机源码)...

热门文章

  1. P1313-计算系数【组合数,二项式定理】
  2. codeforces1437 E. Make It Increasing——最长上升子序列
  3. 【LCT】魔法森林(P2387)
  4. SpringBoot2.1.9 多Kafka消费者配置
  5. artTemplate的空白输出坑
  6. String 使用不当可能导致内存泄露
  7. JavaFX UI控件教程(十四)之Tree View
  8. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
  9. 关于java流的几个概念:IO、BIO、NIO、AIO,有几个人全知道?
  10. JAVA面试题-小白