程序设计
程序设计总结(推荐12篇)

程序设计总结第1篇文件的定义:存储在外部存储介质(外存)上数据的集合。
C语言将每一个与主机相连的输入或输出设备都看作是一个文件文件的使用和管理:在程序运行时由程序在外存上建立或打开一个文件,通过写操作将数据存入该文件;由程序打开外存上的某个已有文件,并通过读操作将文件中的数据读入内存供程序使用文件的路径文件的存储形式文件缓冲区C程序中文件的操作过程(通过库函数实现,已定义在)结构体类型FILE文件指针文件的打开文件的使用方式文件的关闭格式化读函数格式化写函数字符方式读函数字符方式写函数字符串读函数字符串写函数数据块读函数(可用于读写数组、结构变量的值,多用于读写二进制文件)数据块写函数(可用于读写数组、结构变量的值,多用于读写二进制文件)程序设计总结第2篇数组:一组有序的、类型相同的数据的集合,这些数据被称为数组的元素定义:类型说明符数组名[正整数常量表达式],例如float mark[100];char str[200];int a[2+3];初始化:在数组定义时为数组元素赋初值(赋初值的个数不能超过数组总元素的个数)引用:数组名[下标],如a[3]。
程序设计总结第3篇定义:函数是按规定格式书写的能完成特定功能的一段程序。
函数之间地位平等,可互相调用也可自身调用函数的调用:指一个函数暂时中断运行,去执行另一个函数的过程函数的返回:return 表达式或 return (表达式)函数原型声明值传递函数调用的执行过程实参向形参单向值传递嵌套调用:在调用一个函数的过程中,又调用另一个函数递归调用:在调用一个函数的过程中又出现直接或间接的调用该函数本身程序设计总结第4篇变量的作用域:指变量在程序中的作用范围,与变量定义的位置有关。
可分为局部变量和全局变量局部变量(内部变量)全局变量(外部变量)变量的生存期:指变量值存在时间的长短,与变量的存储类型有关。
可分为静态存储和动态存储变量的存储类型内存供用户使用的存储空间变量的具体存储种类局部变量的具体存储种类:自动变量、静态局部变量、寄存器变量自动变量(auto)静态局部变量(static)寄存器变量(register)全局变量的具体存储种类内部函数(静态函数)外部函数编译预处理宏定义带参数的宏定义终止宏定义文件包含条件编译程序设计总结第5篇内存:即内部存储器,由存储单元组成,存储单元的最小单位是字节。
程序设计方案

程序设计方案程序设计方案是指在开展计算机程序编写之前,详细规划和设计出整个程序的结构、功能和流程的一份文档。
本文将针对程序设计方案的编写,从需求分析、程序结构设计、算法设计以及测试计划等方面进行详细阐述。
一、需求分析在开始编写程序之前,对于所需解决的问题进行充分理解和分析非常重要。
在需求分析阶段,我们需要明确程序的具体功能、实现细节和用户需求。
这将有助于我们在后续的程序设计和编码过程中做出正确的决策。
1.1 功能需求在这一部分,我们需要明确程序需要具备的功能和特点。
例如,一个管理系统需要能够实现用户注册、登录、信息查找、数据增删改等操作。
1.2 性能需求性能需求是指程序在运行过程中需要满足的时间效率、内存占用、响应速度等要求。
针对不同的程序类型,性能需求也会有所不同。
例如,一个图像处理程序需要具备快速的处理速度和较高的图像分辨率支持。
1.3 可靠性需求在程序设计中,可靠性是一个重要的考虑因素。
我们需要确保程序的稳定性和可恢复性,以应对各种异常情况和错误。
例如,一个银行系统需要具备数据备份、错误处理和容错机制等功能。
1.4 用户界面需求用户界面是程序与用户交互的接口,需要设计得简洁、易用、符合用户习惯。
我们可以通过图形界面(GUI)或命令行界面(CLI)来满足不同用户的需求。
二、程序结构设计程序结构设计是指将需求分析得出的功能需求转化为程序的整体架构和组织结构。
在这一阶段,我们需要确定程序的模块划分、模块间的调用关系和数据流动。
2.1 模块划分根据功能需求,我们将程序分解为不同的模块,每个模块负责完成特定的任务。
模块划分的准确性和合理性直接影响到程序的可维护性和扩展性。
2.2 模块间的调用关系模块间的调用关系是指不同模块之间的依赖和调用关系。
我们需要明确每个模块调用哪些其他模块的功能,并设计好数据传递和接口。
2.3 数据流动数据流动是指程序中数据在各个模块之间的传递和处理。
我们需要确定每个模块的输入、输出参数以及数据传递的方式(值传递、引用传递等)。
名词解释程序设计

