习惯于静态语言的程序员如何应对缺少Javascript工具的问题


28

在我的大部分职业生涯中,我几乎都是使用编译语言(尤其是Java)进行编程的。关于Java,我最喜欢的事情之一是当使用Eclipse之类的工具时,您的生产率如何,实际编写的代码很少。

您可以:

  • 轻松自动地重构您的方法和类
  • 立即查看调用方法或使用常量的所有位置(Open Call层次结构/显示引用)
  • 静态类型意味着您可以使用代码完成来显示对象上可用的所有参数/功能
  • 按住Control键单击函数/成员/类名,直接进入其定义

所有这些功能使我觉得IDE是我最好的朋友。编写Java代码,尤其是了解其他人的程序变得容易得多。

但是,越来越多的人要求我使用Javascript,到目前为止,我的经验一直很消极。

特别是:

  • 没有立即找到函数入口点的方法(纯文本搜索除外,纯文本搜索可能会导致随后在调用层次结构之后进一步搜索方法,而其中两到三个您忘记了从哪里开始)

  • 将参数传递给函数,无法知道该参数上有哪些属性和函数(除了实际运行程序之外,导航至调用该函数的位置,并使用console.logs输出所有属性可用)

  • 匿名函数通常用作回调,这经常导致混乱的代码路径,从而使您无法快速浏览。

  • 可以肯定的是,JSLint在运行时会捕获一些错误,但即使那样,也不如直接在浏览器中的代码下具有红色波浪线那样方便。

结果是您几乎始终需要把整个程序放在脑子里。这极大地增加了编写复杂程序的认知负担。所有这些需要担心的额外东西,在我的大脑中为实际创造力和解决问题的空间减少了。

当然,将对象放在一起而不是编写整个正式的类定义会更快。但是,尽管程序可能会更容易些,编写起来更快,但以我的经验来看,它们却很难阅读和调试。

我的问题是,其他程序员如何应对这些问题?显然Javascript越来越流行,我读的博客都是关于人们如何使用Java的,而不是拼命尝试寻找解决这些问题的方法。

GWT允许您改为使用Java编写Javascript环境的代码,但它似乎没有我所期望的被广泛使用。实际上,人们似乎更喜欢Javascript用于复杂程序。

我想念什么?


8
我对所有在JS中遇到困难的Java开发人员的建议是,学习另一种没有基于C语法的语言。当您回到JS时,它将帮助您克服语法上的相似性,并且可以帮助您开始从语言设计的权衡角度看待事物,而不是从一种编写所有代码的真实方式和方式来看待事物。其他人都会弄错。而且,如果您有编写UI框架的想法,请在学习JavaScript之前,再给我们添上又一个肿的类层叠垃圾,这对无知的CTO来说很容易推销。
埃里克·雷彭

5
伙计,两年前我是个势利小人。既然我最近对Java的使用更加认真,我将尝试提供更多帮助。IDE?查看Jetbrains Webstorm(我仍然主要使用Scite,但WS还不错),但是对于客户端Web,Chrome的开发工具可以很好地完成调试工作,并且在编写代码片段时确实可以自动完成控制台中的代码。另外,请花大量时间考虑OOP。IMO,非可选类和IDE作为人类可读性的替代品,已经在许多Java中彻底杀死了OOP的全部内容。
埃里克·雷彭

2
我感到你很痛苦。Web版本是javascript,它是客户端上的汇编语言。它当然可以很有趣,但是工具集很薄弱,而且您要做的所有额外工作肯定会降低生产率。不过,这就是编程的生命。并非所有事情都必须在最高抽象级别上完成。:-)
Brian Knoblauch

2
@ErikReppen我最初是一名Java开发人员,但是我精通Obj-C,使用Ruby,Delphi,C ++,C#,Prolog,PHP,bash编程,但我仍然发现JavaScript是阅读和维护最差的JavaScript。
苏珊(Sulthan)

