面向对象的基本理念
面向对象(Object Oriented Programming)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种模拟现实世界解决现实问题而使计算机编程的指令集合,是计算机编程技术发展到一定阶段后的产物
面向对象六大原则
面向对象六大原则更加证实了易维护、易复用、易扩展的,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
一、六大原则之单一职责原则
单例职责原则简称(SRP Single responsibility principle)
单一职责原则是五大原则中最为简单好理解的一个原则,单一职责原则类似于每一个人聚精会神的做一件事,然后别人又给你分配一件事就很容易把之前做的那件事情思路打断,接着新的事情和旧事情一起做,在做起第一件事的时候思路很容易匮乏短缺,这就类似于一个方法中执行操作,会使改方法操作高耦合,高内聚的可能
SpringMVC只负责简化MVC开发、Reader类只负责读取文本文件内容、Math.round方法只负 责四舍五入,就是把每一步骤都简化为一个方法操作一件事物
public static void main(String[] args) {
//反例演示
int num = 1;
int num1 = 2;
//执行加操作也在测试中
int sum = num + num1;
System.out.println(sum);
//执行积操作也在测试中
int sum1 = num * num1;
System.out.println(sum1);
}
这样的代码要是都在测试代码中,会很显得臃肿的
将每一个操作都封装为一个方法就可以体现出每个方法都是一个独立的操作,还可以进行复用‘
public static void main(String[] args) {
//反例演示
int num = 1;
int num1 = 2;
show(num,num1);
show1(num,num1);
}
//处理相加操作
public static int show(int num , int num1) {
return num + num1;
}
//处理相乘操作
public static int show1(int num , int num1) {
return num * num1;
}
二、六大原则之开闭原则
开闭原则简称(OCP open close principle)
开闭原则就是对拓展开放,对修改源码关闭,要是直接在源码上进行修改后其他方法也会跟着随之变动,解决方法可以使用继承解决、接口实现解决
三、六大原则之接口分离原则
接口分离原则(ISP Interface Segregation Principle)
接口分离原则也有一些类似于单一职责原则上,这个针对于接口而言更加的减少接口都存在与一个大接口的臃肿操作
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来,每一个接口都处理自己对应的处理抽象方法
四、六大原则之依赖倒置原则
依赖倒置原则(DIP Dependence Inversion Principle)
依赖倒置原则主要体现于面向接口编程,把每一个方法都通过接口的形式进行操作,要是直接和每一个类直接使用的话如若更改其中一个类的操作,另外一个主类会受到牵制,就会用到抽象方法进行分割,主类依赖于抽象方法就可以使用其他操作其他类
最为主要凸显依赖倒置原则的是三层架构,三层架构中将每一个方法都抽成了接口,进行实现接口就可以对应的操作每一步独立操作而还不破坏类与类之间,即可以降低耦合有方便维护
五、六大原则之里氏替换原则
里氏替换原则(LSP Liskov Substitution Principle)
正常的面向对象都是以"is a"为基准抽取共性继承父类的,任何父类出现的地方子类也一定出现,但是这种形式会有一个弊端,只要子类继承于父类,但子类如果不符合父类的某一个方法时,就会体现出父子类之间是满足"is a "的原理,但是子类也会破坏父类中的操作,只有在子类完全可以替换父类时从而不破坏父类中的方法即可满足里氏替换原则,咱们很多时候都往往都忽略了里氏替换原则
错误示范
//长方形
public class Rectangle {
private int width;
private int height;
public void reSize(){
while (this.height <= this.width){
System.out.println(height);
this.setHeight(this.getHeight() + 1);
}
}
//正方形
public class Square extends Rectangle {
public void setWidth(int width) {
super.setWidth(width);
super.setHeight(width);
}
}
/**
* 正方形是特殊矩形,然后长方形是矩形,
* 父类方法中长和宽都要是两个不同长度而正方形长和宽都是相等的
* 在调用父类的方法时,就会体现出父类的
*/
public static void main(String[] args) {
//测试代码
testRectangle();
testSquare();
}
public void testRectangle() {
Rectangle rectangle = new Rectangle();
rectangle.setWidth(100);
rectangle.setHeight(50);
rectangle.reSize();
System.out.println(rectangle);
}
public void testSquare() {
Square square = new Square();
square.setHeight(100);
square.reSize();
}
六、六大原则之迪米特法则(最少知道原则)
迪米特法则(LoD Law of Demeter)
迪米特法则为了减少对象与其他兑现之间的减少访问量,及对象之间的耦合度减少
一个对象应当对其他对象有尽可能少的了解,不和陌生人说话
将一个对象的操作都封装在一个方法中,在外部调用该方法时才可以知道本类中其他操作,其他情况不知道也不可能直接用new本类调用其他方法
最后给你们来一个耦合关系度
简单地说,软件工程中对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。
有软硬件之间的耦合,还有软件各模块之间的耦合。
耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。
耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:
- 内容耦合:当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
- 耦合:两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
- 外部耦合 :一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
- 控制耦合 :一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。
- 标记耦合 :若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。
- 数据耦合:模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。
- 非直接耦合 :两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。
总结
耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。
高内聚与耦合
内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。
耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。 程序讲究的是低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却要不那么紧密。
内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合
有什么不足的地方可以指正出来