{"name":"面向对象","id":"编程语言-编程范式-面向对象","content":"\n# 面向对象（Object-Oriented）\n\n## 一、哲学层：世界观与本体论\n\n面向对象不仅是一种编程方法，更是一种**认识世界与管理复杂性**的思想。\n它的核心世界观是：**“一切皆对象”**。\n\n### 1. 世界的对象化视角\n\n现实世界由无数“事物”构成，每个事物既有**状态（数据）**，也有**行为（方法）**。\n当我们用程序描述世界时，就是在为这些事物建立数字化的“投影”：\n\n```java\nclass Person {\n    Date birthday;\n    int getAge();\n}\n```\n\n> 对象是数据与行为的统一体。\n> 类是对象的蓝图，是对世界中“共性”的抽象。\n> 通过封装接口，隐藏内部变化，实现模块化与解耦。\n\n### 2. 抽象的本质\n\n抽象不是“省略细节”，而是“聚焦本质”。\n在复杂系统中，抽象的目标是——**隔离变化、控制复杂性、表达语义**。\n\n> 只暴露稳定的接口，让内部变化不影响外部世界。\n> —— 这正是“封装”思想的哲学根基。\n\n---\n\n## 二、技术层：OOP的结构与机制\n\n### 1. 三大特性\n\n#### （1）封装（Encapsulation）\n\n> 将数据与操作打包成一个最小可维护单元，屏蔽内部实现。\n\n**作用：**\n\n* 降低模块间耦合度\n* 隐藏实现细节\n* 降低变更影响范围\n* 提高可维护性与安全性\n\n```java\nclass Account {\n    private double balance;\n    public void deposit(double amount) { ... }\n    public void withdraw(double amount) { ... }\n}\n```\n\n#### （2）继承（Inheritance）\n\n> 子类继承父类的属性与行为，形成 **IS-A** 关系。\n\n继承带来**复用与抽象**，但也可能引发**脆弱性**。\n继承应当体现语义上的一致性，而非仅仅为了代码复用。\n\n```java\nAnimal dog = new Dog();  // 向上转型\n```\n\n> ✅ 用继承表达概念层次\n> ⚠️ 用组合表达行为复用\n\n#### （3）多态（Polymorphism）\n\n> 同一接口，不同实现。\n\n* **编译时多态**：方法重载\n* **运行时多态**：方法重写 + 动态绑定\n\n多态使得上层依赖抽象，而非具体实现，从而实现**扩展而不修改（Open-Closed Principle）**。\n\n---\n\n### 2. 组合 vs 继承\n\n继承表达“是一种”（is-a），组合表达“拥有一种”（has-a）。\n在现代设计原则中，组合往往比继承更灵活、更安全：\n\n> **“优先使用组合，而不是继承。”**\n\n```java\nclass Car {\n    Engine engine;\n    void run() { engine.start(); }\n}\n```\n\n---\n\n### 3. 类与协作\n\n类是对象的定义，而对象之间的**协作**构成系统行为。\n\n| 方向   | 含义            |\n| ---- | ------------- |\n| 自底向上 | 职责聚合，形成更高层抽象  |\n| 自顶向下 | 职责分解，形成更小粒度模块 |\n\n#### 确定类的原则\n\n* 找出需求中的名词 → 候选类\n* 分析其**状态**与**行为**\n\n  * 有状态有行为 → 概念类\n  * 有状态无行为 → 数据类\n  * 无状态有行为 → 工具类\n  * 无状态无行为 → 可舍弃\n\n---\n\n## 三、技术层延伸：UML 类图关系\n\n| 关系     | 含义     | UML符号 |       |\n| ------ | ------ | ----- | ----- |\n| 泛化（继承） | IS-A   | `A <  | -- B` |\n| 实现     | 接口实现   | `<    | ..`   |\n| 聚合     | 弱整体-部分 | `o--` |       |\n| 组合     | 强整体-部分 | `*--` |       |\n| 关联     | 静态引用关系 | `--`  |       |\n| 依赖     | 临时使用关系 | `..>` |       |\n\n示例：\n\n```mermaid\nclassDiagram\n    Company *-- Department\n    Computer o-- Mouse\n    School \"1\" -- \"n\" Student\n    Vehicle ..> MoveBehavior\n```\n\n---\n\n## 四、实践层：面向对象分析与设计（OOA/OOD）\n\n### 1. 面向对象分析（OOA）\n\n目标：**从需求到模型**，回答“系统要做什么”。\n\n#### 层次结构\n\n* **对象层**：识别问题域中的关键对象\n* **特征层**：定义属性与操作\n* **关系层**：描述对象间关联（继承、依赖、聚合）\n\n#### 流程\n\n1. 从用例（Use Case）出发，分析需求\n2. 识别领域对象与类\n3. 定义属性、行为与约束\n4. 建立关系与包结构\n5. 通过顺序图、状态图描述动态行为\n6. 不断原型验证与迭代\n\n---\n\n### 2. 面向对象设计（OOD）\n\n目标：**从模型到实现**，回答“系统应如何实现”。\n\n主要关注：\n\n* 模块划分与接口设计\n* 抽象层次的组织\n* 可复用结构（框架、组件）\n* 持久化与性能优化\n\n#### 子系统划分\n\n* **人机交互层**：强调易用性与容错性\n* **控制层**：协调流程逻辑\n* **数据管理层**：管理持久化与一致性\n\n> 面向对象设计的核心任务，是在抽象与实现之间架起桥梁。\n\n---\n\n### 3. 面向对象编程（OOP）\n\n当分析与设计模型落实到编程语言中，就形成了 OOP 实践。\n\n#### 程序设计范型演进\n\n| 范型   | 核心思想  |\n| ---- | ----- |\n| 面向过程 | 按步骤执行 |\n| 模块化  | 按功能分块 |\n| 面向对象 | 按职责建模 |\n\nOOP语言的好坏标准：\n\n* 支持类与对象的抽象表达\n* 支持继承、组合、多态\n* 支持消息传递与封装\n\n---\n\n## 五、进化层：设计原则与模式\n\n### 1. 面向对象设计原则\n\n| 原则         | 核心思想            |\n| ---------- | --------------- |\n| **迪米特法则**  | 最少知识原则，只与“朋友”交流 |\n| **合成复用原则** | 多用组合，少用继承       |\n| **共同闭包原则** | 一起修改的类应放在同一模块   |\n| **稳定抽象原则** | 稳定的模块应更抽象       |\n| **稳定依赖原则** | 依赖方向应指向更稳定的模块   |\n\n这些原则共同构成了 **面向变化设计的哲学基础**。\n\n---\n\n### 2. DCI 架构思想\n\n> DCI：Data（数据） + Context（上下文） + Interaction（交互）\n\n* **Data**：对象的状态与属性\n* **Context**：对象在场景中的角色\n* **Interaction**：对象之间的行为协作\n\nDCI 强调从“行为视角”理解对象，使系统更贴近人类的思维方式（故事化建模）。\n\n---\n\n下面是 **完全重写后的第六点**，保持与全文一致的抽象层次与体系化风格，不再陷入语言细节，而是从 **哲学本质 → 抽象模型 → 技术机制 → 设计意义** 的路径展开，让这一章与前文的思想结构完整衔接。\n\n---\n\n## 六、原型式面向对象\n\n传统面向对象语言（Java、C++、C# 等）以 **类（Class）** 为核心组织单位，通过类来抽象共性、由实例表达特性。这是一种 **分类学式的建模方式**：先定义类别，再生成对象。\n\n然而，面向对象的本质并不依赖类。\n在一些语言（JavaScript、Io、Self）中，系统采用 **基于原型（Prototype-based）** 的建模方式，提供了与类式 OOP 不同的对象世界观。\n\n这一节的核心思想是：\n\n> **类不是面向对象的本质，对象之间的“行为委托”才是。**\n\n---\n\n### **1. 哲学本质：从“分类”到“模仿”**\n\n类式 OOP 的抽象方式是：\n\n> 通过“集合归类”理解世界\n> —— 类抽象共性，对象是实例化的个体\n\n而原型式 OOP 的理解方式不同：\n\n> 通过“模仿与委托”理解世界\n> —— 新对象通过模仿已有对象获得行为\n\n这种思维更接近人类学习方式：\n\n* 不是先理解“鸟类”再创建“麻雀”\n* 而是模仿一个具体的“原型麻雀”并进行修改\n\n**不是自上而下的分类式抽象，而是自下而上的原型式抽象。**\n\n---\n\n### **2. 抽象模型：对象即原型、原型即模板**\n\n在原型式 OOP 中：\n\n* 一切皆对象\n* 对象可直接作为其他对象的“原型”\n* 新对象通过 **clone / delegation（委托）** 获得行为\n* 无需事先定义“类”\n\n原型式对象模型由三部分组成：\n\n1. **对象自身的属性与行为**\n2. **原型链接（prototype link）**\n3. **委托链（delegation chain）**\n\n访问属性时的逻辑是：\n\n> **先查自身 → 再向原型委托 → 再向原型的原型委托……**\n\n这条链就是原型式 OOP 的“继承结构”。\n\n---\n\n### **3. 继承机制：行为委托而非结构继承**\n\n类式 OOP 的继承是：\n\n> **结构继承（inheritance）**：\n> 在类定义阶段决定对象的结构与方法集合\n\n原型式 OOP 的继承是：\n\n> **行为委托（delegation）**：\n> 在运行时将对象无法处理的行为委托给原型去处理\n\n两者的核心区别：\n\n| 维度   | 类式 OOP | 原型式 OOP |\n| ---- | ------ | ------- |\n| 抽象来源 | 类（类型）  | 对象（原型）  |\n| 继承时间 | 编译期    | 运行时     |\n| 继承方式 | 拷贝结构   | 委托行为    |\n| 变化方式 | 固定层次结构 | 动态增删属性  |\n| 思维方式 | 分类     | 模仿      |\n\n原型式继承不强调结构，而强调 **关系**：\n\n> “我不会做，但我认识一个会的人。”\n\n这是一种动态、灵活、适应变化的继承方式。\n\n---\n\n### **4. 技术机制：动态对象模型的特点**\n\n虽然本文不深入展开语言细节，但需要理解原型式系统的核心机制：\n\n#### **（1）对象的动态结构**\n\n对象可在运行时增加、修改、删除属性。\n\n这提供了：\n\n* 更灵活的建模能力\n* 对变化的更强适应性\n* 更贴近“脚本式”的编程体验\n\n#### **（2）委托链而非类型体系**\n\n委托链（Prototype Chain）是动态的，可以在运行中改变原型关系。\n\n这使得：\n\n* 对象行为可以在运行时换“父辈”\n* 某些设计模式（如策略模式）可以更自然地表达\n* 对象角色可以根据上下文动态变化\n\n#### **（3）从“类”到“对象”的反向定义**\n\n类式 OOP：**类 → 对象**\n原型式 OOP：**对象 → 原型 →（克隆）→ 子对象**\n\n不再依赖“类型”，而依赖“实例经验”。\n\n---\n\n### **5. 原型式 OOP 的设计意义：更贴近对象本质的协作方式**\n\n原型式 OOP 不只是“没有类”，而是提供了一种更贴近“对象协作本质”的方式：\n\n#### **（1）更贴近 DCI/角色建模思想**\n\nDCI（Data-Context-Interaction）强调：\n\n> 对象在不同上下文中扮演不同角色\n\n原型式 OOP 可以在运行时动态为对象添加行为，非常适合：\n\n* 动态角色绑定\n* 行为注入\n* 上下文驱动协作\n\n#### **（2）更自然地支持行为变化**\n\n许多业务场景中，对象的行为会随时间、状态、上下文而变化，例如：\n\n* 用户从“游客”变为“会员”\n* 订单从“待支付”变为“已发货”再变为“已收货”\n\n原型式模型可以在运行时直接改变行为而无需改变类型。\n\n#### **（3）更轻量的建模方式**\n\n对于原型、大量相似对象、临时角色、动态协作等场景，原型式更自然、更高效。\n\n---\n\n### **6. 类式 vs 原型式：两种对象观的统一视角**\n\n原型式并不是对类式 OOP 的替代，而是一种 **补充性对象观**。\n\n* 类式 OOP 更适合 **稳定结构、大规模系统、静态分析、类型安全**\n* 原型式 OOP 更适合 **动态行为、临时角色、快速建模、脚本化业务**\n\n底层思想统一于：\n\n> **对象是行为的载体，系统由对象协作组成。\n> 类和原型只是两种组织对象的方式。**\n\n---\n\n## 七、总结：从对象到系统的思维闭环\n\n| 层次         | 关注点      | 目标      |\n| ---------- | -------- | ------- |\n| 世界观（哲学层）   | 抽象与封装    | 控制复杂性   |\n| 技术机制（语言层）  | 封装、继承、多态 | 提供结构与语义 |\n| 分析设计（方法层）  | 从需求到模型   | 建立系统蓝图  |\n| 实践与原则（演化层） | 复用与稳定    | 实现可持续演进 |\n\n> 原型式面向对象从“模仿与委托”的角度理解对象，强调动态性、行为协作与运行时结构。\n>\n> 类式 OOP 从“分类与类型”的角度理解对象，强调结构化复用与静态抽象。\n>\n> 两者共同揭示了：\n> **对象的本质不在于类结构，而在于表示抽象与协作的能力。**\n> 它让我们以对象的视角理解世界、抽象系统、驾驭复杂。\n\n","metadata":"","hasMoreCommit":true,"totalCommits":12,"commitList":[{"date":"2025-11-19T15:58:45+08:00","author":"MY","message":"docs(编程语言/面向对象): 重写第六节，引入原型式面向对象概念","hash":"08ca83c2abe3dcfb8f692928e488c5620d68a6ab"},{"date":"2025-10-30T10:42:20+08:00","author":"MY","message":"docs(oop): 重构面向对象编程文档结构与内容","hash":"faaa6941bcd6b4597589b313250254c4ee797d53"},{"date":"2024-02-20T19:56:50+08:00","author":"MY","message":"✏面向对象","hash":"dbc98f116cdb5d69b486c9a1b0207b27c11668a6"},{"date":"2023-12-13T18:54:27+08:00","author":"MY","message":"✏面向对象","hash":"38ce5781c725d419707db601b99a229c7d373724"},{"date":"2023-11-06T20:07:31+08:00","author":"MY","message":"✏集合&面向对象","hash":"1bc147d8eb110fdddea62531487b7c972fd29f15"},{"date":"2023-03-09T07:30:15Z","author":"My","message":"✏面向对象","hash":"c5252b5cbc183510d5ba60f33428619fdbbe5d61"},{"date":"2021-08-09T17:50:52+08:00","author":"cjiping","message":"✏更新 面向对象","hash":"9535c46c5cb2010d80e9589857c726b5f036a285"},{"date":"2021-08-05T21:37:17+08:00","author":"MY","message":"📦整理 编程范式","hash":"5797e4e654e615ab9b65412c48ac2132b116e651"},{"date":"2021-08-03T19:50:20+08:00","author":"cjiping","message":"✏更新 设计原则","hash":"3e1d285a6dac88c5a5f5a3179c5b777517ee55c9"},{"date":"2021-03-17T17:37:58+08:00","author":"cjiping","message":"📦整理 软件工程 理论","hash":"4bdaf047b41bfd74136bca4ac79055ecf91a8392"}],"createTime":"2020-03-08T19:26:08+08:00"}