2
看一下TypeScript。一旦开始使用它,我就会发现客户端编码更加高效和有趣。很难击败适当的智能感知和早期的编译器警告。
Evgeni

Answers:


22

无法使用动态语言(例如javascript)*基于IDE的精美功能。你必须学会​​没有他们。您必须用更好的设计来替换工具支持。

使用模块模式 -手动或与requirejs之类的工具一起使用。保持模块较小,以便您可以轻松地推理它们。

不要定义太多类型 -使用在调用点附近创建的匿名对象。然后,您可以查看呼叫者和被呼叫者,然后了解发生了什么情况。

尝试避免将您的代码与DOM耦合 -尝试限制您在代码中执行的DOM操作量。如果您可以传入选择器或jQuery集合,请这样做,而不要让您的代码了解页面结构。

* 如果使用的是流行的库,则可能会得到伪造的自动完成功能,但它更像是“显示所有jquery方法”而不是“该对象具有哪些属性”。它可以节省键入内容,但不能保证正确性。


接受这一建议,以获取有关如何处理缺乏工具的建设性建议。
funkybro 2011年

3
“你必须学会​​没有他们。” 或报废它,或使用可生成javascript并具有适当工具的高级语言。
2012年

@Den:您对使用高级工具的高级语言有何建议?以我的经验,高级工具是为流行语言制作的。可以将哪种高级语言编译为javascript以拥有此类工具?
肖恩·麦克米兰

1
@SeanMcMillan:一些.NET(C#/ F#)的实例是 jsil.orgprojects.nikhilk.net/ScriptSharpsharpkit.netwebsharper.com
私室

1
也可以使用@SeanMcMillan Java,请参阅GWT developers.google.com/web-toolkit
funkybro 2012年

24

我想在这个问题上添加一个答案,因为我最近一直在浏览一些好,坏但主要是丑陋的Java,并且我对Java和Java开发人员与JS和JS开发人员实际上可能基于某种类似于有用事实的东西。

有IDE,但有助于理解为什么没有很多

我一直在尝试Webstorm,因为我发现自己被Node开发所吸引,虽然我实际上购买了它还算不错,但是我仍然倾向于在S​​cite中比WS打开js文件更多。这样做的原因是,您可以用更少的钱在JS上做更多的事,而且还因为UI工作可以立即得到反馈,因此浏览器开发工具(尤其是Chrome浏览器和Firebug)实际上非常出色,并且(考虑了非浏览器的上下文) )无需重新编译即可快速轻松地运行更改后的代码。

我相当确信的另一件事是,IDE通过启用您实际上用JavaScript买不起的草率代码来基本上创建自己的需求。是否想了解我们如何在JS中进行管理?首先尝试在没有IDE的情况下尝试用Java写一些不平凡的东西,并密切注意您必须开始思考的事情,这样才能在不移动IDE的情况下真正维护/修改代码,这可能会有所帮助。向前。IMO,无论是否具有IDE,同样的事情对于编写可维护的代码仍然至关重要。如果我必须编写一个为期四年的编程课程,那么为了避免工具和依赖关系发生扭曲,它不会让您在头两年接触IDE。

结构体

经验丰富的JS开发人员可以处理复杂的应用程序,并且可以构造代码。实际上,由于缺乏IDE来为我们阅读代码的早期历史,我们往往不得不擅长做一件事,而且还因为强大的表达语言可以快速地完全表达无法维护的灾难代码库,如果您不认真思考的话。

实际上,最近在了解我们的Java代码库时,我的学习曲线相当陡峭,直到我最终意识到这都不是正确的OOP。类不过是一堆松散相关的方法,它们改变了位于bean或DTO或静态getter / setter中的全局可用数据。基本上,这就是OOP应该取代的那只老野兽。因此,我基本上不再考虑代码。我刚刚学习了快捷键,并在混乱中进行了追踪,一切都变得更加顺利。因此,如果您尚未养成这种习惯,请对OOD进行更多的思考。

