`
qinysong
  • 浏览: 190768 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于软件设计各种思想的体系—目标/特性/方法/原则和模式

阅读更多
因为已突破原帖子主题“对结构型设计模式的理解”本身含义,所以转移出来
jamesby 写道
qinysong 写道
jamesby 写道
qinysong 写道
jamesby 写道

我觉得降低偶合,也就是解偶是关键,底偶合高内聚,高扩展,高复用是软件设计的目标。

我觉得“底偶合高内聚”应该在设计原则层次,通过原则指导利于达到设计目标——“高扩展,高复用”
我觉得设计原则应该是

面向接口和抽象编程
优先使用组成而不是继承,也就是HAS A OR IS A 等等,

而遵守设计原则的软件就是高内聚底偶合的设计,也就是高扩展,高复用的设计!

我认为高扩展,高复用是终极目标,但是达到了高内聚底偶合的目标也就达到了高扩展,高复用的目标.

嗯,非常好,这样的讨论非常促进我的认识

我想再引入一个词——属性,一个好的软件,一个最大限度接近优秀目标(高扩展,高复用)的软件本身应该具有一些基本属性,就像高尔基说的“不幸的家庭各有各的不幸,而幸福的家庭都是相似的”,软件也是,不好、劣质的软件各有各的不好之处,而优秀的软件(从设计角度来说)却都具有基本的属性,这些属性中我觉得就可以包括“高内聚、底偶合”。

所以“高内聚、底偶合”这是优秀软件的基本属性,而目标是表达我们最大渴望的主观意愿,一个软件只要高扩展,高复用我们就满足了,在这个满足的前提下我们不在乎是不是高内聚低耦合。但是幸福的家庭都是相似的
比喻的不错。

是不是也可以这样理解,软件的终极目标,就是复用。
可复用的软件一定是可扩展的,可扩展的一定具有高内聚、底偶合的特点。

而软件设计原则是达到这个目标的通道。设计模式是这个终极目标的表现方式。


我觉得软件设计有两个大的目标:
第一个:可重用性。可重用性通过复用之前的劳动成果提高了生产效率,降低了成本;
第二个:可维护性。可维护性通过延长系统的使用寿命,增值了产品价值;

要想设计达到这两个目标,系统就需要有一些特性
包括可读性、高灵活性、易扩展性、通用性、可移植性,这些特性是一个系统表现出来的,可概括为“白箱特性”:),而系统内部也要有一些属性,如高内聚、低耦合,这些内部属性更侧重内部结构性,概括为“黑箱属性”。

为了使一个系统具有那些优秀的特性,有一些手段,或者称为方法
这些方法/手段包括抽象(提高通用性)、封装(增强内聚性)、分离(降低耦合性)等等

当对这些方法/手段进行细化、分类、概括时,就产生了一些设计原则/准则
比如面向接口编程、优先使用对象组合、SRP单职责准则、OCP准则等等

这些准则/原则在一定场景下的经典表现方式,就产生了设计模式

以上是个人理解,因为这种层次的划分包括大量的理解上、语义上的因素,所以每个人的划分可能会有不同,不过我感觉这样的划分虽然可能因人而异,但是他可以让我们有一个全局观念,所以还是很有意义的

大家多批评
分享到:
评论
8 楼 qinysong 2007-04-12  
lane_cn 写道
可维护性就是重用性,软件的第一个维护者是开发者本人。
可维护性依靠扩展性,扩展性来自对变化的适应力,而不是对变化的预先判断。
开发迅速,节约成本,高效灵活,结构清晰……这些好的特征在软件上经常是同时存在,同时消失。

我有两点补充:
第一,可维护性和可重用性并不相同
第二,某些好的特征是相互竞争的,需要根据需要加以平衡,比如易用性和灵活性,简单性和扩展性等
7 楼 jamesby 2007-04-07  
我现在有一个问题就是什么是可维护性,可维护性是指系统要不停的添加新的功能或者需要不停的对现有功能的修改?

其实有些时候真的搞不清楚,感觉这些词的意义都差不多,好象包含了一个特征就同时具有了另外几个特征。

就象lane_cn说的

引用
可维护性就是重用性,软件的第一个维护者是开发者本人。
可维护性依靠扩展性,扩展性来自对变化的适应力,而不是对变化的预先判断。
开发迅速,节约成本,高效灵活,结构清晰……这些好的特征在软件上经常是同时存在,同时消失。


6 楼 jamesby 2007-04-05  
lelong 写道
EJB 不是组件级别的重用吗?
我个人理解,如果一个EJB组件只被一个应用程序使用那就是组件,但是我将企业的很多通用的功能都封装成EJB,这些通用的EJB被企业的N个系统共同使用,你能说这时候的EJB是组件级别的?

PS:自己理解!
5 楼 lelong 2007-04-05  
EJB 不是组件级别的重用吗?
4 楼 lane_cn 2007-04-05  
可维护性就是重用性,软件的第一个维护者是开发者本人。
可维护性依靠扩展性,扩展性来自对变化的适应力,而不是对变化的预先判断。
开发迅速,节约成本,高效灵活,结构清晰……这些好的特征在软件上经常是同时存在,同时消失。
3 楼 qinysong 2007-04-05  
xly_971223 写道
那么可重用行跟可维护性之间有什么关系呢?是不是复用度高的的软件可维护性就高呢?
复用度高的程序--->内聚性强--->可维护性高
复用性高的程序其内聚性一定强,内聚性强的程序则更容易维护

对于可重用性和可维护性之间的关系,我也一直琢磨不定,到底是应该把这两者放到一个层次,还是把可维护性作为可重用性自身的一个连带属性,起初我也和xly_971223以及jamesby具有相同的看法——重构是软件设计的终极目标,但是《重构-改善既有代码的设计》第13章Wiliam的经历让我提升了可维护性的重要性,对于较大的项目以及版本需要不断升级的产品,可维护性就变得相当重要。

下面是那一节的引文,因为手边只有英文的电子文档,所以就把相关的段落拷贝下来
引用
13.1 A Reality Check            by William Opdyke
I worked at Bell Labs for several years before I decided to pursue my doctoral studies. Most of
that time was spent working in a part of the company that developed electronic switching
systems. Such products have very tight constraints with respect to both reliability and the speed
with which they handle phone calls. Thousands of staff-years have been invested in developing
and evolving such systems. Product lifetimes have spanned decades. Most of the cost of
developing these systems comes not in developing the initial release but in changing and
adapting the systems over time. Ways to make such changes easier and less costly would result
in a big win for the company.

I can vividly recall presenting a talk in early 1993 at a technology exchange forum for staff at
AT&T Bell Labs and NCR (we were all part of the same company at the time). I was given 45
minutes to speak on refactoring. At first the talk seemed to go well. My enthusiasm for the topic
came across. But at the end of the talk, there were very few questions. One of the attendees
came up afterward to learn more; he was beginning his graduate work and was fishing around for
a research topic. I had hoped to see some members of development projects show eagerness in
applying refactoring to their jobs. If they were eager, they didn't express it at the time.
People just didn't seem to get it.

Over the next couple years, I had numerous opportunities to talk about refactoring at AT&T Bell
Labs internal forums and at outside conferences and workshops. As I talked more with
developers in the trenches, I started to understand why my earlier messages didn't come across
clearly. The disconnect was caused partly by the newness of object-oriented technology. Those
who had worked with it had rarely progressed beyond the initial release and hence had not yet
faced the tough evolution problems refactoring can help solve. This was the typical researcher's
dilemma—the state of the art was beyond the state of common practice. However, there was
another, troubling cause for the disconnect. There were several commonsense reasons
developers, even if they bought into the benefits of refactoring, were reluctant to refactor their
programs. These concerns had to be addressed before refactoring could be embraced by the
development community.

随着与一线开发人员的交谈越来越多,我开始明白为什么以前的演讲不能感染别人。我与听众的距离有一部分是因为面向对象技术自身就很新。那些使用它的人多半都还没有完成第一个版本的开发,所以还没有遇到[演进]这个大的问题,而这个问题是重构能够帮忙解决的。
2 楼 xly_971223 2007-04-04  
可重用性是软件设计的终极目标。 小到一行代码 一个方法, 大到一个类 一个模式 一个子系统
可维护行当然也很重要 毕竟在软件生命周期中,维护占的比例是非常大

那么可重用行跟可维护性之间有什么关系呢?是不是复用度高的的软件可维护性就高呢?
复用度高的程序--->内聚性强--->可维护性高
复用性高的程序其内聚性一定强,内聚性强的程序则更容易维护

软件设计还有一个目标是可扩展性,那么扩展性跟重用性 维护性之间又有什么关系呢?
1 楼 jamesby 2007-04-04  
我觉得软件的可重用性更重要,围绕可重用性会有很多东西,包括可重用性也分很多层次。

代码级别的重用,
设计的重用,
组件的重用。
框架的重用。
Service的重用(WebService,或者EJB)。

虽然很多人反对使用EJB,但是我仍然觉得EJB是Service级别的重用的不错的方式,当然有人会说用webservice更好。因人而异。

当然可维护性也很重要,但是我觉得相对于重用来说它占的比重很底。

如果能够将如上这么多级别的重用使用好。那设计出来的软件一定是个不错的软件(从重用的角度考虑)。



相关推荐

    软件设计模式与体系结构

    第一篇分为8章,介绍了软件体系结构的基础理论,包括软件体系结构的概念及演化、软件建模基础、软件体系结构的形式化、软件体系结构的风格、体系结构的描述语言、软件质量建模、设计模式等内容。第二篇分为4章,首先...

    软件设计体系结构+设计模式 全课件PPT,所有设计模式PPT和设计风格PPT及设计原则PPT

    我们为您准备了全套的课件PPT,包括软件设计体系结构的详细讲解、各种设计模式的介绍以及设计风格和原则的探讨。无论您是想要深入了解软件设计的理论知识,还是寻找实践指导和案例分析,我们都将为您提供全方位的...

    软件体系结构实验报告(设计模式)

    软件体系结构实验报告(设计模式):包含策略模式,代理模式,观察者模式,外观模式,组合模式,抽象工厂,单例,工厂方法,简单工厂,适配器模式,附有代码实例和类图

    软件体系结构(设计模式、各种组件)课件·

    非常不错的课件,com、ejb、CORBA组件和设计模式介绍的非常详细!

    软件设计模式期末作业

    软件设计模式作业,要求用3个设计模式以上实现。代码涉及了装饰模式,工厂模式和适配器模式

    设计模式:可复用面向对象软件的基础--详细书签版

     另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从...

    02-软件设计原则 模式深度解析和案例分析

    软件设计原则/深度解析 ---应用案例分析 设计模式应用策略1—建立面向对象思维 设计模式应用策略2—知道设计模式,知道自己不知道 设计模式应用策略3—贴身模仿,研读大师经典作品 设计模式应用策略4—根据场景,用模式...

    软件秘笈-设计模式那点事.pdf

    本书在第1章软件设计模式概述后,从第2章到第24章诠释23个软件设计模式。每一种都以一个生活故事开始,然后是模式定义、模式分析、模式...第25章对各种软件设计模式进行系统总结,第26章是各种软件设计模式综合应用。

    嵌入式软件设计的思想与方法

    嵌入式软件设计的思想与方法,适合深入学习嵌入式的朋友很不错

    软件秘笈:设计模式那点事 下载

    第25章对各种软件设计模式进行系统总结,第26章是各种软件设计模式综合应用。 JavaScript核心技术 【GitHub】https://github.com/xiaole0310 【csdn博客】http://blog.csdn.net/xiaole0313 【新浪微博】...

    软件体系结构课后作业及答案 软件体系结构

    软件体系结构课后作业及答案 很不错 的 ,大家可以下载过了看看

    北京中科信软VS.NET设计模式与软件架构设计培训1

    比较各种软件设计方法的利弊以及微软MSF流程概述;同大家探讨软件架构设计的思想。同时我们将对微软全部的服务器产品以及桌面产品的集成特性进行介绍。第一天的课程包括: ·软件开发模型选择:XP/MSF/CMMI/Agile...

    软件设计模式大作业

    java设计模式期末大作业,运用了6种模式,包括简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式、观察者模式,文档包括系统流程,系统类图,各个模式的子类图,源代码,实验截图。绝对完整.

    敏捷软件开发:原则、模式与实践(C#版)中文.pdf

    Martin在《敏捷软件开发:原则、模式与实践(C#版)》中深入而生动地使用真实案例讲解了面向对象设计的基本原则、重要的设计模式、UML和敏捷方法。 《敏捷软件开发:原则、模式与实践(C#版)》Java版曾荣获2003年第13...

    《敏捷软件开发:原则、模式与实践》 [PDF]

     ●面向对象设计原则:本书包含了11个面向对象设计原则,涵盖了包的设计和类的设计。这是我所见过的对这方面内容讲解的最清晰、最彻底、最深刻的唯一的一本书。  ●设计模式:本书中讲述了23个设计模式,并都有...

    敏捷软件开发:原则、模式与实践.pdf

    中文名: 敏捷软件开发:原则、模式与实践 原名: Agile Software Development:Principles,Patterns and Practices 别名: 软件工程实践丛书 作者: (美)Robert C.Martin译者: 邓辉 孟岩图书分类: 软件 资源格式: PDF ...

    本文对几种经典的软件体系结构风格进行了具体的阐述,分析了各种风格的特点、优缺点,最后重点介绍了三层C/S软件体系结构。

    起初,人们把软件设计的重点放在数据结构和算法的选择上。随着软件系统规模越来越大、越来越复杂,整个系统的结构显得越来越重要。  一、软件体系结构风格分析  最初的软件体系结构是Mainframe结构——客户、...

    软件开发的201个原则

    原则,是在编程技巧、编程语言、设计模式、工具之下的最底层的东西,它是人们在几十年的软件开发过程中不断经历、提炼出来的重要经验,体系了软件设计、开发过程中的设计哲学。 随着技术和时代的发展,这些原则可能...

Global site tag (gtag.js) - Google Analytics