你已经毁了JavaScript
以前
过去我们在页面上用很时尚的方式写了一些确实很可怕的代码,它给我们带来了巨大的麻烦。可能很多人现在还在这样做,但他们不会看这篇博文,我们可以假装他们不存在。
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(各种模式,框架,服务)然后意识到这个世界并不需要你的代码,然后去找一份你确实在行的工作。不要再祸害我们剩下的人了。
你已经毁了JavaScript的更多相关文章
- 不要再使用JS框架了
停止编写Javascript框架吧. Javascript框架就好像死亡和税收一样:终究不可避免它的存在.我确信如果我是那面墙上的一只苍蝇,每次有人开始一个新的网页项目时,第一个问题肯定是我们用的是哪 ...
- 如何编写可维护的面向对象JavaScript代码
能够写出可维护的面向对象JavaScript代 码不仅可以节约金钱,还能让你很受欢迎.不信?有可能你自己或者其他什么人有一天会回来重用你的代码.如果能尽量让这个经历不那么痛苦,就可以节省不少时 间.地 ...
- 用javascript实现简体和繁体字间的转换
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 3种创建、调用JavaScript对象的方法
hey you guys,两个月没有写技术博客了.作为一名有理想.有抱负的程序员,两个月不写技术博客,真该打.业精于勤,荒于嬉.行成于思,毁于随.勤奋是必不可少的,今后养成一周至少一篇博客的习惯.好了 ...
- 全栈project师的毁与誉
全栈(Full Stack)project师.也能够叫全端project师,不管是前端知识,还是后端架构你都要了解.甚至有些调皮的程序猿这样理解全栈project师:全栈project师 = 屌丝战斗 ...
- JavaScript 闭包总结 (深入理解)
什么是闭包 简单的说闭包就是函数里面的函数,<JavaScript高级程序设计>里是这样定义的 闭包是指有权访问另一个函数作用域中的变量的函数. 先看一道面试时经常被考的题目 代码1: & ...
- 写好你的JavaScript
关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 在实际工作中,我们应该经常会看到一些功能上没有问题,但编码风格和规范却十分糟糕的代码,这往往会让人不 ...
- 想成为一个高效的Web开发者吗?来看看大牛分享的经验吧~ #精选JAVASCRIPT前端开发
想成为一个高效的Web开发者吗?来看看大牛分享的经验吧~ 作为一个软(ku)件(bi)工(de)程(ma)师(nong),你有没有觉得做什么事都没时间?没时间学习新东西,没时间去回顾.整理原来写的烂代 ...
- 译|调整JavaScript抽象的迭代方案
原文作者:Kaloyan Kosev 原文链接:https://css-tricks.com/adapting-javascript-abstractions-time/ 翻译译者:小溪里 校对:华翔 ...
随机推荐
- ORA-12516: TNS: 监听程序无法找到匹配协议栈的可用句柄解决方法
1.查看当前连接进程数SQL>select count(*) from v$process;2.查看连接数上限SQL>select value from v$parameter where ...
- 【转】Linux下创建、销毁、使用 SWAP
转自:http://blog.csdn.net/wxqee/article/details/7970110 创建swap文件方法 1) 创建一个足够大的文件 dd if=/dev/zero of=/l ...
- dzzoffice的树型结构用户管理设计
在DzzOffice1.1的开发中,针对用户使用群体重新设计了,机构.部门.用户管理应用. 传统OA,企业相关程序,一般是设置机构-设置部门-设置职位-添加用户这样的步骤.每个步骤分为不同的管理界面. ...
- 网络编程 --- URLConnection --- 读取服务器的数据 --- java
使用URLConnection类获取服务器的数据 抽象类URLConnection表示一个指向指定URL资源的活动连接,它是java协议处理器机制的一部分. URL对象的openConnection( ...
- IT智力题
题目1:你让工人为你工作7天,给工人的回报是一根金条.金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你 如何给你的工人付费? 答案:两次弄断就应分成三份,我把金条分 ...
- Quartz与Spring集成
关于Quartz的基本知识,这里就不再多说,可以参考Quartz的example. 这里主要要说的是,个人在Quartz和Spring集成的过程中,遇到的问题和个人理解. 首先来说说个人的理解: 1. ...
- SQL和NOSQL有区别吗?
在大数据高速发展的今天,数据量在不断的增加,传统的数据库可能不能满足人们的需求了,这个时候新霸哥注意到了NOSQL出现了可以解决这个问题.我们知道sql数据库可以存储数据和处理数据,但是NOSQL最大 ...
- vmware10中开启Intel VT-x
记得刚接触linux的时候,是在win7下使用vmware虚拟机来安装linux,这样就可以方便的一边使用win7娱乐,一边在linux下进行学习.后来发现这种方式使得win7很卡,虚拟机也很卡,让人 ...
- poj 1581 A Contesting Decision
题目大意:有四个题目,有某些队做题,写一个判断程序如:Stars 2 20 5 0 4 190 3 220Stars是队名,2是提交的次数,20是花费的时间,花费时间为0则说明题目提交错误,错误的忽略 ...
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
为什么dubbo启动没有问题? 原文链接:http://www.tuicool.com/articles/YRn67zM 这篇blog源于一个疑问: 我们公司使了阿里的dubbo,但是阿里的开源网站h ...