名词解释程序设计程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。
程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。
程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。
专业的程序设计人员常被称为程序员。
任何设计活动都是在各种约束条件和相互矛盾的需求之间寻求一种平衡,程序设计也不例外。
在计算机技术发展的早期,由于机器资源比较昂贵,程序的时间和空间代价往往是设计关心的主要因素;随着硬件技术的飞速发展和软件规模的日益庞大,程序的结构、可维护性、复用性、可扩展性等因素日益重要。
概述程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。
程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。
程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。
专业的程序设计人员常被称为程序员。
某种意义上,程序设计的出现甚至早于电子计算机的出现。
英国著名诗人拜伦的女儿爱达·勒芙蕾丝曾设计了巴贝奇分析机上计算伯努利数的一个程序。
她甚至还创建了循环和子程序的概念。
由于她在程序设计上的开创性工作,爱达·勒芙蕾丝被称为世界上第一位程序员。
任何设计活动都是在各种约束条件和相互矛盾的需求之间寻求一种平衡,程序设计也不例外。
在计算机技术发展的早期,由于机器资源比较昂贵,程序的时间和空间代价往往是设计关心的主要因素;随着硬件技术的飞速发展和软件规模的日益庞大,程序的结构、可维护性、复用性、可扩展性等因素日益重要。
另一方面,在计算机技术发展的早期,软件构造活动主要就是程序设计活动。
但随着软件技术的发展,软件系统越来越复杂,逐渐分化出许多专用的软件系统,如操作系统、数据库系统、应用服务器,而且这些专用的软件系统愈来愈成为普遍的计算环境的一部分。
这种情况下软件构造活动的内容越来越丰富,不再只是纯粹的程序设计,还包括数据库设计、用户界面设计、接口设计、通信协议设计和复杂的系统配置过程。
程序设计总结

程序设计总结程序设计总结程序设计是一门综合性强、需要具备逻辑思维和创造力的学科。
在日常的工作和学习中,我们经常要进行程序设计,因此对程序设计进行总结是非常重要的。
本文将从以下几个方面对程序设计进行总结。
1. 程序设计的基本原则程序设计的基本原则可以概括为以下几点:1.1 单一职责原则(SRP)单一职责原则要求一个类或模块应该有且只有一个引起它修改的原因。
这样可以提高代码的聚焦性和可维护性。
1.2 开放闭合原则(OCP)开放闭合原则要求软件中的对象(类、模块、函数等)对扩展是开放的,对修改是闭合的。
通过使用抽象和接口,我们可以方便地扩展系统的功能而不必修改已有的代码。
1.3 里氏替换原则(LSP)里氏替换原则要求所有引用基类的地方必须能够透明地使用其子类的对象,而不会引发任何异常或错误。
这样可以确保系统在扩展时不会破坏原有的功能。
1.4 依赖倒置原则(DIP)依赖倒置原则要求高层模块不应该依赖低层模块,它们应该依赖于抽象。
通过使用接口和依赖注入,我们可以降低模块之间的耦合,提高系统的灵活性和可测试性。
2. 程序设计的步骤程序设计通常包括以下几个步骤:2.1 分析需求在进行程序设计之前,我们需要清楚地了解用户的需求和系统的功能。
这包括对用户需求的分析、功能的拆解等。
2.2 设计程序框架根据需求分析的结果,我们可以设计出程序的整体框架。
这包括确定系统的模块划分、类的设计、接口的定义等。
2.3 编写代码在设计程序框架之后,我们可以开始编写具体的代码。
这包括实现系统的各个模块和类,编写函数、方法等。
2.4 测试和调试在编写代码之后,我们需要对代码进行测试和调试。
这包括单元测试、集成测试、系统测试等。
2.5 优化和维护在程序运行一段时间后,我们可能需要对程序进行优化和维护。
这包括提高程序的性能、修复bug、添加新功能等。
3. 程序设计的技巧和实践在程序设计中,我们需要掌握一些技巧和实践,以提高开发效率和代码质量。
程序设计的理解