一个结构良好的JS应用程序在最高级别上将倾向于由复杂的功能(例如jQuery)和彼此交互的对象组成。我会说,以任何语言编写的结构良好,易于维护的应用程序的标志是,无论您是使用IDE还是Notepad ++进行查看,它都非常清晰易读。这是我高度依赖依赖注入和将测试优先TDD发挥到极致的主要原因之一。

最后,放手上课。学习原型继承。实际上,当您确实需要继承时,它很容易实现。我发现合成方法在JS中往往会更好地工作,而且,当我看到任何一种语言都在继承一个或两个以上级别的继承时,我个人就会开始生病并遭受EXTJS夜惊。

核心原则优先

我正在谈论所有其他良好实践应从中获得的核心内容:DRY,YAGNI,最少惊讶的原则,问题域的清晰分隔,编写接口以及编写易于阅读的代码是我的个人核心。提倡放弃这些做法的任何更复杂的事情,都应视为任何语言的Kool Aid,尤其是像JavaScript这样的语言,在其中很容易为下一个家伙留下非常混乱的代码的遗产。例如,松散耦合是好东西,直到您深入到为止,您甚至无法分辨对象之间的交互发生在哪里。

不要害怕动态打字

JavaScript中没有很多核心类型。在大多数情况下,动态转换规则是实用且直截了当的,但是学习它们很有意义,因此您可以更好地学习管理数据流,而无需不必要的转换和毫无意义的验证例程。相信我。严格类型对于提高性能和发现编译问题非常有用,但是它们不能保护您免受任何侵害。

了解JS函数和闭包的知识

可以说,JS的一流功能是JS赢得“唯一值得与客户端网络联系并获得大奖的语言”的主要原因。是的,实际上存在竞争。它们也是JS的主要功能。我们用它们构造对象。一切都取决于功能。而且它们具有方便的功能。我们可以通过arguments关键字检查参数。我们可以在作为其他对象的方法的上下文中临时附加并触发它们。而且,它们使事件驱动的方法易于实施。简而言之,他们使JS成为降低源代码的复杂性并适应JS本身(但主要是DOM API)的各种实现的绝对野兽。

在采用之前重新评估模式/实践

一流的函数和动态类型使许多更复杂的设计模式在JS中变得毫无意义且繁琐。但是,鉴于JS具有高度的灵活性,其中一些简单的模式非常有用且易于实现。适配器和装饰器特别有用,我发现单例对于复杂的ui小部件工厂很有用,这些工​​厂还充当其所构建ui元素的事件管理器。

遵循语言的领导,事半功倍

我相信其中一名Java主管会提出这样的论点,即冗长实际上是一个积极的功能,可使各方更容易理解代码。g。如果这是真的,那么法律术语将更易于阅读。只有作家才能使他们所写的内容更容易理解,而您只能通过偶尔使自己陷入另一个人的脚步来做到这一点。因此,请接受这两个规则。1.尽可能直接和清晰。2.已经到了该死的地步。这样做的好处是,干净,简洁的代码比必须遍历二十五个层才能从触发器到实际所需的操作要容易理解和维护几个数量级。实际上,大多数提倡使用更严格语言的东西的模式都是针对JavaScript没有限制的变通办法。

一切都是可锻的,没关系

JS可能是最受欢迎的保护主义语言之一。拥抱。它工作正常。例如,您可以通过在构造函数中声明常规变量来编写具有不可访问的持久性“私有”变量的对象,而我经常这样做。但这并不是要保护我的代码或代码用户不受其侵害(他们可以在运行时将其替换为自己的版本)。而是要发出意图,因为这样的假设是,另一个人足够胜任,不想破坏任何依赖关系,并且会看到您并不想直接解决它,也许是有充分的理由。

没有大小限制,只有问题域

