面向对象
基础概念和实战过程
面向对象
基础概念和实战过程
前言
• 面向对象,是一套理解世界的思想。
• 与之相对,是面向过程的思想。
描述一日的工作生活
面向过程的思想,认为世界是线性的。 面向对象的思想,认为世界是以实体为核心,
用关系构建的网络。
起床
吃早饭
通勤
早班
午休
下午班
通勤
晚饭
睡觉
餐 人
交
通
工
具
家
工
作
闹
铃
房
子 家
具
早
餐
午
餐
晚
餐
食
材
油
条
牛
奶
豆
浆
。
。。
地
铁
汽
车
自
行
车
步
行
。
。。
开
发 测
试
运
维
产
品。
。。
基础概念
软件编程三大范式之一
• 结构化
• 函数式
• 面向对象
面向对象,其应用已经超越了软件开发领域,是一种对现实世界的理解和抽象,
在各种建模场景得到广泛应用。
• 对象(Object):用来抽象现实世界中看得见、摸得着、可感知或可定义的事务(因
此在台湾繁体中文的翻译是“物件”)。对象是数据,以及对数据操作方法的聚合。
• 属性(Attribute):对象的成员,用于存储数据。
• 方法(Method):对象的成员,用于操作数据。
• 类(Class):用于生成对象的模板。强类型面向对象中特有的概念。前端javascript
语言是典型弱类型,其语法正在向强类型进行演进。
基础概念
【人类等复杂物种基因不容易变异,是因为有DNA这模板;病毒等简单物种基因
容易突变,是因为只有RNA这个对象。】
基本概念
面向对象三大特征
• 继承(extends):初始翻译不贴切,应该叫“扩展”。这样就不会误导大陆程序员用“父
子关系”去类比问题。多个模型,共通部分抽象出来;各个模型基于共通模型,去扩展自
身的特殊性。
【英文中,inherited才是继承的意思,这个单词出现的场景,可以用亲子关系去做类比】
• 封装(encapsule):将对象内部细节隐藏保护起来,对外以方法提供访问。对象内部行为
可以自由变化,不会对外部产生影响,避免局部问题造成全局波动。
【对象内部高内聚,对外低耦合】
• 多态(polymorphism):不同的对象,收到同一个消息,可以产生不同的结果。多态性允
许每个对象以适应自身的方式去响应共同的消息。
【朗致中台约定:跨服务间通讯,采用系统广播‘业务事件’的方式去解耦,各服务主动
响应业务事件,并完成自身独立的操作。这是多态的典型应用】
基础概念
面向对象具有普世价值的五条设计原则
SOLID 【下述五个原则首字母的缩写,英文是固体的意思。自身能力不足的时候,不
要轻易尝试挑战这个领域。】
• SRP(单一职责原则):此处经常犯的错误,不是模块的颗粒度拆解的太粗,而是太
细。如果一个功能的变更,需要一大堆的模块共同修改,那就是把不应该拆解的模
块,强行拆解了。这是一种过度设计。
• OCP(开闭原则):对扩展开放、对修改关闭,才更容易积累与沉淀,形成生长。
• LSP(里氏替换原则):同样接口的模块,可以随意替换,而不对系统整体造成影响。
我经常用这种方法,快速发现边界耦合,检验设计的正确性。
• ISP(接口隔离原则):不依赖任何不需要的组件。否则时间长了,系统垃圾,谁都
不敢去清理。
• DIP(依赖反转原则):被依赖的组件,要先行发现并实现,否则工作就会频繁反复。
基础概念
面向对象建模 与UML(统一建模语言)
• 最早的建模方法是Booch方法:Booch最先描述了面向对象的软件开发方法的基础问题,
指出面向对象开发是一种根本不同于传统的功能分解的设计方法。面向对象的软件分
解更接近人对客观事物的理解,而功能分解只通过问题空间的转换来获得。
• 然后是Coad方法:Coad方法是1989年Coad和Yourdon提出的面向对象开发方法。该方法
的主要优点是通过多年来大系统开发的经验与面向对象概念的有机结合,在对象、结
构、属性和操作的认定方面,提出了一套系统的原则。
• OMT方法:是1991年由James Rumbaugh等5人提出来的,其经典著作为“面向对象的建
模与设计”。开发工作的基础是对真实世界的对象建模,然后围绕这些对象使用分析
模型来进行独立于语言的设计,面向对象的建模和设计促进了对需求的理解,有利于
开发得更清晰、更容易维护的软件系统。
设计过程
面向对象建模 与UML(统一建模语言)
• UML(Unified Modeling Language)统一建模语言
ü软件工程领域在1995年~1997年取得了前所未有的进展,其成果超过软件工程领域过
去15年的成就总和,其中最重要的成果之一就是统一建模语言(UML)的出现。
üUML不仅统一了Booch方法、OMT方法、OOSE方法的表示方法,而且对其作了进一步的发
展,最终统一为大众接受的标准建模语言。
• 软件工程中最常用的是UML工具是:用例图、协作图、状态图、活动图、时序图
• 【曾经做过一次分享,对UML做过专门的讲解】
设计过程
建模
• 借助UML工具,先进行系统级的模型抽象。
设计过程
用例图
设计过程
从用户角度描述系统功能。
很少有人用错。
协作图
设计过程
描述协作对象间的关系。
用于矫正全局视野。
状态图
设计过程
专项用于描述状态变化。
用错的人也不多。
设计过程
用来体现一个流程。
同样是直观明确的。
活动图(或流程图、或活动概览图)
设计过程
时序图
时序图,约束对象间的
交互时序,是产品经理
对开发过程,最重要的
逻辑控制手段。
如果时序图由产品经理
绘制,意味着强约束程
序员必须按照此时序编
写代码。
如果时序图由程序员绘
制,意味着强承诺,代
码一定按照时序实现。
横轴的展示的对象,一
定与代码中的实现,一
一对应。
ER图
• 系统级的建模完成,各模块轮廓与边界若隐若现。指导具体模块落地,是自下而上
生长的。首先完成数据库结构设计,而指导数据库结构设计的,是ER图。
即:实体(Entity)-关系(relation)图。
• 实体:客观上可以互相区分的事务就是实体。一个实体可以由若干属性来刻画。
• 关系:反应实体内部或实体之间的关联情况。
开发过程
开发过程
遗传病ER图。ER确立的同时,指导数据库表结构分解。
开发过程
新版
云诊室、云药房、
医保、药监
数据库设计
底层裂缝弥合。避
免用户职责我们: “到底是不是一个
公司出的产
品。。。
”
分层
• 数据库设计完成后,程序员已经对相关软件模块的需求,有了充分的理解,可以启动
开发,开始具体代码的编写过程。
• 软件工程经过漫长的演化周期至今日,将代码的编写,抽象为分层模型去落地。通常
为MVC模型,以及其局部优化的MVVM模型(代码层级有差异,模型层级无本质变化)。
开发过程
MVC分层模型
• M(Model):模型。通常指业务模型。进行业务逻辑的判断,数据库存取。一个模型
可以为多个视图提供服务。
• V(View):视图。用户看到,并与之交互的界面。
• C(Controller):控制器。接受用户的输入并调用模型和视图去完成用户的需求。
开发过程
细分
• VO(Value Object):值对象。用来处理业务数据。
注:前后端彻底分离后,VO不再代表View Object,专指 Value Object。
• DTO(Data Transfer Object):数据传输对象。在数据传输时,负责格式的转化。
• Entity:实体。对应数据库表结构的对象。
• Service:服务。处理具体的业务逻辑。
• DAO:数据库访问对象。用于操作数据库。
开发过程
开发过程
权限控制
• DAC(Discretionary Access Control):自主权限控制。每个操作都有其专门的权限
管控。虽然可以细颗粒度管理,但权限管控过于分散,管理过程极易出错,不实用。
• MAC(Mandatory Access Control):强制访问控制。每个用户都有其专门的权限控制。
操作系统层级可以管的过来,应用程序层级,管不过来。
• RBAC(Role-Based Access Control):基于角色的访问控制。主流:对权限管控的各
个方面都很成熟。
• ABAC(Attibute-Based Access Control):基于属性的访问控制。可以根据具体的业
务场景,去动态新增新的权限控制。这个模型是非常优秀的,代表着未来的方向。不
过当前落地实战时,被程序员们玩坏了,变成了“只有程序员才能动态新增新权限”。
爬坑还需经验教训,当前保持关注。
应用
中台角色管理
应用
把开发好的模
块,分配给指
定产品的指定
角色,用户登
录这个产品,
就可以使用啦。
前述就是面向对象的基本概念,
以及实战过程。
希望对大家有所启发。