惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 枫

2015半年记 再写一帖~就《离开上海》一文再说明 再见,上海~非主流码农在上海的9年心路历程 Mac下配置mysql-python 《Rework》摘录读后随感 Event Sourcing与大数据 无题(1) 在Mac上安装Hadoop [原创]一步一步用C#编写三国杀(三):设计流程 [原创]一步一步用C#编写三国杀(二):牌堆的设计 [原创]一步一步用C#编写三国杀(一):规则和需求描述 走进单元测试(3):消灭HttpContext的依赖,兼谈单元测试的设计辅助性 走进单元测试(2):必须要自动化 我也想对广大程序员说一些话 走进单元测试(1):为什么难以广泛应用? 高级语言发展之回归人类思维——听老赵的Session有感 缺乏自信怎么办? 梦话对象之二:事件之无限扩展 梦话对象之一:逃不开的生死问题
梦话对象之三:三要素的差异与统一
· 2010-01-31 · via 博客园 - 枫

这篇说说分类的问题。面向对象的设计从根本上就是一个选择分类的过程,而在分类的过程中,只要不出逻辑上的问题,任何分类都是正确的。所以说,对一个系统进行面向对象的建模,1000个人能建立出1000个不同的模型,但只要建立的模型中没有逻辑问题,都不能说这个建模是错的。只有对系统需求建模的适合与不适合,易扩展与不易扩展之分。而对于开发人员来说,大多数人的思维习惯都是非黑即白的思维,这大概也是真正的对象技术普及不开的原因。

封装,是将分类中的某一层级当成一个最小的不可分割单元来看待。继承,则是对一个单元再进行细分。而多态,就是对封装的行为在细分的过程中消除差异性。由这样的定义可以看到,封装是基础,继承和多态实际是用来处理封装这个单元中的再分类。这三个面向对象的基本概念,构成了一个递归关系,其递归的最终结果,就是我们对象理论构建的基础:Object。

举个例子:在虚拟物品的电子商务系统中谈论订单流程,要求每个虚拟物品的订单都要有一个订单号。而为了在实际操作中可以对订单分类,要求对虚拟物品的每个分类提供一个前缀以区分,比如充值卡的前缀要加上Card,游戏道具的前缀要加上Item。那么根据这样的要求,就可以对虚拟物品这个封装的概念进行细分:充值卡和游戏道具。实际上就是充值卡和游戏道具这两个类继承自虚拟物品这个类。而生成订单号这个操作,很明显对于充值卡和游戏道具是有差异的,因为他们要加的前缀不同,但对于虚拟物品这个概念来说,都是加上前缀这个操作,因此通过override重写,就消除了他们的差异,进行了统一。

一个真正完美的系统,应该是由无数的不可再分割的单元组合而成,即只有封装,没有了继承和多态;就如从物理上看任何东西都是由原子构成。但实际操作中,这样构成的系统的继承层次会非常的深,不易于理解和把握。因此设计师就必须进行合理的取舍,把握住这种递归的层级,使得分类看起来直观和易理解。这也揭示了为什么设计就是权衡的过程。

真正理解了这点,设计模式其实也就不难了。设计模式只是这些概念的具体场景应用,其基本思路就是发现变化、封装变化;或者从分类的角度说就是给你提供了一个比较好的分类的依据。而重构,实际就是发现原来的分类不合理,将其进行分类的重新整理。因此对于设计模式的应用,如果理解的深刻,其实在拿到问题的开始就能够发现一个比较好的分类方式,而根本不用后面再来对分类进行重新整理。《设计模式精解》一书中提到的从分析阶段引入模式,实际就是这个道理。