我所见过的所有Java代码库最大的问题是类文件过多。首先,SOLID只是您应该已经了解的有关OOP的令人困惑的重复。一个班级应处理一组特定的相关问题。一种方法不是一个问题。仅通过添加所有无用的类语法来引导,就可以使用糟糕的旧链接func-spaghetti C代码。没有大小或方法限制。如果有必要在已经很长的函数,类或构造函数中添加某些内容,则是有道理的。以jQuery为例。它是单个函数中的整个库长工具集,这没有任何问题。我们是否仍然需要jQuery取决于合理的争论,但就设计而言,

如果您只知道Java,请尝试使用不基于C的语法

当我由于喜欢听到有关Django的知识而开始迷惑Python时,我学会了将语法与语言设计区分开来。结果,将Java和C作为它们的语言设计部分的总和而不是它们使用相同语法所做的不同事情的总和来理解变得更加容易。一个不错的副作用是,您在设计方面对其他语言的了解越多,您就可以通过对比更好地了解自己最了解的一种语言的优势/劣势。

结论

现在,考虑所有这些,让我们解决您的所有问题点:

  • 没有立即找到函数入口点的方法(纯文本搜索除外,纯文本搜索可能会导致随后在调用层次结构之后进一步搜索方法,而其中两到三个您忘记了从哪里开始)

Chrome和Firebug实际上确实具有呼叫跟踪功能。但也请参阅我在结构和保持简洁明了方面的观点。您越会认为应用程序是相互封装的,构造良好的大型结构,就越容易弄清问题出在哪里是谁的错。我会说Java也是如此。我们有类似类的函数构造函数,可以完美地解决传统的OOP问题。

function ObjectConstructor(){
    //No need for an init method.
    //Just pass in params and do stuff inside for instantiation behavior

    var privateAndPersistent = true;

    //I like to take advantage of function hoisting for a nice concise interface listing
    this.publicAndPointlessEncapsulationMurderingGetterSetter
    = publicAndPointlessEncapsulationMurderingGetterSetter;
    //Seriously though Java/C# folks, stop with the pointless getter/setters already

    function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
        if(arg === undefined){
            return privateAndPersistent;
        }
        privateAndPersistent = arg;
    }

}

ObjectConstructor.staticLikeNonInstanceProperty = true;

var instance = new ObjectConstructor();//Convention is to  capitalize constructors

在我的代码中,我几乎从不使用对象文字{}作为结构化应用程序组件,因为它们没有内部(私有)变量,而是更喜欢保留它们以用作数据结构。这有助于设定一个保持意图清晰的期望。(如果您看到curl,那是数据,而不是应用程序体系结构的组成部分)。

  • 将参数传递给函数,无法知道该参数上有哪些属性和函数(除了实际运行程序之外,导航至调用该函数的位置,并使用console.logs输出所有属性可用)

再次,请参阅现代浏览器工具。但是,为什么再次运行该程序却如此笨拙呢?客户端Web开发人员通常每隔几分钟就会遇到Reload,因为这样做绝对不需要您花任何钱。再说一遍,应用程序结构可能会有所帮助,但这是JS的一个缺点,当执行合同很关键时,您必须运行自己的验证(我只在暴露于我的代码库所没有的其他事情的端点上这样做) 't控制)。IMO,权衡是值得的。

  • 匿名函数通常用作回调,这经常导致混乱的代码路径,从而使您无法快速浏览。

是的,这对任何不平凡的事情都是不利的。不要那样做 给您的职能孩子起个名字。追踪事物也更容易。您可以在线定义,评估(需要分配)并分配简单的琐碎函数:

doSomethingWithCallback( (function callBack(){}) );

现在,当您跟踪通话时,Chrome将为您起一个名字。对于非平凡的函数,我将在调用之外定义它。还要注意,分配给变量的匿名函数仍然是匿名的。

  • 可以肯定的是,JSLint在运行时会捕获一些错误,但即使那样,也不如直接在浏览器中的代码下具有红色波浪线那样方便。

