+++ title = "程序员的底层思维" author = ["SouthFox"] date = 2024-06-23T21:57:00+08:00 lastmod = 2024-10-14T23:26:48+08:00 tags = ["publish"] draft = false +++ ## 抽象思维 P3 {#抽象思维-p3} [抽象]({{< relref "../main/20240623221313-抽象.md" >}})是指将众多事物中的一些共有特性抽取出来。例如实际的牛(实例)和壁画上的简笔画牛(类)。 ### 1.4.3 抽象会导致基本类型偏执 P9 {#1-dot-4-dot-3-抽象会导致基本类型偏执-p9} [抽象]({{< relref "../main/20240623221313-抽象.md" >}})不足导致的[基本类型偏执]({{< relref "../main/20240623222006-基本类型偏执.md" >}})是一种典型的坏味道。 对于一个手机号不仅仅是一个数字类型或是字符串,它或许有区号、校验等属性。 - ISBN: 校验、形式转换 - 货币:数量,单位 ### 1.4.6 不要为了抽象而抽象 P15 {#1-dot-4-dot-6-不要为了抽象而抽象-p15} [抽象]({{< relref "../main/20240623221313-抽象.md" >}})并非百利而无一害,有时只是两个类型碰巧表现一致但底层可是完全不同的类型。 ### 1.5.3 子类应该能完全代替亲类 P22 {#1-dot-5-dot-3-子类应该能完全代替亲类-p22} [SOLID]({{< relref "../main/20240623230409-solid.md" >}}) 原则,其中 I 代表里氏替换原则(Liskov Substitution Principle),即是子类应该替换任何亲类之后依然能正常工作。 例如对于水果,定义 `isSweet` 和 `isJuicy` 为什么不在亲类定义 `isTasty` 然后给具体子类实现? ### 1.5.4 抽象层次应该一致 P24 {#1-dot-5-dot-4-抽象层次应该一致-p24} [抽象一致性原则]({{< relref "../main/20240623233206-抽象一致性原则.md" >}}) Single Level of Abstration Principle SLAP ,意为应该把抽象层次相同的代码放在一起。 例如冲泡咖啡这件事,应该把判断要冲的咖啡和要加的调料方法提前抽出来然后在实际操作中进行实例化而不是直接在冲泡方法中进行判断。 ## 逻辑思维 P31 {#逻辑思维-p31} ### 概念要明确且清晰 P35 {#概念要明确且清晰-p35} 例如线下业务除了「商品」概念还有「货品」概念,概念没理清导致混乱不堪。 ## 结构化思维 {#结构化思维} ### MECE 原则 P61 {#mece-原则-p61} [MECE]({{< relref "../main/20240624235655-mece.md" >}}) 原则 在对整体划分类别时要做到各部分相互独立( mutually exclusive )没有重叠且无遗漏( collectively exhaistive)。 例如对于职业装和季节装的分类就有重叠,但可以加维度变成二维这样就满足 MECE 原则了 ## 批判性思维 {#批判性思维} [批判性思维]({{< relref "../main/20240624235938-批判性思维.md" >}})并不是批评,而是一种分辨、决策能力。 软件领域要对各种概念进行批判,云原生真的好吗?微服务带来了什么问题?敏捷开发呢? ## 维度思维 {#维度思维} ### 5.3.4 分析矩阵 P99 {#82e4078d-12b5-46a9-9205-1536d34fa973} [分析矩阵]({{< relref "../main/20240625000430-分析矩阵.md" >}})是一个分析工具,可以用来将复杂的场景变成「填空题」,选出要用什么策略和模式。例如: | 业务明细 | 美国销售 | 加拿大销售 | 德国销售 | |------|-------|-------|------| | 计算运费 | 按照 UPS 费率 | 按照联邦费率 | 按照德国运货公司 | | 验收地址 | 美国邮递规则 | 加拿大邮递规则 | 德国邮递规则 | | 计算税额 | 美国税收规则 | GPT 和PST | 德国增值税 | | 金额 | 美元 | 加拿大元 | 欧元 | | 日期 | mmddyyyy | mmddyyyy | ddmmyyyy | 由此可以看出对于计算运费、验收地址、计算额度要选用策略模式而金额、日期可构造对应的类。别忘了不要陷入[基本类型偏执]({{< relref "../main/20240623222006-基本类型偏执.md" >}})而只单单吧货币和日期拿字符串来倒腾。 ### 5.5 设计模式中的维度思维 P105 {#5-dot-5-设计模式中的维度思维-p105} [组合优于继承]({{< relref "../main/20240625001256-组合优于继承.md" >}}),对于绘画的「笔」和「颜色」类可以通过桥接模式将抽象和实现分离…… ## 分类思维 {#分类思维} ### 互联网产业分类 P125 {#互联网产业分类-p125} 互联网产业可分为,以是否线上线下 A,B ,其中 B 可以根据地理、产品因素分为 B1,B2: - A: 腾讯、百度、知乎,供给都在线上 - B1: 以 SKU 为供给,阿里巴巴、京东、拼多多 - B2: 以位置,美团、滴滴 ## 分治思维 {#分治思维} 分治思维,分治并: