你已经毁了JavaScript


发布者 andrewleeson  发布时间 1398362977465
关键字 我要吐嘈  瞎扯 

(注* 之前我们比较过Angular.JS和Backbone, 作者以AngularJS为例,表明了他对JS领域过度使用设计模式的焦躁,言辞激烈,引起广泛讨论)


以前


过去我们在页面上用很时尚的方式写了一些确实很可怕的代码,它给我们带来了巨大的麻烦。可能很多人现在还在这样做,但他们不会看这篇博文,我们可以假装他们不存在。

JS的伟大/了不起/让人惊讶的地方在于没有人想走近它,而且在那些有组织的大型企业中,他们只想呆在他们自己的小世界里,由各种抽象层和XML注入的框架中。


这对于像我这样想要靠这些企业养活,但却不想忍受那由N多层次组成的可怕的“最佳实践”(而且他们会由于担心性能问题不想让非DBA的人动数据库)来说,这非常棒。


更好的是,当这些性能问题出现时,通过写一段前端JS代码,我们可以转危为安。我们可以假装这些性能问题不存在,尽管后台代码很烂但能给用户一个好的体验。


JS已经发展到顶峰


当jQuery出现,这是更好的事。它能将可重复使用的jQuery插件紧密地连接在一起。当NPM面世,我们开始用一种半自动的模块系统来管理这些自包含的小部件,我们最终到达JS的顶峰了。

由于这些小模块及其组合都是有独立功能和小部件,我设想着一个我能用良好的代码库,和出色的优秀的UI团队一起工作的未来。也许我们能从这些企业级的Bean, Orm,各种抽象工厂、方法、模式中,慢慢地夺回代码库的控制权。

我们有一些更有意义的事情需要做,写优秀的代码和构建优秀的框架,并能使我们从繁重的企业框架中解脱出去。

你毁了它

现在,我依然在用JS,但最近我主要还是在用Erlang,创建视频流/编码系统等等,现在我还没有把他们写成博客,但基本上我的后台很性感,我的前台也很性感(facebook的React+NPM填补了空白)。我在Stackoverflow上发现的一些东西,让所有以前苦难日子又重现了,让我惊恐的是,它像性病一样在前端传播,链接在这:

Angular.js: Server vs Provider vs Factory?


好吧,还不算太糟,但让我们来看看投票率最高的答案(好吧,本文发表时就已经不是了)同时观察下它,很显然还是有一些非常满意的用户的:

噢!多谢详细的讲解。你把它变得很容易,让人易于理解。好样的!!

如果我善良的话,我会说这个评论是讽刺的,且整件事就是"Pow 法则"很好的一个例子,但看完整个评论我觉得事情并不是这样的,我没有为此皱眉。

因此,我们看到的第一件事是奇怪的Angular文档的引证,如下面这样:

Angular“服务”是由“服务工厂”创建的一个单例对象。这些服务工厂是函数,反过来,他们也是由“服务提供者”创建的。“这些服务提供者是构造函数”。当实例化时,他们必须包含一个叫$get的属性,它是服务工厂函数的关键。


这TM到底是干什么玩竟儿?我是这样理解的“为了写了Hello World程序,你必须首先创建一个hello world服务来创建hello world工厂来创建hello world应用,这样你就可以在屏幕上输出hello world了”。


什么??我是在读论文吗?这玩意儿真让人凌乱。


不,你不是在阅读论文,显然你在阅读angular文档。


如果这是一篇论文,那么它会试着陈述一些问题的解决方案,而不是给编造出来的问题编造答案(实际上,这不太正确,因为学者们都活在他们的世界里)。

可能大多数创建Angular的情景都是编造的,因为这是我们竟会在前面需要所有这些工厂,代理,服务的唯一原因。这些我们将要使用的代码和说明都来自于幻境,且让人难以相信,这居然不是一个玩笑。

服务,工厂,提供者可以是相同的。

什么?这当然不可以,他们仅仅只是有返回值的函数,让我们继续跟随这疯狂的文档来看看它会发展成什么样。

作为前提,我们得到了一个“汽车实例化”的例子。

通过服务(单例的),你不能实现它,因为不允许被实例化。

为了证明提供者的存在,因为

要实例化,你需要工厂(Factory)或提供者(provider)


不!天哪,这什么玩意儿。

var car = new Car({ cylinders: 4 })

奇怪的“new”关键词。我们在企业级应用中一直在重复这个参数,看到它又出来了,这真的羞辱了我。