我从不碰东西。Crockford给社区带来了一些好处,但是JSLint将这条线跨入了风格偏好,并暗示IMO的某些特定要素并不是没有很好的理由,而是不好的部分。绝对忽略与regEx和否定类有关的一件事,后跟*或+。通配符的性能更差,您可以轻松地用{}限制重复。另外,请忽略他关于函数构造函数的任何论述。如果新关键字困扰您,您可以轻松地将它们包装在工厂函数中。在坏建议方面,CSSLint(不是Crockford的)更糟。总是要用盐撒盐进行很多演讲活动的人。有时我发誓他们只是在寻求建立权威或产生新的材料。

同样,您必须通过运行时关注来学习所学到的知识。(这是我在许多Java / C#开发人员中所见过的常见现象)如果两年后仍然看到运行时错误困扰您,我希望您坐下来并在浏览器中重新加载垃圾邮件,直到它陷入。不是编译时/运行时的划分(无论如何也不是可见的-JS现在在JIT上运行)。不仅可以在运行时发现错误,而且以如此便宜的方式轻松地重新加载垃圾邮件并在到达的每个停止点都发现错误非常有益。

并开始使用那些Chrome开发人员工具。它们直接内置在webkit中。右键单击Chrome。检查元素。浏览选项卡。那里有足够的调试功能,并且可以在运行时更改控制台中的代码,这是最强大但不太明显的选项之一。也非常适合测试。

与此相关的是,错误是您的朋友。永远不要写空的catch语句。在JS中,我们不会隐藏或掩埋错误(或者至少我们不应该咳嗽 YUI / cough)。我们参加他们。减少任何内容都会导致调试困难。而且,如果您确实编写了catch语句以隐藏生产中的潜在错误,则至少应静默记录错​​误并记录如何访问日志。


3
支持答案的大小...
弗洛里安·玛格琳

5

您所说的只是Java爱好者看JavaScript的共同经历。

首先回答您的问题...

... 我的问题是,其他程序员如何应对这些问题 ...

答:不。他们通过首先放弃Java崇拜来学习JavaScript哲学。

您必须了解这个前提。JavaScript不是Java。 这与语法无关,而与哲学有关。

现在让我们处理其中的一些...

  • 立即查看调用方法或使用常量的所有位置(Open Call层次结构/显示引用)

    按住Control键单击函数/成员/类名,直接进入其定义

    所有这些都可用-只需选择一个不错的IDE。

  • 静态类型意味着您可以使用代码完成来显示对象上可用的所有参数/功能

    这不是你的问题应对有。这是需要改变您的编程观点的事情。松散类型系统是JavaScript的优势之一。了解松散的打字-并学会欣赏它。此外,代码完成与JS配合得很好。

  • 可以肯定的是,JSLint在运行时会捕获一些错误,但即使那样,也不如直接在浏览器中的代码下具有红色波浪线那样方便。

    Firebug,Chrome / Safari控制台,甚至IDE都可以完成所有任务。

    有JSHint可以执行Java程序员习惯的精妙的静态分析。

  • 结果是您几乎始终需要把整个程序放在脑子里。这极大地增加了编写复杂程序的认知负担。

    错误!相反,JavaScript是一种“轻量级”的编程语言,它鼓励您编写更简单的程序。正如道格·克罗克福德(Doug Crockford)所说的那样,如果您试图用JavaScript编写大量基于模型的程序,它将“惩罚”您。

  • 尽管程序可能更容易编写和编写,但以我的经验,它们很难阅读和调试。

    完全错误!您如何根据编程语言决定可读性?程序可读(或不可读)-不是语言。另外,JavaScript有出色的调试器。

如果我听起来有些粗鲁,请原谅我-但事实是您必须更改 Java才能理解JavaScript。

只有“成熟”的Java程序员才可以欣赏JavaScript,并且您无法掌握那些您不欣赏的JavaScript。再次,对不起,直言不讳。


2
您是否有一个JavaScript IDE的示例,在这里我可以“按住Control键单击一个函数/成员/类名以直接转到其定义”?我将Eclipse用于Java和Scala,但缺少用于JavaScript的良好IDE /编辑器。
乔纳斯(Jonas)

11
准备接受一些批评,但是这里的某些事情是完全错误的。如果创建对象,然后将其传递给函数,可以按住Ctrl键单击该参数并查看其属性吗?不,我不能,因为对象可以是任何东西。如果我拼写错误的对象属性名称之一,会警告我吗?不,它不会,因为这不是JS中的错误,即使它可能永远不是您想要的。有用的代码完成是不可能的。找出函数参数所具有的属性涉及对调用函数的代码进行拼写,以找出对象的创建位置。
funkybro 2011年

3
您可能会抱怨JS的构建方式使IDE很难为您编写代码。我会抱怨,在Java中,我不能仅仅将动态属性粘在我想要的任何东西附近,或者不能在运行时对所有对象进行自省。两种语言的哲学差异很大。我认为,Java和JS开发人员之间的联系比JS与大多数其他语言之间的联系更大。我个人认为C比Java更容易适应,并且我讨厌使用a肿的IDE。
Erik Reppen 2011年

2
即使是Google的Java开发人员,在编写JS时似乎也无法摆脱Java的束缚。sitepoint.com/google-closure-how-not-to-write-javascript
Erik Reppen 2011年

3
您写道:JavaScript不是Java您必须更改Java才能理解JavaScript,然后:只有“成熟”的Java程序员才能欣赏JavaScript ...因此,要理解Javascript,我必须首先精通Java,然后忘记所有有关Java的知识。它?
加勒布

3

通常,很难拥有提到的用于动态语言的工具(除非IDE是运行时的一部分,即Smalltalk)。话虽如此,一旦您学习了一个非常好的文本编辑器,大多数IDE看起来就没有吸引力了-至少这是我的经验。


2

这就是我们使用劣质语言所付出的代价。谁能想到为什么这种憎恶如此流行。缺点远胜于类型错误的语言的优点。

也许我们应该将“ 不合作原则”应用于该垃圾,以使其消失。


3
“类型错误的语言”-许多程序员会不同意您的看法。
肖恩·麦克米伦

7
+ 1,Javascript受欢迎的唯一原因是因为Javascript在正确的时间放置在正确的位置。
maple_shaft

2
噢,你们为Node.js绑定到C ++而不是Java感到难过,不是吗?
Erik Reppen 2011年

1
我不确定“输入错误的语言”是什么意思。JavaScript并非“类型错误”。它是动态类型的,操作可能会导致类型强制。不要责怪该语言,因为您的编辑器/ IDE不知道变量的类型-无论如何您都应该知道它。
瑞安·金纳尔

3
@RyanKinal真的吗?您应该通过内存知道整个应用程序内所有对象和类的所有属性和方法,语言的API以及正在使用的任何库的所有属性和方法吗?您是否拒绝IDE代码完成的概念,这是通过减少认知负担并减少思考的事情来大大提高生产率的?
funkybro 2012年

2

我曾经不喜欢javascript(及其动态类型),但是我逐渐意识到它的面向对象,闭包函数式编程。另外,当我第一次发现它们时,它的全局对象和消除静默类型转换的功能是新鲜空气。

我首选的javascript 想法webstorm,因为它很容易使jQuery 智能文本正常工作(可耻的是它不是免费的)。

另外,我不会说它的增长-已经无处不在。

您的具体要点:

没有立即找到功能入口点的方法

我不明白,这怎么可能更简单?

参数被传递给函数,而无法知道该参数上有哪些属性和函数

如果将您的ide设置为包括对象定义,则对象的属性将通过智能文本提供(但我在这里可能会遗漏您的观点)。

匿名函数通常用作回调,这经常导致混乱的代码路径,从而使您无法快速浏览。

常用用法?如果您不喜欢匿名函数,请不要使用它们。还是您指的是实质上使用它们的jQuery?在大多数Web开发人员中, jQuery 可能是Web开发历史上节省时间最多的一个

JSLint在运行时捕获一些错误

它抓住了所有人,您可以将其纳入自己的想法。或者Webstorm默认包含它(我认为)。


公平地说,普遍存在和流行不一定相同!;-)无论如何,webstorm是JavaScript的出色IDE(尽管不是免费的,但它相当便宜)。我没有使用过它,但我相信IntelliJ(同样来自Jetbrains)包含相同的功能,如果您来自Java背景并且想要使用单个IDE,则可能具有相同的功能。
FinnNk 2011年

