ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 迪米特原则 最少知识原则 单一职责原则说道:一个对象(方法)只做一件事;那代表着我们要创建更多的对象(方法)来分解一个之前比较大的对象(方法),那分解之后,对象(方法)是小了,好维护好扩展了,但是对象之间的联系却越来越多了,有两个对象非常耦合,怎么办 **【定义】** > **最**少知识原则要求我们在设计程序时,应当尽量减少对象之间的交互。如果两个对象之间不 必彼此直接通信,那么这两个对象就不要发生直接的相互联系。常见的做法是引入一个第三者对 象,来承担这些对象之间的通信作用。如果一些对象需要向另一些对象发起请求,可以通过第三 者对象来转发这些请求 **【优点】** 减少或消除对象之间的耦合程度,提高复用性 **【缺点】** 需要封装对象或者引入一个第三者对象来处理两者之间的联系,有时候第三者对象会复杂到难以维护 **【应用】** 封装是广义上最少知识原则的一种体现,封装的好处是隐藏内部属性、方法、实现细节,只抛出指定数据或对象给外界,外界使用封装对象的对象越少说明联系就越少。另外一种就是两个对象很耦合的时候通过引入第三者来处理两个对象之间的关系 这个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"] ~~~