Provider能帮你配置应用程序


当然,如果我们需要配置应用程序时,我们可以通过(Provider)配置。但我们怎么配置那些配置应用程序的配置程序呢?


我喜欢下面的代码,它几乎在重复它自己。它甚至不需要评注就就已经很搞笑了。


app.service('CarService', function () {
    this.dealer = "Bad";
    this.numCylinder = 4;
});
 
app.factory('CarFactory', function () {
    return function (numCylinder) {
        this.dealer = "Bad";
        this.numCylinder = numCylinder
    };
});
 
app.provider('CarProvider', function () {
    this.dealerName = 'Bad';
    this.$get = function () {
        return function (numCylinder) {
            this.numCylinder = numCylinder;
            this.dealer = this.dealerName;
        }
    };
    this.setDealerName = function (str) {
        this.dealerName = str;
    }
});
 


为了配置它,我们要做的就是

app.config(function (CarProviderProvider) {
    CarProviderProvider.setDealerName('Good');
});


Hey,这只是一个配置而已——不需要改变任何代码!!

我宁愿写一段相同的原生JS来充实自己,上面的例子简直让我想找个地洞钻,拿头撞墙。

这儿有个小窍门。如果你发现你自己也问同样的问题。如果你发现自己问一个像这样答案的问题,然后此类问题会被问道你已经做错了。

做错这个本来没有什么羞耻的,这没问题——我们都会犯错,但是给出当前这个扯淡的轨迹,我们已经远离我们之前的想法了,我们会成为Angular的顾问,且给我们的学生去上Angular昂贵的培训班。很好——你爱上它了。


你们怎么回事?

我们有美好的东西,你们毁了它。我们有荒唐企业版的出路的,且你不是去学习如何玩弄代码,你只需要让这些Provider/ Factory休息一下,然后把事情做好(不钻研)。


去你们的,我要回家了

没事,实际上我不会再做企业级的东西了。我将问题和答案展示给我的同事们,对于你的付出我们都觉得很好笑,因为愚蠢得简直太好笑了。但是你知道吗?当你们都停止挖这个坑的时候,你们会发现这个坑看起来到底有多深,我会站在外面大声嘲笑你的,因为这还是你自己的错。

开始为自己着想,亡羊补牢为时未晚且学会写一些实际的代码。信息就在那里,你可以做的。如果你需要掌握Factory,Factory Provider和Service Provider(各种模式,框架,服务)然后意识到这个世界并不需要你的代码,然后去找一份你确实在行的工作。不要再祸害我们剩下的人了。


