南漳网站定制,怎么建设一个开源平台网站,个人营业执照网上注册,爱站工具有加超人下拉系统我与一位同事讨论了Java与JavaScript的话题#xff0c;这是一个有问题的话题。 然后#xff0c;他提到React Native多么出色#xff0c;我决定我必须研究一下#xff0c;也许要为Codename One掌握一些想法…… 那里有一些不错的主意#xff0c;但是它们都不是革命性的或例… 我与一位同事讨论了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