程序设计的理解程序设计是一门独特而有趣的技术与艺术,它指导着计算机的运作,使得我们能够通过编写代码来实现各种功能和解决问题。
程序设计的理解不仅仅是掌握语法规则和编程技巧,更是培养逻辑思维和解决问题的能力。
下面将通过分析程序设计的基本概念、重要性以及学习方法三个方面,探讨程序设计的理解。
一、程序设计的基本概念程序设计是指根据一定的逻辑关系和功能要求,使用特定的程序语言编写一系列指令,实现特定的功能或解决问题。
它是一种抽象和创造过程,通过将问题分解为一个个小的任务,然后使用合适的算法和数据结构进行解决。
在程序设计中,算法是最重要的部分,它决定了程序的效率和正确性。
同时,良好的程序设计还要考虑可读性、可维护性和可扩展性等因素。
二、程序设计的重要性程序设计在现代社会中具有广泛的应用价值和重要性。
首先,程序设计是现代化社会的基石。
计算机已经渗透到各个行业和领域,无论是工业生产、商业管理还是科学研究,都少不了程序设计的支持。
其次,程序设计是提高工作效率和解决问题的关键。
通过编写合理的程序,可以自动化处理繁琐和重复的工作,提高工作效率并减少错误发生的几率。
此外,程序设计还培养了人们的逻辑思维和解决问题的能力,有助于提高创新能力和竞争力。
三、程序设计的学习方法为了更好地理解程序设计,我们可以采取以下几种学习方法。
首先,要多动手实践。
程序设计是一门实践性很强的学科,只有通过不断实践才能更好地理解和掌握。
可以选择一些简单的编程题目,通过编写代码来实现功能,然后不断优化和改进。
其次,要注重理论知识的学习。
了解编程语言的语法规则、基本数据结构和算法等,这些都是程序设计的基础。
此外,也要学会查阅文档和参考资料,掌握学习资源的使用方法,以便解决问题和提升自己的编程水平。
最后,要进行团队合作和交流。
与他人一起编程可以提高合作和沟通能力,同时也可以从别人的经验中学习到更多知识和技巧。
结语通过对程序设计的基本概念、重要性以及学习方法的分析,我们可以更好地理解程序设计的本质和意义。
常见的程序设计方法

常见的程序设计方法常见的程序设计方法=======================在软件开发过程中,程序设计是一个非常关键的环节。
良好的程序设计方法能够有效地提高程序的质量和可维护性。
下面将介绍一些常见的程序设计方法,帮助开发者在编写代码时更加高效和规范。
1. 模块化设计-模块化设计是将一个大型的程序拆分成若干个独立的模块,每个模块负责完成特定的功能。
通过模块化设计,可以降低程序的复杂度,提高代码的可读性和可维护性。
每个模块应该具有清晰的接口和功能,便于其他模块进行调用和复用。
2. 面向对象设计--面向对象设计是一种抽象和封装的思想,将现实世界中的事物抽象成对象,在程序中进行模拟和处理。
面向对象设计可以提高代码的可维护性和复用性,通过类和对象的组织结构,可以将代码划分成多个独立的模块,便于分工合作和协同开发。
3. 设计模式-设计模式是一种经过验证和实践的程序设计经验,它提供了一套通用的解决方案,用于解决特定的设计问题。
常见的设计模式包括单例模式、工厂模式、观察者模式等。
采用设计模式可以提高代码的可维护性和扩展性,降低代码的复杂度。
4. 接口设计-接口设计是指定义类或模块提供的公共接口,包括接口的方法、属性和事件等。
好的接口设计可以提高代码的可复用性和灵活性。
接口应该具有清晰的目的和功能,遵循接口隔离原则,确保每个接口的功能单一,便于修改和扩展。
5. 数据结构设计数据结构是程序中用于存储和组织数据的方式。
合理的数据结构设计可以提高代码的效率和性能。
常见的数据结构包括数组、链表、栈、队列等。
在设计数据结构时,需要考虑数据的访问方式和处理需求,选择合适的数据结构来存储和操作数据。
6. 异常处理-异常处理是指在程序运行过程中,当出现错误或异常情况时,及时地捕获并处理。
良好的异常处理可以提高程序的健壮性和可靠性。
在编写代码时,需要合理地使用异常处理机制,捕获和处理可能出现的异常情况,避免程序崩溃或出现未知错误。
简述程序设计步骤

