目录
分类
正确分类的重要性
分类的困难
分类的增量和迭代本质
确定类和对象
经典方法 && 现代方法 (种)
面向对象分析 (主要识别对象)
关键抽象和机制
确定关键抽象
识别机制
面向对象的分析与设计的难点
分类
- 组织知识的手段。
- 【作用】相似性 共性 关键抽象 更小的应用,更简单的架构。
- 【Question】
- 分类在类的构建中发挥了什么样的作用? (结合具体示例加以体会)
![8fd2bea586c5a04f570a07fbe9ebf210.png](https://i-blog.csdnimg.cn/blog_migrate/4417383ca2c61312bad0eef35804d50e.jpeg)
正确分类的重要性
- 在面向对象分析和设计中,相当一大部分活动,可以认为是分类问题。
- 在AI中,分类也是及其重要的,是很多训练的最终目的。
- 分类的关键环节: 发现共性。
- 找出 结构/行为 存在共性的一组事物
- 【分类在面向对象中的作用体现】 分类作用很大
- 【帮助我们确定层次结构】如类之间的泛化、特化、聚合等等。
- 【核心机制的产生】交互中的共同模式 发明机制 核心
- 【模块化】根据类对象的功能分包,进行模块化。
- 【耦合&内聚】
- 【部署】将不同的处理过程分配到不同的处理器上。
![09af00408a0f7ac04e6eb256dce33d9e.png](https://i-blog.csdnimg.cn/blog_migrate/70b5d42cdec7af9092070df3b88b19a2.jpeg)
![cbb153f1a8052f4a7818e082edbe0c3b.png](https://i-blog.csdnimg.cn/blog_migrate/d7c49f59252af4276a4f55b1120bc5ea.jpeg)
![1ba47d49b53270a5c089d840910112ed.png](https://i-blog.csdnimg.cn/blog_migrate/968bbdcd10ce5862839c9bf8ce8f79e0.png)
![f5f6aef1606b1c684fdcc2b8ba43f2e2.png](https://i-blog.csdnimg.cn/blog_migrate/bde36ca97e741aeb0ab364cdc93efba9.jpeg)
分类的困难
前面提到了分类 在面向对象中发挥着十分重要的作用。(可以说,是一种非常基础的能力)。事实上,在数据排查时,也是如此。
- 【造成分类困难的原因】
- 【边界的模糊】一种常见的现象时,一个对象和其它对象区分开来的边界,往往非常模糊。
- 【示例】如膝盖从哪里开始,从哪里结束?
- 【人的角度】
- 分类的角度多种多样,不存在“完美”的分类。 我们需要权衡不同的分类方案。
- 如 flink虽然在目前比较流行/优秀,但随着技术的迭代,新的角度的发现,flink有一天也会被相应的淘汰。
- 明智的分类需要大量的创造性的活动。
- 分类的角度多种多样,不存在“完美”的分类。 我们需要权衡不同的分类方案。
- 【边界的模糊】一种常见的现象时,一个对象和其它对象区分开来的边界,往往非常模糊。
- 【分类需要投入较多的精力】
- 很多艰苦的工作,才能设计出简单的架构。
![268bb9a3d807cc68138a76c37822b785.png](https://i-blog.csdnimg.cn/blog_migrate/45498f6ab9de42454dae12240df5d9e9.jpeg)
![d9abd71bb96501159ae6777e4e617077.png](https://i-blog.csdnimg.cn/blog_migrate/cc047f0ef2815fb9f0aef0dc9d8eb812.png)
分类的增量和迭代本质
- 【一般规律】明智的分类 是 很艰难的智力工作,最好是一个增量式、迭代式的过程来完成。
- 如 flink虽然在目前比较流行/优秀,但随着技术的迭代,新的角度的发现,flink有一天也会被相应的淘汰。
![f550fdc6ac40636e96975c1a9a97ed9d.png](https://i-blog.csdnimg.cn/blog_migrate/28fba8ff8a434364b1ec1c22c115e18c.jpeg)
![b28b17fb093ed2efb8fc8ed3484d3725.png](https://i-blog.csdnimg.cn/blog_migrate/eff6049d23068e2ffbd679d455efe251.jpeg)
![9678e81c6923e31d85111698d6b770bd.png](https://i-blog.csdnimg.cn/blog_migrate/153637461cb0feb0e2b1375b08d48a03.jpeg)
确定类和对象
经典方法 && 现代方法 (3种)
![62f78d9e6c9f8a7b73c258b14f4fca5a.png](https://i-blog.csdnimg.cn/blog_migrate/00b218e01b5882362211316d87b6eaa3.png)
经典分类
- 【核心】根据相关属性作为对象间相似性 分类的依据。
![d38756e2f2b5351800d89d34094c8f14.png](https://i-blog.csdnimg.cn/blog_migrate/2840c5469d8e268d6b7a258ee2d404bc.png)
![e010a6fbed7322a5679c3dd0be8c57dd.png](https://i-blog.csdnimg.cn/blog_migrate/0a7ef3fae08f89d93f9ba226427fdcb0.jpeg)
经典分类的属性选择:
- 【选择分类属性时的建议】 属性之间最好是独立的,不相互影响的。
- 【反例】年龄 和班级 就是关联性相对较大的属性。
- 【属性可测量可不测量】
- 【属性的选择和领域高度相关】
![4ae5acd9b9d5b8c092c79993ff57ca1a.png](https://i-blog.csdnimg.cn/blog_migrate/214d1d037ab603980b1ecae55ed55ae7.jpeg)
![752811a93248c885fd496a9537672cc8.png](https://i-blog.csdnimg.cn/blog_migrate/c385b63fdb7ed89cc0932e1e87e777a2.jpeg)
自然分类的缺陷:
- 自然的分类趋向混乱。
![b6bbd67fe6e4c6af3f0db27665afd497.png](https://i-blog.csdnimg.cn/blog_migrate/51fb7960d2e6a54cf565005125b28778.png)
![469f1d238b020a96f5ef2db58ec2874e.png](https://i-blog.csdnimg.cn/blog_migrate/4b94a4adc1bf314b66b5041bb2003d2c.png)
概念聚集
- 借助概念,来将符合概念的纳入相应的分类中。
- 【分类的大致步骤】
- 形成某个类的概念描述 根据描述,对于实体进行分类。
- 【示例】爱情歌曲
- 【概念描述】表达一个人对于另一个人的爱。
- 爱,这个词是抽象的,是模糊的,这和个人的理解也有一定的关系。
- 【对于实体歌曲的分类】
- 【爱情歌曲】一首歌,描绘两个异性动物之间的快乐生活。 要体会到其深层次的比喻的含义。
- 【非爱情歌曲】国歌。 主题不能反映两人之间相爱。
- 【概念描述】表达一个人对于另一个人的爱。
![a47a16f30d6afd79c56cfad5fa9c8394.png](https://i-blog.csdnimg.cn/blog_migrate/4caaa71e3f64b2271136c85953fc4cbe.jpeg)
原型理论
- 【分类方式】
- 【原型代表】对象的类 由一个 原型对象 代表;
- 【与原型进行比对】对于给定的对象,和原型进行比较,如果相似 该对象属于原型所代表的类。
- 【实际中的应用】
- 论文中,为验证观点,做个简单的原型。用以表明论文中涉及到的关键点。
- Js 中的原型链。 对象模板。
- 对于游戏的归类。
![d18e4287df20d08df109243a644ea395.png](https://i-blog.csdnimg.cn/blog_migrate/d265b3acbcafb579de0c57c5d15d6f30.png)
![b91ff5c0bd413eb68e0bc562b298ef52.png](https://i-blog.csdnimg.cn/blog_migrate/fe078882d2121d80edc3412d20afa833.jpeg)
![1c06307f9162bfc04cf6386675414860.png](https://i-blog.csdnimg.cn/blog_migrate/e9f506984a09a59c73220a4eb97e445f.jpeg)
面向对象分析 (主要识别对象)
![e16060248757102888c826ef4459d9f6.png](https://i-blog.csdnimg.cn/blog_migrate/a4103666babba1ce05e8d3ed30c71719.png)
经典方法 (主要用来识别对象)
![31219f52169fc6a88c2b42d4aab9fa5f.png](https://i-blog.csdnimg.cn/blog_migrate/20372935fc0af1d2d062a9c9db0dc20a.png)
建模时,类和对象的一般来源:
- 【经典方法】是在大量经验基础上,对于建模中存在的模式进行了相应的总结。 形成了某些概念/事物 到 对象的映射。
- 一种可以直接拿来,偷懒的分类框架。
![c01f5c5804af85cef603b63c2e956e2c.png](https://i-blog.csdnimg.cn/blog_migrate/28e5c51ebae205a1a4bff818ae73bf30.png)
数据库建模的角度,来看:
![f05ffea4f1014cc84301b6204dbd7a8b.png](https://i-blog.csdnimg.cn/blog_migrate/4e029e339b8200cba8577651cc76a441.png)
![a4e10adfef6adf9d54754fd72aad9b2f.png](https://i-blog.csdnimg.cn/blog_migrate/591b3e09e4e643561c3c5d80daebd7f4.png)
其它:
![3db69f6b84ab049cc58aa956d6d3a98e.png](https://i-blog.csdnimg.cn/blog_migrate/fc2d6037fe2b93057ddcd95f3cfa2ad8.jpeg)
行为分析
- 【基本思想】将行为 作为 分类的重要依据,作为 识别 类和对象的主要来源。
- 【分类内核】概念聚集 (前面3种分类方法中的第2种)
- 通过概念描述出一个类 然后将符合该概念的实体,划分到该分类中来。
- 站在此处来看,分类需要一定的语言学功底。
![0282a7ba4a698d47960c049d44dc0a64.png](https://i-blog.csdnimg.cn/blog_migrate/93ddbc2caa869971e0267dddddde5361.jpeg)
领域分析
- 区分:问题域 & 解决方案域
![b62d2301173301cf4292c99300a724c9.png](https://i-blog.csdnimg.cn/blog_migrate/3dabe6c3a6b882e75becab426908c131.png)
![24210f888cd2f4e49d31b363df31bfc4.png](https://i-blog.csdnimg.cn/blog_migrate/62c04429144d17407b83f8a241dd0371.jpeg)
用例分析
![c2a5b7dd6d88160011867d1c1b81369a.png](https://i-blog.csdnimg.cn/blog_migrate/69e8fd73b4e2c4bb50f944e3cea20424.jpeg)
其它方法略过 。。。
关键抽象和机制
【关键抽象】
- 【有不同的身份】类/对象 , 问题域词汇表的一部分。
- 【重要作用】给出了 问题的边界。
- 关键抽象描绘了,哪些在关键抽象范围内,哪些在其外。
- 突出系统中的一些事物
- 排除系统之外的事物
![2da23ed1f5ba687924d645a624dbadcd.png](https://i-blog.csdnimg.cn/blog_migrate/bdb5023357ae0237596763e4efb9c4eb.png)
【机制】
- 机制代表行为模式。
![4f98febfedef63179cea63b3f40719cb.png](https://i-blog.csdnimg.cn/blog_migrate/6af00451a32a0e6046d9969a2e7034b5.jpeg)
确定关键抽象
- 【具体问题具体对待】 关键抽象 与 具体领域高度相关。
- 【关键抽象的两个过程】
- 【发现】
- 抽象领域专家所使用的抽象;
- 往往是 问题域 的词汇的一部分。
- 【示例】ATM客户提到的账户、取款 & 存款
- 【发明】
- 通过发明,创造新的类 和对象。 它们不一定是问题域的组成部分,可能是设计/实现 领域的 词汇。
- 【示例】ATM中的关键词汇:数据库,屏幕管理器,队列等。 这部分更多是站在实现角度来确定关键抽象的。
- 【发现】
![b3b7a3af6ccad6d205cb8e89cb6c69f8.png](https://i-blog.csdnimg.cn/blog_migrate/1615faf0ff0a3ad2f16f6c2bc8ff05f5.png)
![1406b6e11097b6f1479ca32b94a6cf78.png](https://i-blog.csdnimg.cn/blog_migrate/f7619e628fe52d514251da251f80d5d5.jpeg)
精化关键抽象:
- 选定关键抽象之后,我们应该在此抽象上做哪些事情?
- 一个抽象的概念,是无法 直接落地到的实现的。我们需要通过细化抽象,使得抽象层次越来越接近落地/实现。
- 【一些具体的问题】 概念/抽象 一 开始并不是‘清晰’的,通过回答下面一些参考的问题,能够让一些边界清晰起来。
- 对象如何创建?销毁?
- 在此对象上,可以执行什么操作?
- …
- 【关于对象抽象活动的观点】
- 面向对象设计 是 增量的,迭代的。
- 【常见的活动模式】
- 从两个类中,提取公共部分到一个新类中。
- 将一个类,分成两个新类。
- 【注意】既不是自顶向下,也不是自底向上 的活动。 而是两者的有机结合。
![ba361539ad89d22374983efa44b898f8.png](https://i-blog.csdnimg.cn/blog_migrate/7a7b77a617532e8c24286a06280b15d6.jpeg)
![c2716700b0270440f365eec18dfe43e0.png](https://i-blog.csdnimg.cn/blog_migrate/6b846b5dddac0ef6c932b0ea124783ab.jpeg)
![37a4679afbfc82279fa682cc864e3ec2.png](https://i-blog.csdnimg.cn/blog_migrate/e4756cfdd19599e974c2171fc89e885b.png)
将类和对象放在正确的抽象层次很难。
- 需要进行大量练习,积累足够的经验。
![e4b308362db208eabc42c4ea0dbcee9d.png](https://i-blog.csdnimg.cn/blog_migrate/a2bc4bea6efce30ca92fcf0c9063aa57.jpeg)
【命名抽象】
![df0b621fbc0658205fdd9144b3a45b0a.png](https://i-blog.csdnimg.cn/blog_migrate/9512cdb067eff9198add97e2cc935169.jpeg)
一般建议:
![b9c7865ba6d60c54b0403c9e9805a356.png](https://i-blog.csdnimg.cn/blog_migrate/9eaea4394a5a2dffdee9442bf98afea2.jpeg)
![5e029f4d10024362bfa9a22e929d5e91.png](https://i-blog.csdnimg.cn/blog_migrate/685e8680fe92e8b3fb39351cb70df107.png)
识别机制
一个简单的示例:
- 【外部视图】驾驶员看到的是外部视图,也就是汽车系统表现出的外部行为;
- 【内部视图】但是,外部视图/行为,是需要内部的机制来进行支撑的。
- 【哪种活动的结果?】设计时的结果
- 【支撑外部视图的内部机制有多种】达到支撑一个外部行为的方式有多种,我们需要从中进行选择/决策。 上面提到的汽车系统,内部机制就存在很多种。
- 【机制的选择】虽然不同机制表现出来的外部行为是等价的,但是在其它方面是存在差异的,比如说代价等。
![40dd35f9ba89c3067bb953b8be6e23dd.png](https://i-blog.csdnimg.cn/blog_migrate/e7fbad3db908afd6101c3ba31437628a.jpeg)
![497c2722df883ef2da13ff2e5b0977d2.png](https://i-blog.csdnimg.cn/blog_migrate/730b92a17af35b390660b94066be37a4.jpeg)
在进行机制选择时,需要考虑的问题:
![447723b1181b6aedc6adf8632091bebe.png](https://i-blog.csdnimg.cn/blog_migrate/bfdda3a85ebd9b91701d8df895c3e080.png)
避免内外违反约定:
- 机制代表战略决策,接口的设计 体现了战术决策。
- 【外部违反】客户违反规定的接口;
- 【内部违反】接口背后的机制 违反了 该规定的行为;
- 【如何进行机制的分析?】
- 使用场景 驱动机制分析过程;
- 【NICE】研究 典型/关键的场景,很重要。
- 使用场景 驱动机制分析过程;
- 【协作模式】
- 开发者决定采用某种协作模式 工作分解到多个对象(相应类的方法)
- 【示例】MVC可以看作是一种 模式/机制,属于战略层面。
![8961bff4950ec8e4c05771ae35a4d5ae.png](https://i-blog.csdnimg.cn/blog_migrate/a12e0769115144cecd49522e4f939483.jpeg)
![53b4102fcfd2f7c9535c4816b971a7e0.png](https://i-blog.csdnimg.cn/blog_migrate/d27b1cee620a3bc98efff0c0669ace4a.jpeg)
机制即模式
- 【我的理解(可能有误)】模式,感觉 是一些在探索过程中,普遍被认可的机制。
- 【机制在底层的表现:食物链的底端】惯用法
- 每个编程语言 有自己的惯用法;
- 许多常见的编程任务都用惯用的实现方式;
- 【框架:食物链的高端】
- 【框架介绍】一组类,为某个领域提供了一组服务。 代表了大规模的复用;
- 【作用】输出了一些类和机制 客户可以使用/扩展 它们;
![ea7b46e595f4fbd43436d2143ebc317b.png](https://i-blog.csdnimg.cn/blog_migrate/8f2bac193093bdab0e1dcf80791d9fb4.jpeg)
![cc9c6a3f642477b084899685cd506f0c.png](https://i-blog.csdnimg.cn/blog_migrate/50a15ce1a4d59d8e8af10375ed9505df.jpeg)
机制的示例(画图机制):【MVC】
- 【画图机制】 几个对象通过协作(内部视图) 为用户展现图片(外部视图)。
- 【对象】窗口、视图、模型、客户
- 【流程】 见下面的文字。
- 【该机制的好处】
- 模型 与 窗口/视图 解耦. 这样解耦之后有何好处? (方便修改、维护)
![61ff8d2f346fd48706d262fbc797bc79.png](https://i-blog.csdnimg.cn/blog_migrate/259c8d8ca36ae0952aaee1e18694dbe5.jpeg)
![41b8587e6981f26808d0905227b8830b.png](https://i-blog.csdnimg.cn/blog_migrate/2a080a75b36b1dcd9b75aaa4867e663f.png)
面向对象的分析与设计的难点
这类问题可以归结为,在方案空间中,选择较好的解的问题。
- 【抽象】抽象的方式多种多样?
- 【连接方式】组合对象的方式多种多样?
- 【语义】表达是否有助于理解?是否能够涌现出需要的功能?
- 单纯看代码,不了解其面向的业务,是不太容易读懂代码的。
![0d8f77619f3d017e9e2353a721a81004.png](https://i-blog.csdnimg.cn/blog_migrate/8fbd1eed7bbf9a6aa5f6555b5eafbd3d.jpeg)
![e10fb453e5911b66dc0fe6a803038f7c.png](https://i-blog.csdnimg.cn/blog_migrate/1665f74132912e9476803bcddb1a4b02.jpeg)
![9f466be5a0cf3705a3b400c0b5f3edeb.png](https://i-blog.csdnimg.cn/blog_migrate/f8e84b513dee27c4a0fa6445c4c44771.png)
![6b0259cbf8c9b1f78a896a024f2797ad.png](https://i-blog.csdnimg.cn/blog_migrate/7834a880999131212e011ac316950970.jpeg)