`
qinysong
  • 浏览: 192654 次
  • 性别: 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更好。因人而异。

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

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



相关推荐

    二十三种设计模式【PDF版】

    主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...

    软件设计与体系结构期末复习笔记(xinhua)

    期末复习时,我们需要关注几个核心概念,包括程序的本质、高质量代码的特性、软件设计模式及其分类、UML的作用,以及面向对象设计原则。 首先,程序是解决问题的语句序列,它是计算机执行任务的基础。高质量的代码...

    如何提高软件设计质量.pptx

    【软件设计原则】是指导设计实践的准则,包括用户需求优先、接受变化、合理预估软件规模等思想原则,以及开-闭原则、单一职责原则、李氏代换原则、依赖倒转原则、接口隔离原则、合成/聚合复用原则和迪米特法则等技术...

    面向对象数据结构与软件开发

    通过以上对面向对象数据结构与软件开发的核心知识点的介绍,我们可以看出,面向对象的设计思想不仅有助于构建更加灵活和可维护的软件系统,而且在实际开发过程中,结合合适的数据结构和设计模式,能够显著提高开发...

    软件工程模拟试题及答案

    3. **面向对象设计原则:**面向对象设计(OOD)是现代软件开发中常用的方法之一,其基本原则包括封装、继承、多态等,有助于提高代码的复用性和灵活性。 ### 三、软件开发过程管理 1. **需求分析的重要性:**需求...

    软件设计与体系结构简答+选择题+ 名词解释1

    在软件设计与体系结构中,我们首先探讨的是面向对象的概念。面向对象是现代软件开发中的核心思想,它强调以对象为中心的设计方式。 1. **抽象**:抽象是将现实世界中的复杂问题简化为易于理解的形式,它关注的是...

    软件工程思想(编程爱好者的读物)

    软件设计涉及将项目需求转化为具体的软件架构,这包括选择合适的数据结构、算法和编程模式。良好的设计可以提高代码的可读性、可维护性和扩展性,同时降低未来的修改成本。 #### 编码与实现 编码是将设计转换为...

    软件工程思想

    首先,第一章《软件工程基本观念》是整个书籍的基础,它讲述了软件工程的起源、目标和原则。软件工程不仅关注软件的开发,更注重软件的生命周期管理,包括需求分析、设计、编码、测试、维护等各个阶段。这一章会阐述...

    23种设计模式 - 架构设计 - PPT

    - **目标**:消除代码中的重复部分,修复体系结构缺陷,使之更符合设计模式的原则。 **反模式(Antipatterns)**: - **定义**:常见问题的负面示例,揭示了设计中的陷阱。 - **作用**:帮助识别并避免常见的设计错误...

    软件工程术语标准

    软件工程学是软件工程的理论基础,它不仅包含了软件开发的技术细节,还涵盖了软件项目的管理策略和方法论。 #### 二、软件工程管理 **软件工程管理:** 软件工程管理涉及软件项目的计划、组织、协调和控制等管理...

    Java软件开发工程师培训课程体系.pdf

    Java软件开发工程师培训课程体系是针对想要进入IT行业,尤其是Java软件开发领域的人员设计的一套系统性学习计划。课程旨在帮助学员从零基础到具备专业技能,通过分阶段的实训和素质培养,全面掌握Java编程语言及其...

    关于面向对象的哲学体系及科学体系的探讨

    继承是面向对象编程中的一个重要特性,允许创建新的类来继承现有类的属性和方法。这一章深入分析了继承的概念、优缺点及其在面向对象设计中的应用。 - **继承的定义**:继承是指一个类可以从另一个类那里获取其所有...

    软件开发过程总结.ppt

    为此,软件工程提出了诸多原则和方法,如迭代开发、敏捷开发、持续集成和持续交付等,以适应快速变化的软件开发环境。 总的来说,软件开发过程是一个涉及多方面知识和技能的过程,它需要开发者理解软件的本质,掌握...

    华农2012软件工程复习提纲以及注解

    11. **软件需求的概念**:软件需求是软件系统预期达到的目标或应具备的功能和性能特性。 12. **软件需求规约主要包括的内容**:软件需求规约通常包括功能需求、非功能需求、约束条件等内容。 13. **软件设计阶段的...

    面向对象软件构造中英对照版

    - **继承**:一个类可以从另一个类派生,继承其属性和方法。 - **多态**:同一操作作用于不同的对象上会产生不同的结果。 综上所述,《面向对象软件构造》这本书从软件质量出发,逐步引导读者了解面向对象编程的...

    软件系统建设专项方案通用模版.doc

    - **标准化意义、目标及指导思想**:强调标准在系统建设中的作用,设定标准制定的目标,以及遵循的原则。 - **标准化工作任务**:列出需要完成的标准规范,如接口标准、数据格式标准等。 6. **安全体系设计** - ...

    《SSH与SSM架构》课程教学大纲.docx

    - 介绍 Spring 框架的特性,运用软件设计原则解释 Spring 及其子项目的设计目标、特性和应用优势。 - 说明 Spring 框架的组织结构、应用场景和作用。 - 解释依赖反转模式(IoC)和 IoC 容器的概念。 - 讲解 Bean...

    计算机二级公共基础知识

    因最先进入队列的元素将最先出队,所以队列具有先进先出的特性,体现“先来先服务”的原则。 队头元素q1是最先被插入的元素,也是最先被删除的元素。队尾元素qn是最后被插入的元素,也是最后被删除的元素。因此,与...

Global site tag (gtag.js) - Google Analytics