好的,也许我需要澄清一下……我的意思是在浏览器/ DOM之外的开发环境中更多地“普及”。即,它在其他替代方法可用的地方使用。“函数的入口点”是指在代码中定位调用函数的点。参数性能:有没有办法一个IDE运行之前需要了解的给定对象的属性!匿名函数:我可能不喜欢它们,但是需要维护其代码的其他函数却喜欢。JSLint的没有知道我是否打错一个给定对象的属性名称,例如。
funkybro

@funkybro“ IDE无法在运行时之前知道给定对象的属性”,只是在IDE中包含“ whateverMyObjectIs.js”作为引用脚本,对于错误输入的属性名称,请尝试使用webstorm这样做(如果我没记错的话)。
NimChimpsky 2011年

3
那没有!考虑以下代码: var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); IDE如何在myFuncparam参数上提供代码完成? param可以是任何类型,任何属性的任何对象。
funkybro 2011年

是的,但是大概您要传递的参数在该上下文中实际上可用。解析器可以解决该问题,而无需自己使用完整的JS解释器。
Erik Reppen 2011年

2

我想念什么?

您错过了Javascript与Java相比具有的两个巨大优势:

  • Javascript代码大约是等效Java代码大小的四分之一。
  • 您无需等待编译和服务器重新启动。

