真-随手记

一,npm命令参数:--save,--save-d,-g,区别

npm install moduleName : 安装模块到项目目录下

npm install moduleName -g: -g 将模块安装到全局,具体安装到磁盘哪个位置,要看npm config prefix的位置。查看:npm config ls,修改:npm config set prefix

npm install moduleName --save:(简写:-S) -save 将模块安装到项目目录下,并在package文件的dependencies属性写入依赖

npm install moduleName --save-dev :(简写:-D) -save-dev 将模块安装到项目目录下,并在package文件的devDependencies属性写入依赖

npm install moduleName 命令

1. 安装模块到项目node_modules目录下。
2. 不会修改package.json文件。
3. 运行 npm install 初始化项目时不会下载模块。

npm install moduleName -g 命令

1. 安装模块到全局,不会在项目node_modules目录中保存模块包。
2. 不会修改package.json文件。
3. 运行 npm install 初始化项目时不会下载模块。

npm install moduleName --save 命令

1. 安装模块到项目node_modules目录下。
2. 在package.json文件的dependencies 属性将模块依赖写入。
3. 运行 npm install 初始化项目时,会将模块下载到项目目录下。
4. 运行npm install --production或者注明NODE_ENV变量值为production时,自动下载模块到node_modules目录中。

npm install  moduleName --save-dev 命令

1. 安装模块到项目node_modules目录下。
2. 在package.json文件的devDependencies 属性将模块依赖写入。
3. 运行 npm install 初始化项目时,会将模块下载到项目目录下。

4. 运行npm install --production或者注明NODE_ENV变量值为production时,不会自动下载模块到node_modules目录中

二,Object.assign(),讲对象合并到第一个对象中,并返回一个全新的对象

var o1 = { a: 1, d: 4 };
var o2 = { b: 2 };
var o3 = { c: 3 };
 
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3, d: 4 }
console.log(o1);  // { a: 1, b: 2, c: 3, d: 4 }, 注意目标对象自身也会改变。
console.info(o2); // { b: 2 }
console.info(o3); //{ c: 3 }

三,for of 循环获取index值

方法一

for(let [index,elem] of new Map( arr.map( ( item, i ) => [ i, item ] ) )){
  console.log(index);
  console.log(elem);
}

方法二

for (let [m,index] of radioList.entries()) {
	console.log(m);
	console.log(index);
}

注:entries() 方法返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)。

四,面向对象设计和编程遵循的几个原则

1. 单一责任原则(SRP)
      当需要修改某个类的时候原因有且只有一个。换句话说就是让一个类只做一种类型责任,当这个类需要承当其他类型的责任的时候,就需要分解这个类。 类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题,非常耗时耗力。

示例:
新建一个Rectangle类,该类包含两个方法,一个用于把矩形绘制在屏幕上,一个方法用于计算矩形的面积。
Rectangle类违反了SRP原则。Rectangle类具有两个职责,如果其中一个改变,会影响到两个应用程序的变化。
一个好的设计是把两个职责分离出来放在两个不同的类中,这样任何一个变化都不会影响到其他的应用程序。

2. 开放封闭原则(OCP)
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。

(1)通过增加代码来扩展功能,而不是修改已经存在的代码。
(2)若客户模块和服务模块遵循同一个接口来设计,则客户模块可以不关心服务模块的类型,服务模块可以方便扩展服务(代码)。
(3)OCP支持替换的服务,而不用修改客户模块。
示例:
现有定义两种发送消息方法,这两种方法在项目中需要到的页面中调用。这时新加一个发送消息方法,你与定义初新增后还需在发送消息的地方更改。这就很耗时,可改为定义好两种发送消息方法和一个调用发送方法,页面中只需调定义好的统一发送方法即可

3. 里氏替换原则(LSP)

当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系

客户模块不应关心服务模块的是如何工作的;同样的接口模块之间,可以在不知道服务模块代码的情况下,进行替换。即接口或父类出现的地方,实现接口的类或子类可以代入。

4. 接口分离原则(ISP)

不能强迫用户去依赖那些他们不使用的接口。换句话说,使用多个专门的接口比使用单一的总接口总要好。
客户模块不应该依赖大的接口,应该裁减为小的接口给客户模块使用,以减少依赖性。如Java中一个类实现多个接口,不同的接口给不用的客户模块使用,而不是提供给客户模块一个大的接口。

5. 依赖注入或倒置原则(DIP)

1. 高层模块不应该依赖于低层模块,二者都应该依赖于抽象
2. 抽象不应该依赖于细节,细节应该依赖于抽象

这个设计原则的亮点在于任何被DI框架注入的类很容易用mock对象进行测试和维护,因为对象创建代码集中在框架中,客户端代码也不混乱。有很多方式可以实现依赖倒置,比如像AspectJ等的AOP(Aspect Oriented programming)框架使用的字节码技术,或Spring框架使用的代理等。

(1).高层模块不要依赖低层模块;
(2).高层和低层模块都要依赖于抽象;
(3).抽象不要依赖于具体实现; 
(4).具体实现要依赖于抽象;
(5).抽象和接口使模块之间的依赖分离。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值