## 迪米特原则 最少知识原则
单一职责原则说道:一个对象(方法)只做一件事;那代表着我们要创建更多的对象(方法)来分解一个之前比较大的对象(方法),那分解之后,对象(方法)是小了,好维护好扩展了,但是对象之间的联系却越来越多了,有两个对象非常耦合,怎么办
**【定义】**
> **最**少知识原则要求我们在设计程序时,应当尽量减少对象之间的交互。如果两个对象之间不 必彼此直接通信,那么这两个对象就不要发生直接的相互联系。常见的做法是引入一个第三者对 象,来承担这些对象之间的通信作用。如果一些对象需要向另一些对象发起请求,可以通过第三 者对象来转发这些请求
**【优点】** 减少或消除对象之间的耦合程度,提高复用性
**【缺点】** 需要封装对象或者引入一个第三者对象来处理两者之间的联系,有时候第三者对象会复杂到难以维护
**【应用】** 封装是广义上最少知识原则的一种体现,封装的好处是隐藏内部属性、方法、实现细节,只抛出指定数据或对象给外界,外界使用封装对象的对象越少说明联系就越少。另外一种就是两个对象很耦合的时候通过引入第三者来处理两个对象之间的关系
这个demo是我自己编的,大概的意思是一个班级有n个学生,学生有自己的年龄,年龄相等的学生可以做朋友(emmmm,原谅我奇葩的脑洞,还好我没说性别一样的才能做朋友,不然要被在座的各位打屎),如果每次新进来一个学生,都要全班一个学生一个学生的问年龄,那太麻烦了,如果老师入学的时候把学生按年龄分批了,那是不是很好找到,这个按年龄分批次就是引入的第三者来处理这个问题,我不知道够不够形象啊,但是书上的外观模式的代码举例真的辣鸡,不够形象🤣
~~~
let nameList = [{
name: 'eason',
age: 1
}, {
name: 'taylor',
age: 3
}, {
name: 'jack',
age: 2
}, {
name: 'yu',
age: 1
}, {
name: 'xixi',
age: 3
}]
let state = {}
let People = (name, age) => {
let that = {}
that.name = name
that.age = age
that.friends = []
return that
}
// bad
for (let n of nameList) {
state[n.name] = new People(n.name, n.age)
}
let jay = new People('jay', 3)
let syz = new People('syz', 2)
let keys = Object.keys(state)
for (let k of keys) {
if (state[k].age === jay.age) {
jay.friends.push(state[k].name)
}
if (state[k].age === syz.age) {
syz.friends.push(state[k].name)
}
}
console.log('jay-friends', jay.friends) // ["jay", "taylor", "xixi"]
//good
let ageList = []
let ageMap = {}
for (let n of nameList) {
state[n.name] = new People(n.name, n.age)
if (ageList.indexOf(n.age) < 0) {
ageList.push(n.age)
ageMap[n.age] = []
ageMap[n.age].push(n.name)
} else {
ageMap[n.age].push(n.name)
}
}
let addPeople = (name, age) => {
ageMap[age] = ageMap[age] || []
ageMap[age].push(name)
return new People(name, age)
}
let jay = addPeople('jay', 3)
let syz = addPeople('syz', 2)
console.log('jay-friends', ageMap[jay.age]) //["taylor", "xixi", "jay"]
console.log('syz-friends', ageMap[syz.age]) //["jack", "syz"]
~~~
- 视觉规范
- 色彩
- 文字
- 偏移
- 图标
- 列表组件
- 表单组件
- 详情组件
- 其他组件
- 研发规范
- 编码规范
- 函数式编程
- 纯函数
- 柯里化
- 函数组合
- 函子
- 面向对象编程
- 设计原则
- 单一职责原则
- 里氏替换原则
- 依赖倒置原则
- 接口隔离原则
- 开闭原则
- 迪米特原则
- 组合复用原则
- 设计模式
- 创建型模式
- 工厂模式
- 简单工厂
- 工厂方法
- 抽象工厂
- 单例模式
- 建造者模式
- 原型模式
- 结构型模式
- 适配器模式
- 桥接模式
- 过滤器模式
- 组合模式
- 装饰器模式
- 外观模式
- 享元模式
- 代理模式
- 行为型模式
- 责任链模式
- 命令模式
- 解释器模式
- 迭代器模式
- 中介者模式
- 备忘录模式
- 观察者模式
- 状态模式
- 策略模式
- 模板模式
- 访问者模式
- 组件设计规范
- 组件文档编写规范
- 版本管理规范