我在JavaScript中的工作方式有所不同。我一次添加一点代码,尽我所能进行测试,然后刷新浏览器并对其进行测试。使用jQuery,我大部分时间只需要几行Javascript。

我发现Java编程的效率相对较低,并且出于两个相同的原因,现在正在用Groovy编写所有服务器端代码。


5
“ JavaScript代码大约是等效Java代码大小的四分之一” <-这就是问题所在!确保仅创建匿名函数并向对象添加额外的属性,然后像纸屑一样将它们扔出去很快。但是,当其他人访问您的代码并试图找出正在发生的情况时该怎么办?此外,Java中更多的代码不一定等于更多的类型……Eclipse为您编写了很多代码。
funkybro 2011年

3
@funkybro:Eclipse编写了它……然后我被困在项目的整个生命周期中。如果需要它,但是一个简单的插件可以生成它,那就是一种语言味道。没错,Javascript类需要更多文档。但是,仅了解Java方法签名也是不够的。
凯文·克莱恩

1
不需要!您可以通过始终使用反射调用方法来模拟Java语言中的Javascript,并且如果您确实愿意,可以仅使用普通对象,列表和映射。但是,大多数开发人员IME(并不是我所承认的全部)选择定义有意义的数据类型,因为他们发现它有助于他们编写可维护的,自说明性的代码!
funkybro 2011年

1
反射是否允许Java在运行时修改对象?闭包怎么样?在批评它或假设使用Java之前先学习该语言,汇编语言之外的最封闭的范式语言可以模拟它。
Erik Reppen 2011年

1
Downvoters:这不是Java与Javascript的公投。毫无理由地拒绝投票是不礼貌的。
凯文·克莱恩

0

我知道这个问题很古老,但是作为一名C ++ / C#程序员,他有相同的感觉,但是在过去的十年中现在已经使用了很多JavaScript,因此我的第一个建议是尝试使用Visual Studio Code

当然,它不能提供可以用强类型语言添加的所有功能,但是确实相差很远。

