面向对象思想在工作中已是常识,但你能否清晰阐述它的本质呢?
在我看来,它本质上是对现实世界的一种模拟。其思想根源正来源于我们对现实世界的观察与抽象。
现实世界可以从两个维度理解:
- 静态世界:由不同事物构成,如动物、植物、空气、阳光。
- 动态世界:是事物之间交互的过程,如语言交流、驾驶、进食。
这正是面向对象思想的起源。
当面对一个陌生复杂的问题时,如果能将其与你熟悉的领域关联起来,问题往往会豁然开朗。这就是思维迁移。就像人类参考鸟类发明了飞机一样,我们为何不能将软件开发过程,视为认识并构建一个微型世界的过程呢?
因此,面向对象的核心观点是:应用即世界!
任何软件应用,都可以看作是由不同“事物”及其彼此间的“交互”所构成。只是在软件层面,我们将“事物”具象化为“对象”。
面向对象将“事物”视为 “属性”与“操作”的集合体。以你为例,任何描述你的词汇(如身高、姓名)都是你的属性;你能进行的任何活动(如行走、思考)都是你的操作。
将这一概念转换到软件中,“事物”便成了 “对象”。
与“对象”相伴而生的另一个核心概念是 “类”。类是现实世界事物的一种形式化描述,是创建对象的模板。它将具有相同特征的事物归为一类。例如,在电子商务系统中,用户、商品、订单都是对象。用户下单这一行为,则是用户对象与商品对象进行交互的过程,交互中还会产生新的对象——订单。
面向对象的所有核心特性,都能在现实世界中找到踪迹,最著名的便是三大基本特性:封装、继承、多态。
- 封装:提供了数据隐藏的能力,确保对象内部状态只能通过定义好的接口访问。这就像在现实中,我们无法直接读取他人的思想,只能通过交流(调用接口)来获取信息。
- 继承:子类能够获得父类的属性和方法,并可进行扩展或修改。这类似于生物界的遗传,你从父母那里继承基因,同时又发展出自己的独特性。
- 多态:同一行为(接口)在不同对象上产生不同结果。这正如社会运行的准则:统一标准,多种实现。例如,不同类型的电梯(观光梯、货梯)都响应“上行”指令,但具体的运行方式和内部逻辑各不相同。
理解了面向对象“是什么”之后,我们进入更关键的环节:如何将面向对象的方法应用于实际开发。
面向对象的软件开发通常分为三个阶段:分析阶段、设计阶段和实施阶段。
分析阶段
此阶段目标是梳理系统逻辑,识别需求中的关键实体及其交互关系。例如,在商城系统中分析出“用户”、“商品”、“订单”等实体。输出物通常包括用例图和分析模型(简单类图)。这个过程有助于我们建立系统的逻辑视图。
具体活动包括:
- 确定对象和类:识别系统实体,如“用户”、“商品”。
- 确定结构:建立对象间的继承、聚合等关系,并输出初步类图。
- 确定主题:将系统划分为“用户管理”、“商品管理”等模块。
- 确定属性:定义每个对象的属性,如商品的价格、名称。
- 确定方法:定义对象的操作,如订单的“创建”、“取消”。
- 行为分析:通过顺序图、状态图等建模对象的行为和状态变迁。
在此过程中,应遵循一些设计原则来指导实体识别,如合理运用继承、聚合、关联等,而非随意设计类。
设计阶段
本阶段对分析阶段的成果进行细化与技术设计,关注“如何实现”。具体活动包括:
- 精细化用例:将分析阶段的粗粒度用例细化为包含步骤、异常处理、事务控制和安全需求的详细流程,可辅以交互概览图、顺序图、活动图、状态图等。
- 合理设计类:进行技术性调整。例如,将一个“用户类”按职责拆分为:
- 实体类:对应业务实体,通常映射数据库表。
- 控制类:封装业务逻辑与流程。
- 边界类:负责系统内外交互(如接收请求、返回响应)。
这种拆分遵循 高内聚、低耦合 的原则,目的是解耦与适应变化,类似于MVC模式的思想。在构建健壮的后端服务时,这种职责分离至关重要。
- 详细定义类:完善类的规格,包括属性/方法的可见性、类型、参数、约束条件及职责说明。
- 整体架构设计:考虑复用性、技术选型、设计模式应用,并绘制软件体系结构图(如开发视图、逻辑视图、进程视图、物理视图),从多维度描述系统。
面向对象设计五大原则是合理设计类的核心指导:
- 单一职责原则:一个类只应有一个引起变化的原因。
- 开放封闭原则:对扩展开放,对修改关闭。
- 里氏替换原则:子类必须能够替换其父类而不影响程序正确性。
- 依赖倒置原则:高层模块不应依赖低层模块,二者都应依赖抽象。
- 接口隔离原则:不应强迫客户依赖它们不用的方法。
实施阶段
此阶段是将设计模型转化为实际代码的编程实现过程,即选择具体的编程语言(如Java、Python等)和框架,编写类、方法、接口,并最终集成、测试和部署。这也是将面向对象分析和设计成果落地到真实项目环境的关键一步。
|