<<编写可维护的javascript>> 笔记5(UI层的松耦合)

尾调根系
• 阅读 1663

由于第四章太稀松平常了, 于是就直接跳到第五章了.
这里我就草草的说一下第四章的几个点吧

  1. 在严格模式的应用下 不推荐将"use strict;"用在全局作用域中
  2. 相等. 推荐尽量使用===和!==
  3. eval(). 守则如果是在没有别的方法来完成当前任务, 这时可以使用eval()
  4. 原始包装类型. 不推荐创建类型时用String、Number等创建类型.

从这一章节开始就迈向了我们变成实践的部分了.

5.1 什么事松耦合
很多设计模式就是为了解决紧耦合的问题. 如果两个组件耦合太紧, 则说明一个组件和另一个组件直接相关, 这样的话, 如果修改一个组建的逻辑, 那么另一个组建的逻辑也需要修改. 比如, 结社有一个名为error的CSS类名, 它是贯穿整个站点的, 它被嵌入到HTML中. 如果有一天你觉得error的取名并不合适, 想将它改为warning, 你不仅需要修改CSS还要修改用到这className的HTML. HTML和CSS紧耦合在一起. 这只是一个简单的例子. 想象一下, 如果一个系统包含上百个组件, 那这简直就是异常噩梦.

当你能够做到修改一个组件而不需要修改更多其他组件时, 你就做到了松耦合. 对于多人大型系统来说, 有很多参与维护代码, 松耦合对于代码可维护性来说只管重要. 你要绝对希望开发人员在修改某部分代码时不会破坏其他人的代码.

当你哥大系统的每个组件的内容哟了限制, 就做到了松耦合. 本质上讲, 每个组件主要保持足够瘦身来确保松耦合. 组件知道的越少, 就越有利于形成整个系统.

有一点需要注意: 在一起工作的组件无法达到"无耦合"(no coupling). 在所有系统中, 组件之间总要共享一些信息来完成各自的工作. 这很好理解, 我们的目标是确保对一个组建的修改不会经常影响其他部分.

如果一个Web UI是松耦合的, 则很容易调试. 和文本或结构相关的问题, 通过查找HTML即可定位. 当发生了样式相关的问题, 你知道问题出现在CSS中. 最后, 对于那些行为相关的问题, 你直接去找JavaScript的问题所在, 这中能力是Web界面的可维护性的核心部分.


到这里感触颇深, 对于现在项目各种组件化开发项目对于组件的依赖和优化有着密不可分的关系, 如果你的组件写的足够松耦合的话, 这样对于开发者后期的维护和bug的修改以及新功能的添加来说可以用喜大奔普来形容了. 我在这里可以提供一种方法来设计组件化.

你可以将你的项目主要划分为两种组件, 一个提供各种方法啊执行条件啊获取数据等等的功能另一个只需要来展示它所想要表达的内容. 你只需要将正确的数据传递至展示组件即可.

5.2 将js从css中抽离
在IE8和更早版本的浏览器中有一个特性让人爱少恨多, 即CSS表达式(CSS expression). CSS表达式允许你将JavaScript直接插入到CSS中, 这样可以在CSS代码中直接执行运算或其他操作.

/* 不好的代码 设置元素宽度以匹配浏览器宽度 */
.box {
    width: expression(document.body.offsetWith + "px");

}

CSS表达式包裹在一个特殊的expression()函数中, 可以给它传入任意js代码. 浏览器会以高频率重复计算CSS表达式, 严重影响性能, 甚至在<高性能网站建设指南>也特意提到这点, 避免使用CSS表达式!

5.3 将css从js中抽离
尽量不要直接在js中操作DOM元素的style属性来修改样式. 会对你的项目维护造成很大的麻烦.
比较好的方式就是操作CSS的className, 也就是说你再CSS中定义好类名, 在js中操作元素的className即可.
就是不应当直接操作样式, 以便于保持和CSS的松耦合.

点赞
收藏
评论区
推荐文章
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Karen110 Karen110
4年前
一篇文章带你了解JavaScript this关键字
与其他语言相比,this关键字在JavaScript中的行为略有不同。JavaScript中,this关键字引用其所属的对象。根据使用位置,它具有不同的值。一、前言方法中,this关键字引用其所属的对象。1.this指的是全局对象在函数中。2.this引用全局对象在函数中。3.在严格模式下,this是未定义的在事件中。4.
Stella981 Stella981
4年前
JavaScript编码规范
1前言JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理。本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护。虽然本文档是针对JavaScript设计的,但是在使用各种JavaScript的预编译语言时(如TypeScript等)时,适用的部分也应尽量遵循本文档的约定。2
Wesley13 Wesley13
4年前
@JsonProperty注解的使用
遇到一个问题,前端按照平常方式传给我json对象,属性名和我一致,我在controller层也按平常方式使用@RequestBody注解,用相应的实体类接收参数,但别人可以成功接到参数,而我的却不能,在实体类的成员变量上增加@JsonProperty("属性名"),就解决了问题查了一下这个注解:@JsonProperty此注解用于属性上,作用是把该
Wesley13 Wesley13
4年前
Unity NavMesh (导航网格)初探
Untiy提供NavMesh(导航网格)可使物体实现自动寻路。《Unity人工智能游戏开发》在第四章介绍了NavMesh,里面提供的示例蛮有趣的。使用NavMesh涉及很多界面设置操作,于是写篇笔记记录一下。运行截图示例(https://gitee.com/ylme/unityresource)在Unity5.5中
Wesley13 Wesley13
4年前
iBase4J nginx配置
  iBase4J朋友推荐我看这个项目的。后台搭建还是比较容易的,但是到了前台就彻底懵逼了。因为对angularjs不熟悉。git上的nginx附件也下不下来。加qq群需要50块。那就自己动手吧。但是网上搜索“nginxangularjs"关键词并没有发现一些有价值的文章。  我首先用了在angularjs中添加全局变量varctx "h
Wesley13 Wesley13
4年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Stella981 Stella981
4年前
ES6中箭头函数与普通函数this的区别(转)
看到一篇别人的博客,对this的理解又加深了一些。普通函数中的this:1\.this总是代表它的直接调用者,例如obj.func,那么func中的this就是obj2.在默认情况(非严格模式下,未使用'usestrict'),没找到直接调用者,则this指的是window3.在严格模式下,没有直接调用者的函数中的thi
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
我在前端写Java SpringBoot项目 | 京东云技术团队
前言玩归玩,闹归闹,别拿C端开玩笑!这里不推荐大家把Node服务作为C端服务,毕竟它是单线程多任务机制。这一特性是Javascript语言设计之初,就决定了它的使命\Java【Script】,这里就不多解释了,大家去看看JavaScript的历史就知道啦~