它还可以从打字稿中获取打字信息并将其应用于JavaScript。即使您从不使用打字稿,当您键入JavaScript时,也可以获得大量的API的代码完成和文档。

所以对你的问题

  • 没有立即找到函数入口点的方法(纯文本搜索除外,纯文本搜索可能会导致随后在调用层次结构之后进一步搜索方法,而其中两到三个您忘记了从哪里开始)

似乎大多数都在VSCode中解决了?

  • 参数被传递给函数,而无法知道该参数上有哪些属性和函数

对于许多IDE,可以通过使用JSDoc样式注释或打字稿记录代码来解决此问题。编辑人员将阅读评论,并为您提供与以前相同的完成效果

匿名函数通常用作回调,这经常导致混乱的代码路径,从而使您无法快速浏览。

作为C#程序员,匿名函数在那里也很常见,并已添加到C ++中。我认为这只是您必须习惯的事情。

同样,尽管回调已大部分被Promise和async / await取代,并且如果您有一个使用回调的api,您可以快速将其包装为使用Promise,然后使用async / await来解决问题。

可以肯定的是,JSLint在运行时会捕获一些错误,但即使那样,也不如直接在浏览器中的代码下具有红色波浪线那样方便。

在Visual Studio Code中,您将获得波浪线。不仅如此,如果您打开ESLint集成,您还将在编辑器中看到大量惊人的警告和/或错误。实际上比我在其他语言中看到的更多。我的经验是,对于C / C#/ Java的linters进行了非常难的编码,因为ESLint既可以进行大规模配置,又可以进行大规模扩展,并且这些流行的库甚至可以集成,从而为您提供有关编辑器中特定库使用情况的建议和警告。我个人没有用其他语言看到过的东西(尽管也许现在其他语言也很常见?)

也是2018年,ES7是新规范,您可以得到class。您始终使用严格模式。您从不使用var并且始终使用constlet而C ++ / C#/ Java程序员很难适应一堆东西。no-undef在ESLint中打开规则,更多问题消失

那就是说,要了解它是如何this工作的,以及函数和方法是如何工作的,因为它与C ++ / C#/ Java不同。

我最初的2-3年的JavaScript令我感到沮丧。在某些时候它点击了。我不再试图强迫它成为C ++ / C#/ Java,现在回过头来,当JavaScript中需要15行的代码用其他语言需要150行时,我感到沮丧。


-1

如果您喜欢IDE并且习惯日食,请查看Aptana作为JavaScript的IDE。我认为它可以满足您的大部分需求。(我个人讨厌IDE,但这是另一回事)。

至于匿名函数,我发现它们是JavaScript中最强大的功能,而在这种情况下尝试使用没有它们的语言来工作是非常痛苦的。

如果您想要其他可以编译为JavaScript的东西,则有很多选择,CofffeeScript,Clojure和GWT都可以想到,但还有其他选择。


2
我曾经尝试过Aptana,这真的很糟糕。它甚至没有自动缩进功能,如果我在同一项目中使用Eclipse和Aptana,它会破坏其他Eclipse编辑器设置的所有项目设置,例如颜色和填充。
乔纳斯(Jonas)

1
我曾经使用它一段时间并讨厌它,但是正如我所说,我讨厌IDE,我确实通过命令行工具进行格式化并在GVIM或emacs中进行编辑(取决于我在做什么)
Zachary K

在开始的几个小时内崩溃了,除了几个文件,我什么都没有打开?拜拜
Erik Reppen 2011年

Webstorm不错。大部分时间我仍然使用Scite,但是在编写Node.js东西时,我开始对IDE有更多的了解,而且我没有从可见的浏览器反馈和开发工具中受益。
埃里克·雷彭

-1

我本人还没有使用过它,但是我看过一些演示,Cloud 9作为JavaScript IDE 给我留下了深刻的印象。

您既可以使用在线服务模型,也可以从GitHub下载它。

作为其IDE质量的证明,Cloud9是使用... Cloud9编写的!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.