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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 张逸

响应式编程的实践 高质量代码的特征 剖析大数据平台的数据处理 剖析大数据平台的数据存储 剖析大数据平台的数据采集 剖析大数据平台的数据源 DDD峰会归来话DDD 贝叶斯定理与直觉 - 张逸 - 博客园 重新审视演进式设计 - 张逸 - 博客园 设计恰如其分的架构 函数式非凡的抽象能力 或许是领域建模的真相 博客新家(agiledon.github.com) 软件系统的稳定性 真实案例引起的对系统健壮性的思考 调整Virtual Box硬盘大小 LA工作第二周体会 LA工作第一周体会 IsDefined的问题
设计匠艺模型
张逸 · 2011-10-18 · via 博客园 - 张逸

sevenprinciple

之前,我曾提出软件设计的七个原则,即重用、扩展、变化(后改为协作)、简约、一致、分离、间接,并在去年的亚太软件研发团队管理峰会阐释过自己的想法。经过这两年的积累,这些内容逐渐丰富起来,而我也根据自己所思所想做了一些调整。我的朋友姜大胡子和刘冰对我提出的这几个原则,表示兴趣和部分认同,但同时也提出一些自己的看法。按照大胡子的意见,一个人的记忆很难记住太多的原则,最好不要超过3个。七个原则好似古龙的七种武器,听起来很拉风,其实会让人难以记忆。

通过反思这几个原则,我固然同意大胡子的看法,但让我愿意改进的根本原因,还在于我发现这几个原则其实并不在一个抽象层次上。例如,重用和扩展,其实是我们希望达成的目标,它与间接、分离等原则有着根本的不同。所以,我一直思考着该如何改进这七个原则。之前,我已经初步对这七个原则进行了划分。但我始终比较纠结,例如在“重用”原则中,我总结了一些好的设计理念。譬如说,通过粒度的划分与依赖的解耦,以保证有效的重用。从这些设计理念来看,至少在这个层次上,这几个原则又是平行的。

上次在北京邦元素咖啡的一次技术人士聚会,大胡子给出了他的一套体系。我很认同他在价值观与原则的一些看法。最近,根据自己的一些思考和深入分析,才发现之前提到的“重用”和“扩展”原则中的设计理念,其实仍然可以通过遵循一致、分离与间接原则来保障。渐渐地,这个模型开始成型了。如上图所示,我将这个简单的模型称为设计匠艺模型。

整体来看,模型分为左、右二图。左图的核心圈,描述的是“简单”价值观。这意味着我们在设计时,需要时刻体现设计的简单性。这同时也是UNIX编程艺术中反复提到的原则。将其放在价值观中,是希望突出它的核心地位。从这点来看,我这个模型与大胡子的模型完全相同。

“简单”价值观的外面,是三个主要原则(核心原则):间接、分离与一致。它们不仅是设计的重要原则,同时也是架构的重要原则,尤其是分离与一致(可以阅读我的这篇博客《软件架构的一致性》),可以通过关注点分离与架构风格一致性,成为软件架构过程中必须遵循的关键原则。这些原则没有包含“抽象”原则,是因为我认为“抽象”其实是“间接”原则的一种体现。“间接”原则的含义更广泛,事实上,它还能够有效地体现对象的封装。正如我的结论,GOF 23种设计模式中,所有模式都体现了“间接”原则。若有不同意见,欢迎PK。

右图是我们在软件设计中必须要达到的目标(或者说是尽可能达到的目标),即软件的可重用性和可扩展性。它事实上可以看做是软件系统的质量属性。在质量属性中还有其他属性,例如安全、性能、可伸缩性、可维护性等,但我认为这些属性更偏向于纯粹的架构过程。而重用与扩展则是架构与设计都需要保证的。

中间的箭头代表设计手段。虽然有很多设计的手段,但我始终认为面向对象设计的最大难点,还是在于职责的识别与分配。这正是我提出“协作”手段的原因。而对于一个好的软件系统而言,和谐的对象协作正是设计的主旋律,也是软件质量的正确保障。图中的三角形表现了“协作”原则的主要内容,包括自治对象、专家模式与场景驱动,中间的一块三角型,则是理想的对象协作模型,即形成好的对象社区。这些内容算是对整个模型的一些补充。

今天打算抛砖引玉,让大家指出模型的不妥之处。这个模型涉及到很多设计的方法、原则,透视了设计的本质,而这些内容则需要大量的篇幅来描述,而这正是我下一本书的主要内容。我会在今后的博客中陆续给出这个设计匠艺模型的细节内容。