diff --git a/docs/.vitepress/nav.ts b/docs/.vitepress/nav.ts index bcd13bd..9105b3e 100644 --- a/docs/.vitepress/nav.ts +++ b/docs/.vitepress/nav.ts @@ -4,6 +4,7 @@ export default [ items: [ { text: '前端归档(精华)', link: '/Knowledge/' }, { text: '前端散记', link: '/FrontEnd/' }, + { text: '原理分析', link: '/Reveal/' }, { text: '技术专题', link: '/TechnicalTopics/' }, { text: '性能专题', link: '/Performance/' }, { text: '读书笔记', link: '/Notes/' }, diff --git a/docs/.vitepress/sidebar.ts b/docs/.vitepress/sidebar.ts index b6cd2c5..f6b6b23 100644 --- a/docs/.vitepress/sidebar.ts +++ b/docs/.vitepress/sidebar.ts @@ -74,6 +74,12 @@ export default [ }, ], }, + { + text: '原理分析', + collapsible: true, + collapsed: false, + items: [{ text: 'classnames', link: '/Reveal/Classnames' }], + }, { text: '技术散记', collapsible: true, diff --git a/docs/Knowledge/Architect.md b/docs/Knowledge/Architect.md index 04a8d28..715691f 100644 --- a/docs/Knowledge/Architect.md +++ b/docs/Knowledge/Architect.md @@ -94,8 +94,6 @@ 结构化编程范式最有价值的地方在于, 它赋予了我们创造可证伪程序单元的能力 - - - 面向对象编程 面向对象编程对程序控制权的间接转移进行了限制和规范 @@ -107,3 +105,51 @@ 它将计算视为数学函数的求值, 强调使用纯函数和避免可变状态和副作用 核心思想是以函数为基本单位, 通过组合函数来构建程序 + +4. 不可变性 + +所有的竞争问题、死锁问题、并发更新问题都是由可变变量导致 + +如果变量永远不会被修改, 那就不可能产生竞争或者并发更新问题 + +如果锁状态是不可变的, 那就永远不会产生死锁问题 + +5. 一个架构设计良好的应用程序应该将状态修改的部分和不需要修改状态的部分隔离成单独的组件, 然后用合适的机制来保护可变量 + +6. 事件溯源 + +只存储事务记录, 不存储具体状态. 当需要具体状态时, 从头开始计算所有的事务 + +7. SOLID 原则的主要作用就是告诉我们如何将数据和函数组织成为类, 以及如何将这些类链接起来成为程序 + +这里虽然用到了 '类' 这个词, 但是并不意味着我们将要讨论的这些设计原则仅仅适用于面向对象编程 + +这里的类仅仅代表了一种数据和函数的分组, 每个软件系统都会有自己的分类系统, 不管他们各自是不是将其称为 '类', 事实上都是 SOLID 原则的适用领域 + +8. SOLID 原则 + +- SRP: 单一职责原则 + +一个软件系统的最佳结构高度依赖于开发这个系统的组织的内部结构, 每个软件模块都有且只有一个需要被改变的理由 + +- OCP: 开闭原则 + +如果软件系统想要更容易被改变, 那么其设计就必须允许新增代码来修改系统行为, 而非只能靠修改原来的代码 + +- LSP: 里氏替换原则 + +如果想用可替换的组件来构建软件系统, 那么这些组件就必须遵守同一个约定, 以便让这些组件可以相互替换 + +- ISP: 接口隔离原则 + +在设计中避免不必要的依赖 + +- DIP: 依赖反转原则 + +高层策略性的代码不应依赖实现底层细节的代码, 恰恰相反, 那些实现底层细节的代码应该依赖高层策略性的代码 + +8. SRP: 任何一个软件模块都应该只对某一类行为者负责 + +9. OCP: 设计良好的计算机软件应该易于扩展, 同时抗拒修改 + +10. 在一般情况下, 任何层次的软件设计如果依赖于不需要的东西, 都是有害的 diff --git a/docs/Reveal/Classnames.md b/docs/Reveal/Classnames.md new file mode 100644 index 0000000..37bbf18 --- /dev/null +++ b/docs/Reveal/Classnames.md @@ -0,0 +1,18 @@ +[[toc]] + +# classnames + +简单的 classNames 类名连接库 + +## 使用 + +```Js +classNames('foo', 'bar') // 'foo bar' +classNames('foo', { bar: true }) // 'foo bar' +classNames({ 'foo-bar': true }) // 'foo-bar' +classNames({ 'foo-bar': false }) // '' +classNames({ foo: true }, { bar: true }) // 'foo bar' +classNames(null, false, 'bar', undefined, 0, { baz: null }, '') // 'bar' + +classNames('a', ['b', { c: true, d: false }]) // 'a b c' +``` diff --git a/docs/Reveal/index.md b/docs/Reveal/index.md new file mode 100644 index 0000000..7d5f6ca --- /dev/null +++ b/docs/Reveal/index.md @@ -0,0 +1 @@ +[classnames](./Classnames.html)