全栈技巧:从Javascript跳转到Java能有多难?

19-04-15 banq
              

这种转换是不是我自寻烦恼?Javascript是有史以来最好的语言?

现在大多数软件公司都希望能够拥有“广泛的Javascript知识,特别是React,Redux和TDD [测试驱动开发]经验”的人。一些Java知识也很有用。这是现实生活。

简而言之,随着编码领域的发展,以及“服务器工作确实繁重”和“前端展示好东西”之间的界限模糊,对具有多个知识方面的开发人员的需求正在增长。他们想要能够做到这两点的人。这意味着如果你是一个对Javascript有深入了解并拥有大量技术堆栈的开发人员,你可以很愉快编写Angular,React等,但是当用Java启动Tomcat服务器时会吓坏了你。

大约3个月前,我专门在前端堆栈中工作,而且,或多或少完全在Javascript中。我们的应用程序有一个Angular前端和一个连接到数据库的Java服务器,这是一个相当标准的应用程序设置。我对Angular的任何知识都有广泛的了解,但是如果涉及到后端任务工作,我立即被困住了,不得不寻求帮助。这意味着当我等待服务器更改完成时,我最终等待一段时间或者尝试切换焦点并处理其他事情,这会减慢我的速度,也会减慢要求为我做出改变的人。

我决定解决这个问题并决定学习尽可能多的Java来开始理解服务器代码库,并在我们构建的应用程序开发过程中(略微!)对所需的更改做出贡献。在我正在构建的当前应用程序上,我一直在寻找(并参与)Java代码库,仅仅六周多,我虽然不是一个Java专业向导,但我取得了很好的进展,我现在可以有效地为我们团队正在开发的整个技术栈做出贡献。

下面列出了一些简单的建议,它帮助我弥合Javascript和Java之间的差距。这个列表并非详尽无遗,我想有些Java纯粹主义者在阅读时会窒息,但我希望我所学到的经验可能会让其他人成为一个“全栈”开发人员变得更容易比我做的!

在Javascript中以“type类型”开头

虽然这似乎是一个相当无害的概念,但明确定义“类型”的想法(在我看来)是Java和Javascript之间最大的差异之一。那么,什么是类型?

如果我们看一个例子,我们将很快掌握什么是“类型”!

在Java中,如果将字符串定义为:

String myString = "Java is great!";
// OK

一切正常,因为myString的类型被正确识别为String类型。

但是,我们要调用:

Boolean myString = "Java is great!";
// Compiler error!

这将遇到问题,编译将失败。我们已经明确地将myString设置为布尔类型,但之前是将其定义为String类型。

类型本身可能很复杂。具有静态类型的语言(如Java)被称为静态类型语言,并在编译时检查类型,例如上面的示例。另一方面,具有动态类型的语言被称为动态类型语言,并且 - 至关重要 - 在运行时检查类型。

JavaScript是动态类型语言的一个示例,它采用不同的方法。它允许上下文确定正在定义的数据类型。这意味着类型仍然是Javascript中的一个东西,它们只是在引擎盖下处理。所以,在Javascript中定义:

const myString = 'Javascript is easier!';
// OK

这将在运行时确定myString是一个String类型。静态类型语言开发人员最大的一个问题是:无法理解以下是完全有效的(如果设计非常严格)代码,它不会在运行时或编译时中断。

let result = 'Javascript is sometimes a bit daft';
// result is type string
if(result === 'Javascript is sometimes a bit daft') {
    result = 10;
    // result is type int
} else {
    result = true;
    // result is type boolean
}
return result;
// 10 - all compiles OK (?!)

显然,在像Java这样的静态类型语言中,这会引发一堆错误。长话短说:动态类型语言不要求您声明数据类型。JavaScript意味着数据类型,而像Java这样的静态类型语言直接声明它,要求您在使用它们之前声明构造的数据类型。

如果您一直在使用Javascript进行开发并且没有仔细查看您的类型但是您已经正确编码,那么这应该做些转变:逐渐习惯于在Javascript语言内部分配类型是转向静态类型语言(在我们的例子中,特别是Java)。通常有两种方法可以在Javascript代码中明确引入类型:

  • 迁移到Typescript:如果你有容量,那么我真的建议你将你的Javascript移动到Typescript。Typescript编译回Javascript,现在很多编译器可以同时处理这两个问题。
  • 使用flow:作为迁移到Typescript之间的一种中间立场,只是尝试使用Javascript而更多地关注类型推断,Flow充当媒介,推断自己每个变量的类型是什么,并突出显示任何问题更改.js文件中的类型。

学会喜欢流Stream

一个优秀的Javascript开发人员可以使用的最强大的工具之一是能够在阵列上执行许多不同的操作符,采集数据源采取大而笨重地转换连接方法将结果修改为您想要的任何内容。

const myAwesomeArray = ['Java', 'is', 'different', 'to', 'Javascript'];
myAwesomeArray
    .filter(entry => { return entry.includes('Java'); })
    .map(javaEntries => { return javaEntries.toUpperCase(); })
    .slice(-1)
    .reduce((acc, entry) => { return `${entry} is a dynamically typed language!`},'');
    // JAVASCRIPT is a dynamically typed language!

当你开始使用Java时,你首先注意到的是有大量的Lists和Collections,而不是那么多的数组!突然间,你所有的精彩链条都毫无意义,你需要重新学习一切。不要担心!Java 8引入了流媒体的概念。它支持列表和集合的功能操作。意思突然之间,您可以通过Javascript(或至少非常相似的东西)重新使用您知道和喜爱的链接和操作符!

myAwesomeList.stream()
    .filter(entry -> entry.contains("Java")
    .findFirst()
    .ifPresent(entry -> system.Print(entry.toUpperCase() + "is a statically typed language!");
    // JAVA is a statically typed language

注意那些有多相似?我接受有一些小的差异,但通常有很多重叠。远远超过大多数人的期望!一切都是通过Stream()的力量实现的!

正确设置IDE

这个有点不太明显,乍一看是可以忽略的。使用JavaScript,因为事实上它的动态类型,通常有点对全局和局部变量更宽松,您使用IDE可以是些基本的记事本(我仍然不会推荐它,虽然!)为Javascript编辑的黄金标准(目前对我来说肯定是Visual Studio Code!)

但是,由于编译的复杂性,可以通过正确设置IDE来制作或破坏Java。我不得不建议使用IntelliJ。我目前正在使用终极版。我知道使用它需要花钱,但(对我自己来说,从Javascript学习语言)能够循环每个类和变量的选项,并查看错误和警告,因为值得花钱!

不要害怕问专家!

如果你从Javascript转向Java,不要害怕提出很多问题,这是改进的最快方法!

 

              

2
sinaID99943
2019-04-18 10:20

真是不知所谓,文主认为银行金融,国防,航空等等一些国家重要系统是用啥设计的?javascript吗?

teabag
2019-04-21 12:10

javascript转java基本上除了逻辑判断和循环其他都要再学一遍。在作者看来脚本语言转编译型语言最大的问题竟然在语法问题,不能不让我提出质疑