(注* OurJS发表过的另一篇,反模式的文章:他们为什么说面向对象有问题,探讨面向对象的一些缺陷






回复 (35)
  • #
  • #1 xiaoqiao 1398437877089

    还一直想学Angular来着,一直没下手…… 这让我如何是好?

  • #2 oceannut 1398393455000
    angularjs是个框架吧,框架本身会带入一些思维侵入的东西的。比如我们平时的语言交流,语法、用词什么的可以很随便:嗨,吃饭了吗?(还可以说饭吃了吗?)。但是在某些场合下,就要先列个框架,按照这个框架去发言交流。这篇文章的观点实在有点过!!!
  • #3 路大大 1398398181000
    作者在讲一个over-engineering的问题,我们为什么需要配置文件来运行程序。 因为我们需要编译。而js本身是解释性的脚本,我要修改其行为, 直接改代码就可以,不像编译语言。 从而我们可以知道,js本身就是配置文件。 而且更重要的是,js还是动态语言。我随时可以去扩展,修改既有代码(在不修改既有代码的情况下)。 所以作者的意思是,在你还明白js的优雅动人前,别拿你过去所谓的面向对象那一套生搬硬套。 在js我也相信,肯定有更适合它的模式。
  • #4 隔心岛 1398437809000
    @路大大

    CMD 和 AMD 不就是JS的模式嘛……
  • #5 Zack 1398475774000
    翻译的真烂, 译者不会angular.
  • #6 牵着你的手 1398479822000
    @Zack

    差不多就行了,翻译是个体力活。
  • #7 把我还给你 1398731316000
    @oceannut

    你说得似乎有道理。但是解释得太笼统,没有针对性,所以不能说服我。。。
  • #8 彼岸花 1399192483000
    建议看一下原文的评论部分,作者的观点比较狭隘。
  • #9 redstone 1399887405000
    精彩,把我憋了一肚子的话都说出来了。
  • #10 ml4661071 1408600638647

    首先呢,复杂的东西是解决复杂的问题,NG去做这样一个简单的东西,必然是大材小用了。相对就臃肿的很多。我不想说NG好不好,只是NG在某些方面确实能提高一些开发效率。 作者看问题有些偏激,我不知道是针对 NG 还是针对 过度设计。但是很明显,作者并没有真正的去在一个复杂的问题上使用正确的方法。所以对于NG来说,躺着中枪了。 思维取决于每个人,技术选型也是针对每个问题去做的。没有哪一种,或者说我不知道有哪一种方案可以通吃所有的问题。

    接受新的思想,我们才能有新的想法

    @ redstone 如果憋了这样一肚子话 ,可以所出来,哪怕不对。别吧自己憋坏了。

  • #11 雷市吃 1429514041794

    不要为了技术而使用技术,最原生的,可读性最高的,最易维护的,最易更改的代码才是好代码。 什么面向对象,什么Angular,什么ember 都是屎吧。把本身不是面向对象语言强制写成面向对象的方式,都是闲的蛋疼。

  • #12 马仅达 1431764827100

    接受新的思想,我们才能有新的想法。多学学多对比。就能写出更好的东西。 一个东西流行了自然会有他自己的道理

  • #13 鲁又论 1432695998792

    说句不客气的话,没人逼你用,去用你的jquery操作dom吧

  • #14 陈设伙 1437552074414

    @xiaoqiao #0 8年老鸟,看了半天,果断放弃!

  • #15 华世丰 1439577347484

    @Zack #4

    翻译的很好,sb不懂js.

  • #16 华世丰 1439577413490

    @鲁又论 #12

    一看就是受的面向对象的教育。

  • #17 路人甲 1446718105977

    其实很有同感,一些提供简单的基础功能的库是有必要的,但过度封装会适得其反,我是比较喜欢angularJS的数据双向绑定的(尽管很多人诟病脏检测的性能问题),web组件化开发我相信也是未来的方向,angular,react,polymer是其中的佼佼者(angular用directives来实现组件代码真的是很难看!),但感觉angular确实太过冗余了,本来喜欢JS就是它的轻便灵活,现在被他弄得和后端一样复杂了,听说angular2将会有很大的改变,希望变得更好吧

  • #18 饶吸创 1446775926892

    选技术 要么能改善性能 要么可以提升开发效率 angular能做什么呢

  • #19 朱毕有 1446989941855

    我说评论的用户名咋都这么搞笑啊,原来是自动生成的

  • #20 奶牛 1450235486931

    这文章偏激了吧,按作者这么讲,什么面向对象,什么设计模式都不要用了,回归你的面向过程式的编码你可能会开心点,一个技术你觉得它门槛高,但你却瞧不见它批量生产性,未来可扩展性。

  • #21 夏扔爷 1451291427891

    @雷市吃 #10

    的确

  • #22 张乐扬 1451889851654

    哈哈,这用户名是啥意思??

  • #23 卫万仓 1452154235354

    偏激,用原生的JS去开发应用?累的狗一样。

  • #24 林丛饥 1453448857371

    呢哼,正在学习中

  • #25 萧尘伤 1454580250954

    angular js 的优势在于组织大型的代码,如果你只是要写一个hello world,就退下吧,不要乱用这把牛刀。 不要乱说。

  • #26 苏代农 1456996133285

    我选择angular

  • #27 池网奸 1458641245724

    @萧尘伤 #24

    js本来就不适合写前端的大型应用,我们要做的是知道合理拆分页面,最好不要让浏览器提醒你

  • #28 宁介北 1460623799067

    vue.js

  • #29 啧啧 1465199732225

    这翻译看得头痛

  • #30 欧阳正得 1473834199036

    还没学会angular

  • #31 虞弓立 1476415401395

    一些貌似架构的东西,还没意识到他自己有多长的生命周期,就已经被抛弃了,angularJS宁有种乎?不会例外,但是,js还会存在。

  • #32 虞弓立 1476415724167

    其实,我更喜欢用ErLang,但是,我客观地说,纵观历史上的编程语言,只有两种,在应用上属于同一级别,那就是C和js,不服气吗?哈哈,C和js专治各种不服,包含angularJS在内的大多数框架都会被抛弃,但是C和js将屹立不倒。

  • #33 严优几 1491758223265

  • #34 文达处 1515478056721

    毕竟商业化

  • #35 秦网订 1552037488706

    @Zack #4

    123123

微信扫码 立即评论