简述程序设计步骤程序设计是一个系统化的过程,它涉及到从问题的识别到最终软件产品的实现。
以下是程序设计的基本步骤:1. 问题定义:这是程序设计的起始点,需要清楚地定义要解决的问题或要实现的功能。
这包括对问题的范围、需求和限制条件的明确描述。
2. 需求分析:在这个阶段,需要收集和分析用户需求,确定软件需要具备的功能和性能。
需求分析的结果通常以需求规格说明书的形式呈现。
3. 系统设计:基于需求分析,设计软件的架构和组件。
这包括确定软件的模块化结构、接口设计、数据存储方案等。
4. 算法选择:根据问题的性质,选择合适的算法来解决问题。
算法的选择直接影响到程序的效率和性能。
5. 详细设计:在这个阶段,将系统设计进一步细化,包括编写伪代码、流程图、状态图等,以详细描述程序的逻辑流程。
6. 编码:根据详细设计文档,使用选定的编程语言编写实际的代码。
编码时应遵循良好的编程习惯和代码规范,以提高代码的可读性和可维护性。
7. 测试:编写测试用例,对程序进行单元测试、集成测试、系统测试和验收测试,确保程序按照预期工作,并且没有缺陷。
8. 调试:在测试过程中发现的问题需要通过调试来解决。
调试是查找和修复代码中的错误的过程。
9. 优化:在确保程序正确无误后,进一步优化代码,提高程序的效率和性能。
这可能包括算法优化、数据结构优化等。
10. 文档编写:编写用户手册、技术文档和代码注释,以帮助用户和开发者理解程序的工作原理和使用方法。
11. 部署:将程序部署到生产环境,供用户使用。
这可能涉及到配置服务器、数据库等。
12. 维护:软件发布后,需要持续进行维护,包括修复发现的bug、更新功能、改进性能等。
13. 评估与反馈:收集用户反馈,评估软件的性能和用户体验,根据反馈进行必要的调整。
程序设计是一个迭代的过程,可能需要多次回到前面的步骤进行调整和改进。
随着技术的发展和用户需求的变化,程序设计也在不断地演进和更新。
什么是程序设计意思与概念

