Skip to content

Commit

Permalink
feat: update
Browse files Browse the repository at this point in the history
  • Loading branch information
tong committed Jul 11, 2024
1 parent cc53d64 commit 6018d1b
Showing 1 changed file with 41 additions and 2 deletions.
43 changes: 41 additions & 2 deletions dev/content/_posts/computer/Dive Into Design Patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,9 @@ class Dog extends Animal {
对前端来讲,提高开发UI体验的最好编程方式就是函数式。`状态默认都是不可变的,简洁,易用性高,关注点都在UI上面`
并且最最最重要的是组合性更高。

**很长一段时间我认为FP编程很容易变成面向过程式开发(毫无设计感的编程方式),确实是如此,它对前期的设计和抽象能力要比面向对象还复杂,在没有合适的框架和语言原生支持的情况下 !!!!**


```javascript
const cart = [
{ name: 'Laptop', price: 999.99, quantity: 1 },
Expand All @@ -209,7 +212,43 @@ console.log(`Total price of expensive items: $${totalPrice.toFixed(2)}`);
这种高阶函数和纯函数的组合是非常清晰,并且是状态安全的,并不像OOP一样,它会有潜在的状态变更风险。

所以拿这种编程范式来说,它再适合渲染不过了。因为渲染周期中最容易维护和调试开发的场景就是状态唯一,

状态不变更。而持久化的状态并不属于渲染逻辑,它只负责取状态,至于状态是什么是通过其他模块构造的。

当只谈论逻辑实现时,函数式的实现要比OOP形式上不是那么的`《内聚》`,因为从一开始设计时FP就是拆开了揉碎的,
当只谈论逻辑实现时,函数式的实现要比OOP形式上不是那么的`《内聚》`,因为从一开始设计时FP就是拆开了揉碎的写的。

### Immutability

不可变性是函数式中的灵魂,因为在组合使用使用,数据结构会被传递给多个处理单元,在处理过程中如果数据被引用修改,那对测试和调试来说是
一场灾难。。。。


另外呢,有一个小众场景,在数据结构可变的情况下,多线程并发时同时运行一个程序也会导致状态混乱,但我目前没体验过,因为完全可以线程内存隔离😂。


```javascript
const { Map } = require('immutable');

const map1 = Map({ a: 1, b: 2, c: 3 });
const map2 = map1.set('b', 50);

console.log(map1); // 输出 Map { "a": 1, "b": 2, "c": 3 }
console.log(map2); // 输出 Map { "a": 1, "b": 50, "c": 3 }
```

### KEEP pure function

呃,没错,这里重要的不是pure funciton,而是keep。

pure function 表达的思想是没有任何外置状态给函数内逻辑带来副作用,即便是寄存在 Global 中的变量。它都应该通过参数传进来。
并且,`参数固定,返回值一定固定,除非你写的是一个生成随机数的函数。`

这件事理解起起来不难,做起来真的很难。。。我深有体会,有些时候,紧急情况‼️,身不由己,堆成一坨,不敢动了,你懂的😏。

### 语言支持

C类的语言不不偏不倚,半吊子支持了这两种,也许这就是它复杂的原因。。。

JS语言诞生之初,是典型的函数过程式语言,设计的特别简单,也不能说一丝不挂,至少还有一个底裤 prototype... 直到 ES6 才慢慢规范了面向对象的一些
特性,但也都是语法层面,如果想更深度体验 OOP 写JS,最好配合TS。

python呢,它算是玩明白了,万金油,怎么写都行,主打的就是一个要的都要,恰到好处。

0 comments on commit 6018d1b

Please sign in to comment.