程序设计七大原则
程序设计总结
程序设计总结程序设计总结程序设计是一门综合性强、需要具备逻辑思维和创造力的学科。
在日常的工作和学习中,我们经常要进行程序设计,因此对程序设计进行总结是非常重要的。
本文将从以下几个方面对程序设计进行总结。
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. 程序设计的技巧和实践在程序设计中,我们需要掌握一些技巧和实践,以提高开发效率和代码质量。
软件设计7大原则
软件设计7大原则
在软件设计领域,有7个基本原则被认为是设计高质量、易于维护的软件的关键。
这些原则被称为SOLID原则,包括以下七个原则:
1. 单一职责原则(SRP):每个类或对象都应该专注于单一的职责,而不是尝试做太多的事情。
这样可以使代码更易于维护,因为更改其中一个职责不会影响其他职责。
2. 开放封闭原则(OCP):软件实体(类、模块等)应该是开放可扩展的,而不是修改已有的代码。
这意味着在修改系统行为时,应该通过添加新代码而不是修改现有代码来实现。
3. 里氏替换原则(LSP):子类应该能够替换它们的基类并保持行为不变。
这意味着子类应该与其基类遵循相同的契约,以确保子类可以无缝地替换基类。
4. 接口隔离原则(ISP):客户端不应该依赖于它们不需要的接口。
这可以通过将接口分解成更小的和更具体的接口来实现,以确保每个客户端只依赖于其需要的接口。
5. 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
这可以通过使用依赖注入、依赖反转和工厂模式等技术来实现。
6. 迪米特法则(LoD):一个对象应该与其他对象之间保持最少的交互。
这可以通过使用中介者模式等来实现。
7. 单元测试原则:每个类都应该有单元测试来确保其行为正确且符合预期。
这些原则可以帮助开发人员编写可扩展、易于维护和可重用的软件。
在实践中,应该尽可能遵循这些原则,但也应该根据特定的情况进行适当地调整。
设计程序时应遵循的基本原则
1、设计程序时应遵循的基本原则:此原则是由“Bertrand Meyer”原文是:“Software entities should be open for extension, but closed for modification”.就是说模块应对扩展开放,而对修改关闭。
模块应尽量在不修改原(是”原“,指原来的代码)代码的情况下进行扩展。
OO设计根本的指导原则是提高可维护性和可复用性。
这些原则主要有:1. 开闭原则2. 依赖倒转原则3. 里氏代换原则4. 合成/聚合复用原则5. 迪米特原则5.6. 接口隔离原则2、数据结构:数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
数据结构在计算机科学界至今没有标准的定义。
个人根据各自的理解的不同而有不同的表述方法:Sartaj Sahni 在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。
这些联系可以通过定义相关的函数来给出。
”他将数据对象(data object)定义为“一个数据对象是实例或值的集合”。
Clifford A.Shaffer 在《数据结构与算法分析》一书中的定义是:“数据结构是 ADT (抽象数据类型 Abstract Data Type)的物理实现。
”Lobert L.Kruse 在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层、数据结构层和实现层。
其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构及其运算,数据结构层和实现层讨论一个数据结构的表示和在计算机内的存储细节以及运算的实现。
3、算法的概念:4、计算机语言的分类和特点主要是从其抽象程度这个方面来考虑:没有抽象:机器语言第一层抽象,只是简单地把机器指令用符号来表示:汇编语言第二层抽象:面向过程的高级语言。
面向对象程序设计的七大原则
面向对象程序设计的七大原则是软件开发中的基本原则,也被称为“SOLID原则”。
这七个原则是由Robert C. Martin所提出的,是为了确保软件系统具有可扩展性、可维护性、可重用性和可测试性等优良的质量属性。
一、单一职责原则(SRP)单一职责原则指的是一个类应该有且只有一个引起它变化的原因。
换言之,一个类只承担一种职责或功能。
如果一个类具有多个职责,那么当其中一个职责变化时,可能影响其他职责的正确性和稳定性,从而导致软件系统出现难以预测的错误。
二、开放封闭原则(OCP)开放封闭原则指的是软件实体(类、模块等)应该是可扩展的,但不可修改的。
这意味着应该允许修改软件实体的行为,但不允许直接修改其源代码。
相反,应该通过添加新代码来扩展其功能。
通过遵循该原则,可以使软件系统更加稳定和易于维护。
三、里氏替换原则(LSP)里氏替换原则指的是,任何基类可以被替换为其子类,而不会影响软件系统的正确性。
换言之,一个子类应该能够替换掉其父类,同时保持其原有的行为和功能。
遵循该原则可以提高软件系统的灵活性和可扩展性。
四、接口隔离原则(ISP)接口隔离原则指的是,不应该限制一个类必须实现其不需要的接口。
接口应该是精简的,只包含其实现类所需要的方法和属性。
这样可以避免代码冗余和不必要的复杂性,从而提高代码的可读性和可维护性。
五、依赖倒置原则(DIP)依赖倒置原则指的是高层模块不应该依赖于低层模块,它们应该依赖于抽象接口。
同时,抽象接口也不应该依赖于具体实现类。
换言之,应该依赖于抽象而不是具体实现。
遵循该原则可以提高代码的灵活性和可重用性。
六、迪米特法则(Law of Demeter)迪米特法则,也被称为最少知识原则(LSP),其指导思想是一个对象应该尽量不去了解其它对象的内部实现细节。
这意味着一个对象只能与其直接联系的对象发生交互。
这样可以降低对象之间的耦合度,提高代码的可维护性和可测试性。
七、组合/聚合复用原则(CARP)组合/聚合复用原则是建立在利用继承和实现来实现代码重用的六大原则之外的一种方式。
js的七大原则--单一原则、开闭原则、替换原则(一)
js的七⼤原则--单⼀原则、开闭原则、替换原则(⼀)⼀.前⾔:js 的七⼤设计原则:1.单⼀原则2.开闭原则3.⾥⽒替换原则4.依赖倒转原则5.接⼝隔离原则6.合成复⽤原则7.迪⽶尔法则⼆.单⼀原则1.定义:单⼀原则就是⼀个对象或者⼀个⽅法,只做⼀件事。
⽐如,⽬前公司的前端框架,如下图:在src中api只是做接⼝层,assets⾥⾯是公共的⽅法,components是⽤来放组件的,⾥⾯的base和business分别存放的是基础组件和业务组件,mixins是⽤来存放混⼊的东西的。
store⽂件时⽤来放vuex中的东西的,style⽂件是⽤来存放样式的。
每个⽂件都有各⾃的职责,也都只负责⼀件事情。
这就符合单⼀职责的。
遵循单⼀职责的优点:1.可以降低类的复杂度,⼀个类只负责⼀项职责,其逻辑肯定要⽐负责多项职责简单的多。
2.提⾼类的可读性,提⾼系统的可维护性。
3.变更引起的风险降低,变更时必然的,如果单⼀职责原则遵守的好,当修改⼀个功能时,可以显著降低对其他功能的影响。
三.开闭原则尽量通过扩展软件实体来解决需求变化,⽽不是通过修改已有的代码来完成变化。
⼀个软件产品的⽣命周期内,都会发⽣变化,既然变化是⼀个既定的事实,我们就应该在设计的时候,尽量的适应这些变化。
以提⾼项⽬的稳定性和灵活性。
四.⾥⽒替换原则严格的定义:如果对每⼀个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序p在所有的对象o1都换成o2的时候,程序p的⾏为没有变化,那么类型T2就是类型T1的⼦类型。
通俗的定义:所有引⽤基类的地⽅必须能透明地使⽤其⼦类的功能。
更通俗的定义:⼦类可以扩展⽗类的功能,但是不能改变⽗类原有的功能。
⾸先来看⼀个例⼦,看它是否满⾜“⾥⽒替换”的原则//定义⼀个矩形类class Rectangle {constructor() {this.width=0;this.height=0;}setWidth(width) {this.width = width}setHeight(height) {this.height = height}getArea() {return this.width * this.height}}//定义⼀个正⽅形类,继承于矩形类class Square extends Rectangle {constructor() {super();}setWidth(width) {this.width = width;this.height = width;}setHeight(height) {this.height = heightthis.width = height}}// 执⾏的⽅法function result(rectangles) {rectangles.forEach((rectangle) => {rectangle.setHeight(5)rectangle.setWidth(4)let area = rectangle.getArea()console.log('area', area)})}let rectangles = [new Rectangle(), new Rectangle(), new Square()];result(rectangles) //结果是20 ,20, 16在我当初看到这个代码的时候,我的疑惑点在于为什么正⽅形求⾯积是16。
代码规范七大原则
代码规范七大原则代码规范是在编写代码过程中遵循的一系列准则,旨在提高代码的可读性、可维护性和可扩展性。
在实践中,代码规范可以有很多不同的实现方式,但是大致都会包含以下七个主要原则。
1. 一致性(Consistency):一致性是代码规范中最重要的原则之一、在代码中使用统一的命名规则、缩进风格、代码结构等,可以使代码更易于阅读和理解。
同时,一致性还可以减少不同团队成员之间可能产生的代码差异,降低协作过程中发生冲突的概率。
2. 可读性(Readability):可读性是代码规范的核心要求之一,因为可读性直接关系到其他人能否理解和修改你的代码。
为了提高可读性,代码应该遵循一些通用的规则,如使用有意义的命名、提供必要的注释、避免过长的函数和类等。
此外,代码布局的清晰和良好的缩进等也是提高可读性的有效手段。
3. 简洁性(Simplicity):简洁性是代码规范的另一个重要原则,旨在通过避免过度复杂的结构、逻辑和语法,使代码更清晰、易于理解和维护。
简洁的代码通常具有更好的可读性和可维护性,同时也更易于测试和调试。
编写简洁代码的关键在于选择恰当的算法和数据结构,并避免重复代码和冗余逻辑。
4. 可维护性(Maintainability):可维护性是指通过清晰的代码结构和模块化的设计,使代码容易被理解、修改和扩展。
为了提高可维护性,应该尽量避免使用过多的全局变量和复杂的控制流程,尽量将代码拆分成小的、独立的模块,方便修改和测试。
此外,合理的注释和文档也是提高代码的可维护性的重要手段。
5. 可扩展性(Scalability):可扩展性是指代码可以在不改变原有功能的情况下,方便地添加新的功能或适应更大规模的问题。
为了提高代码的可扩展性,应该遵循面向对象编程的原则,如封装、继承和多态。
此外,模块化的设计也是提高可扩展性的有效方法,将功能相似的代码封装成独立的模块,可以方便地替换、添加和删除。
6. 可测试性(Testability):可测试性是指代码能够方便地被自动化测试工具进行单元测试和集成测试。
举例说明软件设计7原则
举例说明软件设计7原则1. 单一职责原则(Single Responsibility Principle,SRP)一个类或模块应该只有一个改变的原因。
即,一个类或模块应该只有一个责任。
举例:一个数据处理类,它的职责是读取数据、处理数据并将结果返回。
如果将文件读取和数据处理的责任放在同一个类中,这违反了单一职责原则。
应该将文件读取和数据处理分别封装到两个单独的类中。
2. 开放封闭原则(Open-Closed Principle,OCP)软件实体(类,模块,函数等)应该对扩展开放,对修改封闭。
举例:一段代码用于计算员工的薪水,其中有一个计算基础薪水的函数。
如果需要增加一个新的员工类型,只需要创建一个新的类来实现员工的新薪水计算逻辑,而不需要修改原有的计算基础薪水的函数。
3. 里氏替换原则(Liskov Substitution Principle,LSP)子类型必须能够替换其基类型。
即,如果一个类B是类A的子类,那么在任何使用类A的地方都可以用类B来替换。
举例:有一个基类Animal,派生出子类Cat和Dog。
在一个方法中,如果传入一个Animal对象作为参数,应该能够接受任何Animal的子类对象作为参数。
4. 依赖倒置原则(Dependency Inversion Principle,DIP)高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
抽象不应该依赖于细节,细节应该依赖于抽象。
举例:有一个Logger类用于记录日志,该类应该依赖于一个抽象的日志接口,而不应该直接依赖于具体的文件日志类。
这样,在需要更换日志实现方式时,只需要创建一个新的实现了日志接口的类,无需修改Logger类。
5. 接口隔离原则(Interface Segregation Principle,ISP)客户端不应该依赖于它不需要的接口。
一个类不应该强迫其客户端依赖于它们不需要的方法。
举例:有一个图形类,它有用于绘制线条、绘制矩形、绘制圆形的方法。
代码规范化的七大原则
代码规范化的七大原则
1.一致性
代码一致性是指在整个项目中,使用相同的命名规约、风格和格式来编写代码。
这样可以让团队成员之间更容易理解和维护代码,提高代码的可读性。
2.简洁性
代码应该尽量简洁,不包含冗余代码和多余的注释。
简洁的代码更易于理解和修改,并且可以提高代码执行效率。
3.可读性
代码应该具有良好的可读性,即使是其他人也能轻松理解代码的意图和功能。
为了提高代码的可读性,可以使用有意义的命名、合理的缩进和注释,并避免使用过于复杂的逻辑和嵌套结构。
4.模块化
代码应该按照功能和责任进行模块化,将不同的功能拆分为独立的模块。
这样可以提高代码的可维护性和可复用性,并减少代码的重复。
5.错误处理
代码应该具备良好的错误处理机制,能够捕获和处理异常情况,避免程序崩溃或产生不可预期的结果。
错误处理可以通过异常处理机制、错误码返回和日志记录等方式实现。
6.安全性
在编写代码时,应该考虑到安全性问题,避免一些常见的安全漏洞和攻击方式。
例如,输入验证、密码加密、访问控制和数据保护等。
7.可测试性
代码应该具备良好的可测试性,能够方便地进行单元测试、集成测试和性能测试等。
为了提高代码的可测试性,可以使用依赖注入、单一职责原则和解耦等设计原则。
总结起来,代码规范化的七大原则是一致性、简洁性、可读性、模块化、错误处理、安全性和可测试性。
遵循这些原则可以提高代码的质量和可维护性,进而提高软件开发效率和用户满意度。
Python6大设计原则
Python6⼤设计原则内容总览六⼤设计原则都有哪些⼀、单⼀职责原则⼆、⾥⽒替换原则三、依赖倒置原则四、接⼝隔离原则五、迪⽶特法则六、开放封闭原则内容详解⼀、单⼀职责原则单⼀职责原则:英⽂名称是Single Responsiblity Principle,简称是SRP。
定义:应该有且仅有⼀个原因引起类的变更。
单⼀职责原则要求:⼀个接⼝或类只有⼀个原因引起变化,也就是⼀个接⼝或类只有⼀个职责,它就负责⼀件事情。
单⼀职责原则的好处:1. 类的复杂性降低,实现什么职责都有清晰明确的定义;2. 可读性提⾼,复杂性降低,那当然可读性提⾼了;3. 可维护性提⾼,可读性提⾼,那当然更容易维护了;4. 变更引起的风险降低,变更是必不可少的,如果接⼝的单⼀职责做得好,⼀个接⼝修改只对相应的实现类有影响,对其他的接⼝⽆影响,这对系统的扩展性、维护性都有⾮常⼤的帮助。
注意:单⼀职责原则提出了⼀个编写程序的标准,⽤“职责”或“变化原因”来衡量接⼝或类设计得是否优良,但是“职责”和“变化原因”都是不可度量的,因项⽬⽽异,因环境⽽异。
对于单⼀职责原则,接⼝⼀定要做到单⼀职责,类的设计尽量做到只有⼀个原因引起变化。
⼆、⾥⽒替换原则⾥⽒替换原则(Liskov Substitution Principle,LSP),有两种定义:第⼀种定义,也是最正宗的定义:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T ,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果对每⼀个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的⾏为没有发⽣变化,那么类型S是类型T的⼦类型。
软件工程的七条基本原理
软件工程的七条基本原理自从1968年提出“软件工程”这一术语以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或信条。
美国著名的软件工程专家 Boehm 综合这些专家的意见,并总结了TRW公司多年的开发软件的经验,于1983年提出了软件工程的七条基本原理。
Boehm 认为,着七条原理是确保软件产品质量和开发效率的原理的最小集合。
它们是相互独立的,是缺一不可的最小集合;同时,它们又是相当完备的。
人们当然不能用数学方法严格证明它们是一个完备的集合,但是可以证明,在此之前已经提出的100多条软件工程准则都可以有这七条原理的任意组合蕴含或派生。
下面简要介绍软件工程的七条原理:1 用分阶段的生命周期计划严格管理这一条是吸取前人的教训而提出来的。
统计表明,50%以上的失败项目是由于计划不周而造成的。
在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。
这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。
Boehm 认为,在整个软件生命周期中应指定并严格执行6类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。
2 坚持进行阶段评审统计结果显示:大部分错误是在编码之前造成的,大约占63%; <2> 错误发现的越晚,改正它要付出的代价就越大,要差2到3个数量级。
因此,软件的质量保证工作不能等到编码结束之后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。
3 实行严格的产品控制开发人员最痛恨的事情之一就是改动需求。
但是实践告诉我们,需求的改动往往是不可避免的。
这就要求我们要采用科学的产品控制技术来顺应这种要求。
也就是要采用变动控制,又叫基准配置管理。
当需求变动时,其它各个阶段的文档或代码随之相应变动,以保证软件的一致性。
4 采纳现代程序设计技术从六、七时年代的结构化软件开发技术,到最近的面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。
设计模式七大原则
设计模式七⼤原则1. 设计模式的⽬的编写软件过程中,程序员⾯临着来⾃耦合性,内聚性以及可维护性,可扩展性,重⽤性,灵活性等多⽅⾯的挑战,设计模式是为了让程序(软件),具有更好的 1) 代码重⽤性 (即:相同功能的代码,不⽤多次编写) 2) 可读性 (即:编程规范性, 便于其他程序员的阅读和理解) 3) 可扩展性 (即:当需要增加新的功能时,⾮常的⽅便,称为可维护) 4) 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响) 5) 使程序呈现⾼内聚,低耦合的特性分享⾦句: 设计模式包含了⾯向对象的精髓,“懂了设计模式,你就懂了⾯向对象分析和设计(OOA/D)的精要” Scott Mayers 在其巨著《Effective C++》就曾经说过:C++⽼⼿和 C++新⼿的区别就是前者⼿背上有很多伤疤2. 设计模式七⼤原则设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础(即:设计模式为什么这样设计的依据)设计模式常⽤的七⼤原则有:1. 单⼀职责原则2. 接⼝隔离原则3. 依赖倒转(倒置)原则4. ⾥⽒替换原则5. 开闭原则6. 迪⽶特法则7. 合成复⽤原则3. 单⼀职责原则(SingleResponsibility)基本介绍 对类来说的,即⼀个类应该只负责⼀项职责。
如类 A 负责两个不同职责:职责 1,职责 2。
当职责 1 需求变更⽽改变 A 时,可能造成职责 2 执⾏错误,所以需要将类 A 的粒度分解为 A1,A2应⽤实例 以交通⼯具案例讲解package com.atguigu.principle.singleresponsibility;public class SingleResponsibility1 {public static void main(String[] args) {Vehicle vehicle = new Vehicle();vehicle.run("摩托车");vehicle.run("汽车");vehicle.run("飞机");}}/*** 交通⼯具类* ⽅式⼀* 1. 在⽅式⼀的 run ⽅法中,违反了单⼀职责原则* 2. 解决的⽅案⾮常的简单,根据交通⼯具运⾏⽅法不同,分解成不同类即可*/class Vehicle{public void run(String vehicle){System.out.println(vehicle + "在公路上运⾏...");}}⽅案⼀package com.atguigu.principle.singleresponsibility;public class SingleResponsibility2 {public static void main(String[] args) {RoadVehicle roadVehicle = new RoadVehicle();roadVehicle.run("摩托车");roadVehicle.run("汽车");AirVehicle airVehicle = new AirVehicle();airVehicle.run("飞机");}}/*** ⽅案⼆的分析* 1. 遵守单⼀职责原则* 2. 这样做的改动很⼤,即将类分解,同时修改客户端* 3. 改进:直接修改 Vehicle 类,改动的代码会⽐较少 => ⽅案三*/class RoadVehicle{public void run(String vehicle){System.out.println(vehicle + "在公路运⾏");}}class AirVehicle{public void run(String vehicle){System.out.println(vehicle + "在天空运⾏");}}class WaterVehicle{public void run(String vehicle){System.out.println(vehicle + "在⽔中运⾏");}}⽅案⼆package com.atguigu.principle.singleresponsibility;public class SingleResponsibility3 {public static void main(String[] args) {Vehicle2 vehicle2 = new Vehicle2();vehicle2.run("摩托车");vehicle2.runAir("飞机");vehicle2.runWater("轮船");}}/*** ⽅式三的分析* 1. 这种修改⽅法没有对原来的类做⼤的修改,只是增加⽅法* 2. 这⾥虽然没有在类这个级别上遵守单⼀职责原则,但是在⽅法级别上,仍然是遵守单⼀职责 */class Vehicle2{public void run(String vehicle){System.out.println(vehicle + "在公路运⾏...");}public void runAir(String vehicle){System.out.println(vehicle + "在天空运⾏...");}public void runWater(String vehicle){System.out.println(vehicle + "在⽔中运⾏...");}}⽅案三单⼀职责原则注意事项和细节1. 降低类的复杂度,⼀个类只负责⼀项职责2. 提⾼类的可读性,可维护性3. 降低变更引起的风险4. 通常情况下,我们应当遵守单⼀职责原则,只有逻辑⾜够简单,才可以在代码级违反单⼀职责原则; 只有类中⽅法数量⾜够少,可以在⽅法级别保持单⼀职责原则4. 接⼝隔离原则(Interface Segregation Principle)基本介绍 1. 客户端不应该依赖它不需要的接⼝,即⼀个类对另⼀个类的依赖应该建⽴在最⼩的接⼝上 2. 看图: 3. 类A通过接⼝ Interface1 依赖类B,类C通过接⼝ Interface1 依赖类D,如果接⼝ Interface1 对于类A和类C来说不是最⼩接⼝,那么类B 和类 D 必须去实现他们不需要的⽅法。
软件设计的七大基本原则
软件设计的七大基本原则软件设计是计算机科学领域中的核心工作之一。
在软件开发的过程中,成功的设计是非常重要的。
幸运的是,有一些基本原则可以帮助我们在制定和设计软件时避免一些常见的陷阱和错误。
以下是软件设计的七大基本原则。
一、单一功能原则单一功能原则是软件设计的核心原则之一。
它指出每个组件应该只具有一个单一的功能。
这有助于确保软件组件或模块的内聚性。
这也使得代码容易测试和维护,因为只有一个功能需要验证和修改。
如果一个组件或模块不遵循单一功能原则,它可能会变得越来越复杂,难以管理,从而增加错误的几率。
二、开闭原则开闭原则表明软件设计应该对扩展开放,对修改关闭。
这意味着在进行软件设计时,我们应该尽量避免修改已开发的代码,而应该通过添加新功能的方式来扩展它。
这有助于保持代码的稳定性和可靠性。
三、里氏替换原则里氏替换原则是软件设计的一种重要原则。
它要求我们就可以使用基础类的地方必须可以使用其子类,而且保证不会影响原有程序的正确性。
换句话说,要确保面向对象程序的正确性,应该在继承层次结构中使用它。
这样做可以确保程序的可扩展性、可读性和可维护性。
四、接口分离原则接口分离原则表明,客户端不应该被迫依赖于它不需要的接口。
对于一个类来说,应该只有对访问者有用的方法才应该公开。
这使得类更加灵活、解耦和易于测试。
五、依赖倒置原则依赖倒置原则表明高层模块不应该依赖于低层模块,而是应该依赖于抽象。
这意味着我们应该尽可能依赖于抽象类或接口,而不是具体类。
通过使用依赖倒置原则,我们可以使得代码更加模块化,降低耦合性。
六、迪米特法则迪米特法则指出,一个对象应该与其它对象保持最少的依赖关系。
换言之,一个类应该尽量减少其它对象(尤其是不同的类)与之交互的次数。
这样可以使得代码更加清晰、可测试和易于维护。
七、总体职责分离原则总体职责分离原则是软件设计的重要原则,要求我们将应用程序分成多个独立的组件或层次结构。
每个组件或层次结构都应该专注于特定的任务或职责。
面向对象设计七大原则
⾯向对象设计七⼤原则1. 单⼀职责原则(Single Responsibility Principle)每⼀个类应该专注于做⼀件事情。
2. ⾥⽒替换原则(Liskov Substitution Principle)超类存在的地⽅,⼦类是可以替换的。
3. 依赖倒置原则(Dependence Inversion Principle)实现尽量依赖抽象,不依赖具体实现。
4. 接⼝隔离原则(Interface Segregation Principle)应当为客户端提供尽可能⼩的单独的接⼝,⽽不是提供⼤的总的接⼝。
5. 迪⽶特法则(Law Of Demeter)⼜叫最少知识原则,⼀个软件实体应当尽可能少的与其他实体发⽣相互作⽤。
6. 开闭原则(Open Close Principle)⾯向扩展开放,⾯向修改关闭。
7. 组合/聚合复⽤原则(Composite/Aggregate Reuse Principle CARP)尽量使⽤合成/聚合达到复⽤,尽量少⽤继承。
原则:⼀个类中有另⼀个类的对象。
细则单⼀职责原则(Single Responsibility Principle)因为:可以降低类的复杂度,⼀个类只负责⼀项职责,其逻辑肯定要⽐负责多项职责简单的多;提⾼类的可读性,提⾼系统的可维护性;变更引起的风险降低,变更是必然的,如果单⼀职责原则遵守的好,当修改⼀个功能时,可以显著降低对其他功能的影响。
需要说明的⼀点是单⼀职责原则不只是⾯向对象编程思想所特有的,只要是模块化的程序设计,都适⽤单⼀职责原则。
所以:从⼤局上看Android中的Paint和Canvas等类都遵守单⼀职责原则,Paint和Canvas各司其职。
⾥⽒替换原则(Liskov Substitution Principle)因为:⾥⽒替换原则告诉我们,在软件中将⼀个基类对象替换成它的⼦类对象,程序将不会产⽣任何错误和异常,反过来则不成⽴,如果⼀个软件实体使⽤的是⼀个⼦类对象的话,那么它不⼀定能够使⽤基类对象。
软件设计七大原则
软件设计七⼤原则软件设计七⼤原则在软件开发中,为了提⾼软件系统的可维护性和可复⽤性,增加软件的可扩展性和灵活性,程序员要尽量根据软件设计七⼤原则来开发程序,从⽽提⾼软件开发效率、节约软件开发成本和维护成本。
这7种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。
其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;⾥⽒替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要⾯向接⼝编程;单⼀职责原则告诉我们实现类要职责单⼀;接⼝隔离原则告诉我们在设计接⼝的时候要精简单⼀;迪⽶特法则告诉我们要降低耦合度;合成复⽤原则告诉我们要优先使⽤组合或者聚合关系复⽤,少⽤继承关系复⽤。
1、开闭原则定义:⼀个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。
中⼼思想:⽤抽象构建框架,⽤实现扩展细节。
即⾯向抽象编程。
优点:提⾼软件系统的可复⽤性和可维护性。
举例:很多互联⽹公司实⾏弹性制考勤,每天上班8⼩时,这是不可修改的,但是什么时间上班和下班,是开放的。
因为越低层次的模块,越基础的模块,变化后影响的范围是越⼤的。
越⾼层次的模块变化后影响的范围则越⼩。
故⾯向对象编程中,⼀定要强调开闭原则。
2、依赖倒置原则定义:⾼层模块不应该依赖底层模块,⼆者都应该依赖其抽象。
抽象不应该依赖细节,细节应该依赖抽象。
针对接⼝编程,不要针对实现编程。
优点:可以减少类间的耦合性、提⾼系统稳定性,提⾼代码的可读性和可维护性,可降低修改程序所造成的的风险。
程序应依赖于接⼝,不应该依赖具体的实现类。
相对于细节的多变性,抽象的东西要稳定得多,以抽象为基础搭建起来的架构⽐以细节为基础搭建起来的架构要稳定得多。
3、单⼀职责原则定义:不要存在多于⼀个导致类变更的原因。
⼀个类/接⼝/⽅法只负责⼀项职责。
优点:降低类的复杂度、提⾼类的可读性,提⾼系统的可维护性,降低变更引起的风险。
4、接⼝隔离原则接⼝是设计时,对外部约定的契约。
面向对象七大基本设计原则
面向对象七大基本设计原则面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心。
在设计面向对象的程序的时,模式不是一定要套的,但是有一些原则最好是遵守。
这些原则已知的有七个,包括:单一职责原则、开闭原则、里氏代换原则、依赖注入(倒转)原则、接口分离原则、迪米特原则、合成聚合复用原则。
原则一单一职责原则单一职责原则(SRP:Single responsibility principle)又称单一功能原则核心:解耦和增强内聚性(高内聚,低耦合)。
描述:类被修改的几率很大,因此应该专注于单一的功能。
如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。
原则二里氏替换原则里氏替换原则(LSP:Liskov Substitution Principle)核心:在任何父类出现的地方都可以用他的子类来替代(子类应当可以替换父类并出现在父类能够出现的任何地方)四层含义:(1)子类必须完全实现父类的方法。
在类中调用其他类是务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。
(2)子类可以有自己的个性。
子类当然可以有自己的行为和外观了,也就是方法和属性(3)覆盖或实现父类的方法时输入参数可以被放大。
即子类可以重载父类的方法,但输入参数应比父类方法中的大,这样在子类代替父类的时候,调用的仍然是父类的方法。
即以子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或者更宽松。
(4)覆盖或实现父类的方法时输出结果可以被缩小。
原则三依赖注入原则依赖注入原则(DIP:Dependence Inversion Principle)别名:依赖倒置原则或依赖反转原则核心:要依赖于抽象,不要依赖于具体的实现三层含义:(1)高层模块不应该依赖低层模块,两者都应该依赖其抽象(抽象类或接口);(2)抽象不应该依赖细节(具体实现);(3)细节(具体实现)应该依赖抽象。
java开发七大原则
java开发七⼤原则Java开发设计——七⼤原则开闭原则(Open Closed Principle,OCP)含义开闭原则的含义是:当应⽤的需求改变时,在不修改软件实体的源代码或者⼆进制代码的前提下,可以扩展模块的功能,使其满⾜新的需求。
作⽤开闭原则是⾯向对象程序设计的终极⽬标,它使软件实体拥有⼀定的适应性和灵活性的同时具备稳定性和延续性。
具体来说,其作⽤如下:◆ 对软件测试的影响:软件遵守开闭原则的话,软件测试时只需要对扩展的代码进⾏测试就可以了,因为原有的测试代码仍然能够正常运⾏。
◆ 可以提⾼代码的可复⽤性:粒度越⼩,被复⽤的可能性就越⼤;在⾯向对象的程序设计中,根据原⼦和抽象编程可以提⾼代码的可复⽤性。
◆ 可以提⾼软件的可维护性:遵守开闭原则的软件,其稳定性⾼和延续性强,从⽽易于扩展和维护。
实现⽅式可以通过“抽象约束、封装变化”来实现开闭原则,即通过接⼝或者抽象类为软件实体定义⼀个相对稳定的抽象层,⽽将相同的可变因素封装在相同的具体实现类中。
因为抽象灵活性好,适应性⼴,只要抽象的合理,可以基本保持软件架构的稳定。
⽽软件中易变的细节可以从抽象派⽣来的实现类来进⾏扩展,当软件需要发⽣变化时,只需要根据需求重新派⽣⼀个实现类来扩展就可以了。
⾥⽒替换原则(Liskov Substitution Principle,LSP)含义继承必须确保超类所拥有的性质在⼦类中仍然成⽴。
⾥⽒替换原则主要阐述了有关继承的⼀些原则,也就是什么时候应该使⽤继承,什么时候不应该使⽤继承,以及其中蕴含的原理。
⾥⽒替换原是继承复⽤的基础,它反映了基类与⼦类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。
作⽤◆ ⾥⽒替换原则是实现开闭原则的重要⽅式之⼀。
◆ 它克服了继承中重写⽗类造成的可复⽤性变差的缺点。
◆ 它是动作正确性的保证。
即类的扩展不会给已有的系统引⼊新的错误,降低了代码出错的可能性。
实现⽅式⾥⽒替换原则通俗来讲就是:⼦类可以扩展⽗类的功能,但不能改变⽗类原有的功能。
软件设计的“七宗罪”及设计模式的七大原则
软件设计的“七宗罪”及设计模式的七大原则编写软件过程中,面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序,具有更好的代码重用性、可读性、可扩展性、可靠性,使程序呈现高内聚低耦合的特性。
软件设计的“七宗罪”:1.僵化性2.脆弱性3.牢固性4.粘滞性5.不必要的重复6.不必要的复杂性7.晦涩性1. 僵化性僵化性是指难以对软件进行改动,即使是简单的改动。
如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。
必须要改动的模块越多,设计就越僵化。
2. 脆弱性脆弱性是指在进行一个改动时,程序的许多地方就可能出现问题,即设计易于遭破坏。
并且,往往是出现新问题的地方与改动的地方并没有概念上的关联。
3. 牢固性牢固性是指设计中包含了对其他系统有用的部分,但要想把这些部分分离出来所需要的努力和风险是巨大的,即设计难以复用。
4. 粘滞性有的时候,一个改动可以以保持原有的设计意图和原有的设计框架的方式进行,也可以以破坏原始的意图和框架的方式进行。
第一种办法无疑会对系统的未来有利,第二种办法是去权宜之计,可以解决短期问题,但是会牺牲长期利益。
如果第二种办法比第一种办法容易得多的话,程序员就有可能牺牲长期利益,采取权宜之计,在一个通用的逻辑中建立一种特例,以便解决眼前的问题。
一个系统的设计,如果总是使得第二种办法比第一种办法来得容易,说明粘滞性过高。
一个粘滞性过高的系统会诱使维护它的程序员采取错误的维护方案。
5. 不必要的重复大量的重复代码往往是由于开发人员忽略了抽象,从而使系统不易理解,而且,软件中的重复代码,也会使系统的改动变得困难,不易于系统的维护。
6. 不必要的复杂性不必要的复杂性是指设计中包含了当前没有用的部分,即过分设计。
例如,对于逻辑复杂、技术先进的过度追求,导致了技术框架虽看似华丽却复杂难用。
再例如,在设计产品功能或界面交互时,过度追求体验完美、需求满足却导致实际体验下降、功能没人用。
流程程序法(IE七大手法)
11
流程法简介
流程及流程法简介: 物料型流程程序图的绘制示例:
工作任务:车制长轴。 开始:钢棒由储存架至锯床。 结束:涂防锈油至齐套库。
12
流程法简介
流程及流程法简介: 人型流程程序图的绘制示例:
工作任务:用量规核对工件尺 寸。 开始:工人坐在工作台旁,工 件在工作台上。 结束:工人坐在工作台旁,已 核对过的工件在工作台上。
(7)工作抽查法
抽 查 法
2
目录
1、流程及流程法简介
2、流程法的特点
3、流程法的应用范围
4、流程法的作用
5、流程法的基本原则
6、流程法的实施步骤
7、案例详解
8、流程法的精髓
3
流程法
4
流程法简介
流程及流程法简介: 什么是流程?
我们认为,流程就是一系列活动的组合,这一组合接受
各种投入要素,包括信息、资金、人员、技术等,最后通过 流程产生客户所期望的结果,包括产品、服务或某种决策结 果。
是将五种符号印在表格中,分析记录时,只需将各项工作按 照发生的顺序用直线将符号连接起来。而表头部分标有工作 部别、工作名称、现行方法与简易方法及最后统计。
14
流程法简介
流程及流程法简介: 绘制流程程序图表的注意事项:
图表上记述的内容必须是直接观察所得到的;
图表应提供尽可能全面的信息,所有的图表都应具备有关 信息的标头部分,包括:
者下一步加工之机器不胜重荷,须暂为等待所致,因此应对
各种控制作重点考虑。 5、等待分析:迟延为浪费,理应降至最低限度。此部分涉及 人员调配控制及闲余能量分析的问题,应考虑人为或设备改 进部分。
28
流程法的实施步骤
流程法的实施步骤:3、流程分析 应用最合适的技术,严格、系统地分析已记录的流程现状。
面向对象设计的七大原则
⾯向对象设计的七⼤原则在上⼀篇⾥我们谈了谈为何设计模式,那接下来我们再浅谈⼀下在⾯向对象设计中我们常常要遵循的⼀些原则。
这些原则是经过⽆数的前⼈总结出来的经验的结晶。
仅仅有遵循这些原则。
你才有可能涉及出优秀的代码。
今天我们要谈的原则有七⼤原则,即:单⼀职责。
⾥⽒替换。
迪⽶特法则,依赖倒转,接⼝隔离,合成/聚合原则。
开放-封闭。
1. 开闭原则定义:软件实体应当对扩展开放,对改动关闭。
这句话说得有点专业。
更通俗⼀点讲,也就是:软件系统中包括的各种组件,⽐如模块(Modules)、类(Classes)以及功能(Functions)等等。
应该在不改动现有代码的基础上。
去扩展新功能。
开闭原则中“开”。
是指对于组件功能的扩展是开放的。
是同意对其进⾏功能扩展的。
开闭原则中“闭”。
是指对于原有代码的改动是封闭的,即不应该改动原有的代码。
问题由来:凡事的产⽣都有缘由。
我们来看看。
开闭原则的产⽣缘由。
在软件的⽣命周期内,由于变化、升级和维护等原因须要对软件原有代码进⾏改动时。
可能会给旧代码中引⼊错误,也可能会使我们不得不正确整个功能进⾏重构,⽽且须要原有代码经过⼜⼀次測试。
这就对我们的整个系统的影响特别⼤。
这也充分展现出了系统的耦合性假设太⾼,会⼤⼤的添加后期的扩展。
维护。
为了解决问题,故⼈们总结出了开闭原则。
解决开闭原则的根本事实上还是在解耦合。
所以。
我们⾯向对象的开发,我们最根本的任务就是解耦合。
解决⽅法:当软件须要变化时。
尽量通过扩展软件实体的⾏为来实现变化。
⽽不是通过改动已有的代码来实现变化。
⼩结:开闭原则具有理想主义的⾊彩。
说的⾮常抽象,它是⾯向对象设计的终极⽬标。
其它⼏条原则,则能够看做是开闭原则的实现。
我们要⽤抽象构建框架,⽤实现扩展细节。
2. 单⼀职责原则(Single Responsibility Principle)定义:⼀个类。
仅仅有⼀个引起它变化的原因。
即:应该仅仅有⼀个职责。
每个职责都是变化的⼀个轴线。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件设计的七大原则
设计模式遵循的一般原则:
1.开-闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开发,对修改关闭.说的是,再设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展.换言之,应当可以在不必修改源代码的情况下改变这个模块的行为,在保持系统一定稳定性的基础上,对系统进行扩展。
这是面向对象设计(OOD)的基石,也是最重要的原则。
2.里氏代换原则(Liskov Substitution Principle,常缩写为.LSP)
(1).由Barbar Liskov(芭芭拉.里氏)提出,是继承复用的基石。
(2).严格表达:如果每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换称o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型.
换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别.只有衍生类可以替换基类,软件单位的功能才能不受影响,基类才能真正被复用,而衍生类也能够在基类的基础上增加新功能。
(3).反过来的代换不成立
(4).<墨子.小取>中说:"白马,马也; 乘白马,乘马也.骊马(黑马),马也;乘骊马,乘马也."
(5).该类西方著名的例程为:正方形是否是长方形的子类(答案是"否")。
类似的还有椭圆和圆的关系。
(6).应当尽量从抽象类继承,而不从具体类继承,一般而言,如果有两个具体类A,B有继承关系,那么一个最简单的修改方案是建立一个抽象类C,然后让类A和B 成为抽象类C的子类.即如果有一个由继承关系形成的登记结构的话,那么在等级结构的树形图上面所有的树叶节点都应当是具体类;而所有的树枝节点都应当是抽象类或者接口.
(7)."基于契约设计(Design By Constract),简称DBC"这项技术对LISKOV代换原则提供了支持.该项技术Bertrand Meyer伯特兰做过详细的介绍:
使用DBC,类的编写者显式地规定针对该类的契约.客户代码的编写者可以通过该契约获悉可以依赖的行为方式.契约是通过每个方法声明的前置条件(preconditions)和后置条件(postconditions)来指定的.要使一个方法得以执行,前置条件必须为真.执行完毕后,该方法要保证后置条件为真.就是说,在重新声明派生类中的例程(routine)时,只能使用相等或者更弱的
前置条件来替换原始的前置条件,只能使用相等或者更强的后置条件来替换原始的后置条件.
3.依赖倒置原则(Dependence Inversion Principle),要求客户端依赖于抽象耦合.
(1)表述:抽象不应当依赖于细节,细节应当依赖于抽象.(Program to an interface, not an implementaction)
(2)表述二:针对接口编程的意思是说,应当使用接口和抽象类进行变量的类型声明,参量的类型声明,方法的返还类型声明,以及数据类型的转换等.不要针对实现编程的意思就是说,不应当使用具体类进行变量的类型声明,参量类型声明,方法的返还类型声明,以及数据类型的转换等.
要保证做到这一点,一个具体的类应等只实现接口和抽象类中声明过的方法,而不应当给出多余的方法.
只要一个被引用的对象存在抽象类型,就应当在任何引用此对象的地方使用抽象类型,包括参量的类型声明,方法返还类型的声明,属性变量的类型声明等. (3)接口与抽象的区别就在于抽象类可以提供某些方法的部分实现,而接口则不可以,这也大概是抽象类唯一的优点.如果向一个抽象类加入一个新的具体方法,
那么所有的子类型一下子就都得到得到了这个新的具体方法,而接口做不到这一点.如果向一个接口加入了一个新的方法的话,所有实现这个接口的类就全部不能通过编译了,因为它们都没有实现这个新声明的方法.这显然是接口的一个缺点.
(4)一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的登记结构中,而由于一般语言都限制一个类只能从最多一个超类继承,因此将抽象作为类型定义工具的效能大打折扣.
反过来,看接口,就会发现任何一个实现了一个接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个接口.
(5)从代码重构的角度上讲,将一个单独的具体类重构成一个接口的实现是很容易的,只需要声明一个接口,并将重要的方法添加到接口声明中,然后在具体类定义语句中加上保留字以继承于该接口就行了.
而作为一个已有的具体类添加一个抽象类作为抽象类型不那么容易,因为这个具体类有可能已经有一个超类.这样一来,这个新定义的抽象类只好继续向上移动,变成这个超类的超类,如此循环,最后这个新的抽象类必定处于整个类型等级结构的最上端,从而使登
记结构中的所有成员都会受到影响.
(6)接口是定义混合类型的理想工具,所为混合类型,就是在一个类的主类型之外的次要类型.一个混合类型表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为.
(7)联合使用接口和抽象类:
由于抽象类具有提供缺省实现的优点,而接口具有其他所有优点,所以联合使用两者就是一个很好的选择.
首先,声明类型的工作仍然接口承担的,但是同时给出的还有一个抽象类,为这个接口给出一个缺省实现.其他同属于这个抽象类型的具体类可以选择实现这个接口,也可以选择继承自这个抽象类.如果一个具体类直接实现这个接口的话,它就必须自行实现所有的接口;相反,如果它继承自抽象类的话,它可以省去一些不必要的的方法,因为它可以从抽象类中自动得到这些方法的缺省实现;如果需要向接口加入一个新的方法的话,那么只要同时向这个抽象类加入这个方法的一个具体实现就可以了,因为所有继承自这个抽象类的子类都会从这个抽象类得到这个具体方法.这其实就是缺省适配器模式(Defaule Adapter).
(8)什么是高层策略呢?它是应用背后的抽象,是那些不
随具体细节的改变而改变的真理. 它是系统内部的系统____隐喻.
4.接口隔离原则(Interface Segregation Principle, ISP) (1)一个类对另外一个类的依赖是建立在最小的接口上。
(2)使用多个专门的接口比使用单一的总接口要好.根据客户需要的不同,而为不同的客户端提供不同的服务是一种应当得到鼓励的做法.就像"看人下菜碟"一样,要看客人是谁,再提供不同档次的饭菜.
(3)胖接口会导致他们的客户程序之间产生不正常的并且有害的耦合关系.当一个客户程序要求该胖接口进行一个改动时,会影响到所有其他的客户程序.因此客户程序应该仅仅依赖他们实际需要调用的方法.
5.合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过这些向对象的委派达到复用已有功能的目的.这个设计原则有另一个简短的表述:要尽量使用合成/聚合,尽量不要使用继承.
6.迪米特法则(Law of Demeter LoD)又叫做最少知识原则(Least Knowledge Principle,LKP),就是说,一个对象应当对其他对象有尽可能少的了了解.
迪米特法则最初是用来作为面向对象的系统设计风格的一种法则,与1987年秋天由Ian Holland在美国东北大学为一个叫做迪米特(Demeter)的项目设计提出的,因此叫做迪米特法则[LIEB89][LIEB86].这条法则实际上是很多著名系统,比如火星登陆软件系统,木星的欧罗巴卫星轨道飞船的软件系统的指导设计原则.
没有任何一个其他的OO设计原则象迪米特法则这样有如此之多的表述方式,如下几种:
(1)只与你直接的朋友们通信(Only talk to your immediate friends)
(2)不要跟"陌生人"说话(Don't talk to strangers)
(3)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些本单位密切相关的软件单位.
就是说,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
7.单一职责原则(Simple responsibility pinciple SRP)
就一个类而言,应该仅有一个引起它变化的原因,如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.应该把多于的指责分离出去,分别再创建一些类来完成每一个职责.
另外:常说的OO五大原则就是指其中的:1、单一职责原则;2、开放闭合原则;3、里氏替换原则;4、依赖倒置原则;5、接口隔离原则。