什么是程序设计意思与概念程序设计是一门关于编写计算机程序的学科,它涉及到定义、设计和实现算法和数据结构,以及编写、测试和维护这些计算机程序的过程。
程序设计是计算机科学的重要组成部分,也是计算机软件开发中的核心环节。
本文将介绍程序设计的意义和基本概念。
一、程序设计的意义程序设计在日常生活和工作中扮演着重要的角色,它的意义主要体现在以下几个方面。
1. 自动化处理:程序设计可以让计算机完成各种复杂的任务和处理过程,实现自动化处理。
例如,我们可以设计一个程序来自动化处理大量的数据,提高工作效率。
2. 解决实际问题:通过程序设计,我们可以解决和改进许多实际问题。
例如,我们可以利用程序设计实现在线购物、在线支付等功能,方便人们日常生活。
3. 提高效率和精确度:通过程序设计,可以使计算机以更高的速度和更高的准确性处理数据和任务,从而提高工作效率和精确度。
二、程序设计的基本概念1. 算法:算法是程序设计的基础,它是由一系列明确指令组成的计算步骤序列,用于解决特定问题或完成特定任务。
一个好的算法应该具有清晰、可执行和高效的特点。
2. 数据结构:数据结构是程序设计中用于组织和存储数据的方式。
常见的数据结构包括数组、链表、栈、队列、树和图等。
不同的数据结构适用于不同的应用场景,选择合适的数据结构可以提高程序的运行效率和可扩展性。
3. 编程语言:编程语言是进行程序设计的工具,它是一种用于定义和组织计算机程序的规范或语法。
常见的编程语言包括C、C++、Java、Python等。
不同的编程语言适用于不同的应用领域,选择合适的编程语言可以提高编程效率和程序性能。
4. 软件开发过程:软件开发过程是指从需求分析到软件发布的整个过程。
它包括需求分析、系统设计、编码实现、测试和维护等阶段。
良好的软件开发过程可以提高软件质量和开发效率。
5. 调试和错误处理:在程序设计过程中,出现错误是常见的。
调试和错误处理是程序设计中重要的环节,它们用于找出程序中的错误并对其进行修复。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象原则综述七大原则总脉络图:注:1,2,3,4,5显示的重要等级常用的面向对象设计原则包括7个,这些原则并不是孤立存在的,它们相互依赖,相互补充。
下面就是面向对象七个原则的一一解析一、开闭原则1. 开闭原则定义:一个软件实体应当对扩展开放,对修改关闭。
也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
2. 开闭原则分析:(1)开闭原则由Bertrand Meyer于1988年提出,它是面向对象设计中最重要的原则之一。
(2)在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
(3)抽象化是开闭原则的关键。
(4)开闭原则还可以通过一个更加具体的“对可变性封装原则”来描述,对可变性封装原则(Principle of Encapsulation of Variation,EVP)要求找到系统的可变因素并将其封装起来。
3. 开闭原则实例:某图形界面系统提供了各种不同形状的按钮,客户端代码可针对这些按钮进行编程,用户可能会改变需求要求使用不同的按钮,原始设计方案如图所示:图(1)现对该系统进行重构,使之满足开闭原则的要求。
图(2)对比分析图(1):客户端的一个方法直接调用加法类,但是我想添加一个减法类,你就会发现添加减法类就得改变加法类中代码(用switch语句实现),这就违背了“开闭原则”,于是我们就应该重新重构。
如图(2)在这个图中我们添加了一个运算类的父类,这样我们再添加减法类的时候就不用修改客户端类。
开闭原则总结:面对需求,对程序的改动是通过增加新代码进行的,而不是改变原来的代码。
二、依赖倒转原则1.依赖倒转原则定义i. 高层模块不应该依赖低层模块,它们都应该依赖抽象。
抽象不应该依赖于细节,细节应该依赖于抽象。
ii. 要针对接口编程,不要针对实现编程。
2. 依赖倒转原则分析a) 简单来说,依赖倒转原则就是指:代码要依赖于抽象的类,而不要依赖于具体的类;要针对接口或抽象类编程,而不是针对具体类编程。
b) 实现开闭原则的关键是抽象化,并且从抽象化导出具体化实现,如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。
c) 依赖倒转原则的常用实现方式之一是在代码中使用抽象类,而将具体类放在配置文件中。
d) 类之间的耦合1.零耦合关系2.具体耦合关系 3.抽象耦合关系。
依赖倒转原则要求客户端依赖于抽象耦合,以抽象方式耦合是依赖倒转原则的关键。
e) 依赖注入:构造注入:通过构造函数注入实例变量设值注入:通过Setter方法注入实例变量接口注入:通过接口方法注入实例变量3. 依赖倒转原则实例某系统提供一个数据转换模块,可以将来自不同数据源的数据转换成多种格式,如可以转换来自数据库的数据(DatabaseSource)、也可以转换来自文本文件的数据(TextSource),转换后的格式可以是XML文件(XMLTransformer)、也可以是XLS文件(XLSTransformer图(一)图(二)图(一)和图(二)分析:图(一)为什么要到图(二)哪?因为该系统可能需要增加新的数据源或者新的文件格式,每增加一个新的类型的数据源或者新的类型的文件格式,客户类MainClass都需要修改源代码,以便使用新的类,但违背了开闭原则。
现使用依赖倒转原则对其进行重构。
总结:高层模块不应该依赖底层模块,两个都应该依赖与抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
三、里氏代换原则1. 定义i. 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型S是类型T的子类型。
ii. 所有引用基类(父类)的地方必须能透明地使用其子类的对象。
2.分析i. 在软件中如果能够使用基类对象,那么一定能够使用其子类对象。
把基类都替换成它的子类,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类的话,那么它不一定能够使用基类。
ii. 里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
3. 实例某系统需要实现对重要数据(如用户密码)的加密处理,在数据操作类(DataOperator)中需要调用加密类中定义的加密算法,系统提供了两个不同的加密类,CipherA和CipherB,它们实现不同的加密方法,在DataOperator中可以选择其中的一个实现加密操作。
如图所示:图(一)图(二)图(一)和图(二)分析:图(一)为什到图(二)哪?因为如果需要更换一个加密算法类或者增加并使用一个新的加密算法类,如将CipherA改为CipherB,则需要修改客户类Client和数据操作类DataOperator的源代码,违背了开闭原则。
现使用里氏代换原则对其进行重构,使得系统可以灵活扩展,符合开闭原则。
总结:子类型必须能够替换掉它们的父类型。
四、单一职责原则1. 定义i. 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
ii. 就一个类而言,应该仅有一个引起它变化的原因。
2. 分析i. 一个类(或者大到模块,小到方法)承担的职责越多,它被复用的可能性越小,而且如果一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作。
ii.类的职责主要包括两个方面:数据职责和行为职责,数据职责通过其属性来体现,而行为职责通过其方法来体现。
iii.单一职责原则是实现高内聚、低耦合的指导方针,在很多代码重构手法中都能找到它的存在,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。
3. 实例i. 某基于Java的C/S系统的“登录功能”通过如下登录类(Login)实现:图(一)图(二)图一和图二有什么区别哪?图(一)功能太过于集成,严重违反类的单一原则。
总结:就一个类而言,应该仅有一个引起它变化的原因五、接口隔离原则1. 定义i. 客户端不应该依赖那些它不需要的接口。
ii. 一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
2.分析i. 接口隔离原则是指使用多个专门的接口,而不使用单一的总接口。
每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干。
ii. 使用接口隔离原则拆分接口时,首先必须满足单一职责原则,将一组相关的操作定义在一个接口中,且在满足高内聚的前提下,接口中的方法越少越好。
iii. 可以在进行系统设计时采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,而隐藏用户不需要的行为3.实例i. 下图展示了一个拥有多个客户类的系统,在系统中定义了一个巨大的接口(胖接口)AbstractService来服务所有的客户类。
如图所示:图(一)图(二)图(一)和图(二)分析:图(一)为什么到图(二)哪?因为这样做既满足了接口隔离原则,又满足了单一原则,何乐而不为呢,但是也带来了很多的不便,类增多了。
总结:类应该完全依赖相应的专门的接口六、合成复用原则1.定义i. 尽量使用对象组合,而不是继承来达到复用的目的。
2.分析i. 合成复用原则就是指在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。
简言之:要尽量使用组合/聚合关系,少用继承。
ii. 在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。
a) 继承复用:实现简单,易于扩展。
破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。
(“白箱”复用)b) 组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。
(“黑箱”复用)iii. 组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。
3. 实例i. 某教学管理系统部分数据库访问类设计如图所示:图(一)图(二)图(一)和图(二)分析:图(一)为什么到图(二)哪?因为如果需要更换数据库连接方式,如原来采用JDBC连接数据库,现在采用数据库连接池连接,则需要修改DBUtil类源代码。
如果StudentDAO 采用JDBC连接,但是TeacherDAO采用连接池连接,则需要增加一个新的DBUtil类,并修改StudentDAO或TeacherDAO的源代码,使之继承新的数据库连接类,这将违背开闭原则,系统扩展性较差。
总结:类中应用,尽量使用对象组合而不是用继承来达到复用的目的。
七、迪米特法则1. 定义i. 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
2. 分析i.迪米特法则就是指一个软件实体应当尽可能少的与其他实体发生相互作用。
这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易,这是对软件实体之间通信的限制,它要求限制软件实体之间通信的宽度和深度。
ii. 狭义的迪米特法则:可以降低类之间的耦合,但是会在系统中增加大量的小方法并散落在系统的各个角落,它可以使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联,但是也会造成系统的不同模块之间的通信效率降低,使得系统的不同模块之间不容易协调。
iii. 广义的迪米特法则:指对对象之间的信息流量、流向以及信息的影响的控制,主要是对信息隐藏的控制。
信息的隐藏可以使各个子系统之间脱耦,从而允许它们独立地被开发、优化、使用和修改,同时可以促进软件的复用,由于每一个模块都不依赖于其他模块而存在,因此每一个模块都可以独立地在其他的地方使用。
一个系统的规模越大,信息的隐藏就越重要,而信息隐藏的重要性也就越明显。
iv. 迪米特法则的主要用途在于控制信息的过载。
1.在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及2.在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限3.在类的设计上,只要有可能,一个类型应当设计成不变类4.在对其他类的引用上,一个对象对其他对象的引用应当降到最低。