OOP (Object Oriented Programing)面向对象编程
拓展:
OOD(面向对象的设计)、OOA(面向对象的分析)
面向对象和面向过程的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。强调的是过程;
面向对象就是把构成问题的事物分解成各个对象,建立对象的目的不是完成一个步骤,而是描述事物在解决问题的步骤中的行为。通过这种思想把事物简单化,从原来的执行者转化为指挥者,面对对象是基于面向过程而言的。强调的是结果。
优缺点:
面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,
例如单机片、嵌入式开Linux/Unix等一般采用面向过程开发,性能是最重要的因素
缺点:没有面向对象易维护、易复用、易扩展
面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计
出低耦合的系统,使系统更加灵活、更易于维护
缺点:性能比面向过程低
三大特性和五大基本原则
三大特性
封装(encapsulation)
是处理对象的一个重要概念。从形式上看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。实现封装的关键在于,绝不能让类中的方法直接访问其他类的实例字段,程序只能通过对象的方法和对象数据进行交互,封装给对象赋予了“黑盒”特征,这是提高重用性和可靠性的关键。
继承(inheritance)
继承的基本思想,可以基于已有的类创建新的类。继承已存在的类就是复用(继承)这些类的方法,而且可以增加一些新的方法和字段,使新类能够适应新的情况,这是Java程序设计中的一项核心技术。
多态
是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
五大基本原则
单一职责原则 SPR(Single Responsibility Principle)
是指一个类的功能单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一直忙碌,效率却高不起来。
开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只能服务端功能,而现在要加入客户端功能,那么应当在不用修改服务器端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务器端和客户端分开,公共部分抽象出来。
里氏替换原则LSP(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。
依赖倒置原则DIP(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类;而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口;这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的文件,而编译B时童谣直接包含到A的文件。
接口分离原则ISP(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。
耦合
软件工程中对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。
有软硬件之间的耦合,还有软件各模块之间的耦合。
耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。
耦合度由高到低排列如下:
- 内容耦合:当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用。
- 公共耦合:两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
- 外部耦合:一组模块都访问同一全局简单变量而不是同意全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
- 控制耦合:一个模块通过接口向另一个模块传递一个控制信号,接收信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。
- 标记耦合:若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。
- 数据耦合:模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。
- 非直接耦合:两个模块之间没有直接关系,他们之间的联系完全是通过主模块的控制和调用来实现的。
总结:
耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们采用以下原则:如果模块之间必须存在耦合,就尽量使用数据耦合,少使用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。
内聚与耦合
内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然拓展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。
耦合是软件结构中各个模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。程序讲究的是低耦合,高内聚。就是同一模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却要不那么紧密。
内聚和耦合是密切相关的,同其它模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其它模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合。
参考学习文章:
https://www.cnblogs.com/corvoh/p/5747856.html
https://blog.csdn.net/jerry11112/article/details/79027834
https://www.jianshu.com/p/7a5b0043b035