面向对象与面向过程

时间:2021-01-28 19:51:55
Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。
> 10个面向对象的设计原则:
原则1:DRY(Don't repeat yourself)
即不要写重复的代码,而是用“abstraction”类来抽象公有的东西。如果你需要多次用到一个硬编码值,那么可以设为公共常量;如果你要在两个以上的地方使用一个代码块,那么可以将它设为一个独立的方法。SOLID设计原则的优点是易于维护,但要注意,不要滥用,duplicate 不是针对代码,而是针对功能。这意味着,即使用公共代码来验证OrderID和SSN,二者也不会是相同的。使用公共代码来实现两个不同的功能,其实就是近似地把这两个功能永远捆绑到了一起,如果OrderID改变了其格式,SSN验证代码也会中断。因此要慎用这种组合,不要随意捆绑类似但不相关的功能。

原则2:封装变化
在软件领域中唯一不变的就是“Change”,因此封装你认为或猜测未来将发生变化的代码。OOPS设计模式的优点在于易于测试和维护封装的代码。如果你使用Java编码,可以默认私有化变量和方法,并逐步增加访问权限,比如从private到protected和not public。有几种Java设计模式也使用封装,比如Factory设计模式是封装“对象创建”,其灵活性使得之后引进新代码不会对现有的代码造成影响。

原则3:开闭原则
即对扩展开放,对修改关闭。这是另一种非常棒的设计原则,可以防止其他人更改已经测试好的代码。理论上,可以在不修改原有的模块的基础上,扩展功能。这也是开闭原则的宗旨。

原则4:单一职责原则
类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。

原则5:依赖注入或倒置原则
这个设计原则的亮点在于任何被DI框架注入的类很容易用mock对象进行测试和维护,因为对象创建代码集中在框架中,客户端代码也不混乱。有很多方式可以实现依赖倒置,比如像AspectJ等的AOP(Aspect Oriented programming)框架使用的字节码技术,或Spring框架使用的代理等。

原则6:优先利用组合而非继承
如果可能的话,优先利用组合而不是继承。一些人可能会质疑,但我发现,组合比继承灵活得多。组合允许在运行期间通过设置类的属性来改变类的行为,也可以通过使用接口来组合一个类,它提供了更高的灵活性,并可以随时实现。《Effective Java》也推荐此原则。

原则7:里氏代换原则(LSP)
根据该原则,子类必须能够替换掉它们的基类,也就是说使用基类的方法或函数能够顺利地引用子类对象。LSP原则与单一职责原则和接口分离原则密切相关,如果一个类比子类具备更多功能,很有可能某些功能会失效,这就违反了LSP原则。为了遵循该设计原则,派生类或子类必须增强功能。

原则8:接口分离原则
采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。设计接口很棘手,因为一旦释放接口,你就无法在不中断执行的情况下改变它。在Java中,该原则的另一个优势在于,在任何类使用接口之前,接口不利于实现所有的方法,所以单一的功能意味着更少的实现方法。

原则9:针对接口编程,而不是针对实现编程
该原则可以使代码更加灵活,以便可以在任何接口实现中使用。因此,在Java中最好使用变量接口类型、方法返回类型、方法参数类型等。《Effective Java》 和《head first design pattern》书中也有提到。

原则10:委托原则
该原则最典型的例子是Java中的equals() 和 hashCode() 方法。为了平等地比较两个对象,我们用类本身而不是客户端类来做比较。这个设计原则的好处是没有重复的代码,而且很容易对其进行修改。

总之,希望这些面向对象的设计原则能帮助你写出更灵活更好的代码。
C是面向过程;C++、 JAVA是面向对象

> 面向对象和面向过程的区别

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面向过程 基于算法 函数/过程 数据流图、伪代码... ...
面向对象 基于对象 类 UML建模... Rose,viso等

其实我始终认为,不管是面向对象,还是面向过程,都体现了一种软件重用的思想!
只不过面向过程中重用的是过程和函数,但是面向对象重用的是类,一种将数据和处理数据的过程及函数封装在一起的实体,其实面向对象中的过程和函数和面向过程中的分别不是很大,所以数据流图和伪代码还是有用的。面向对象一个很大的好处就是数据 和方法的封装,由此面向对象的三大特性得到发挥面向过程是在面向对象出现之前,以及之后,甚至至今都应用于程序开发中的程序设计思想。
      面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面向对象和面向过程
1.面向过程程序设计方法的实质上是从计算机处理问题的观点来进行程序设计工作:输入——运算——输出。面向过程程序设计者需要变更习惯的思维方法以贴近计算机的内部工作机理。面向过程程序设计所具有的流的工作性质,试图通过信息流及其转换来认识系统,

不仅加大了程序设计的难度,同时亦使得程序的可理解性比较差。
面向对象程序设计方法中,一种普遍采用的优化方法是使用结构化的程序设计方法。
面向过程程序设计方法一般适宜采用自上而下的设计方法。
面向过程程序设计方法需要在一开始就全面的,自上而下的设计整个应用程序的架构,因此要求程序设计者对问题域有全面的了解。
面向过程程序设计方法很难复用以前已经设计完成的软件。
2.面向对象程序设计是一种自下而上的程序设计方法,往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计一数据为中心,类作为表现数据的工具,成为划分程序的基本单位。


面向对象有以下几个重要特点:
   (1)客观世界有对象组成
   (2)对象抽象为类
   (3)类与类之间存在继承关系
   (4)对象之间通过传递消息而彼此联系

面向过程
  优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
  缺点:没有面向对象易维护、易复用、易扩展

面向对象
  优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
  缺点:性能比面向过程低

  面向对象程序设计的一些显著的特性包括:
  .程序设计的重点在于数据而不是过程;
  .程序被划分为所谓的对象;
  .数据结构为表现对象的特性而设计;
  .函数作为对某个对象数据的操作,与数据结构紧密的结合在一起;
  .数据被隐藏起来,不能为外部函数访问;
  .对象之间可以通过函数沟通;
  .新的数据和函数可以在需要的时候轻而易举的添加进来;
  .在程序设计过程中遵循由下至上(bottom-up)的设计方法。

OOP具有许多优点,无论是对于程序设计者或者用户来说都是如此。面向对象为软件产品扩
展和质量保证中的许多问题提供了解决办法。这项技术能够大大提高程序员的生产力,并可
提高软件的质量以及降低其维护费用。其主要的优点陈列于下:
  1、通过继承,我们可以大幅减少多余的代码,并扩展现有代码的用途;
  2、我们可以在标准的模块上(这里所谓的"标准"指程序员之间彼此达成的协议)构建
我们的程序,而不必一切从头开始。这可以减少软件开发时间并提高生产效率;
  3、数据隐藏的概念帮助程序员们保护程序免受外部代码的侵袭;
  4、允许一个对象的多个实例同时存在,而且彼此之间不会相互干扰;
  5、允许将问题空间中的对象直接映射到程序中;
  6、基于对象的工程可以很容易的分割为独立的部分;
  7、以数据为中心的设计方法允许我们抓住可实现模型的更多细节;
  8、面向对象的系统很容易从小到大逐步升级;
  9、对象间通讯所使用的消息传递技术与外部系统接口部分的描述更简单;
  10、更便于控制软件复杂度。

  当需要将以上所说的所有特性有机的结合于一个面向对象系统中,它们之间的相对重要
性就取决于工程的类型和程序员的喜好。为了获得上述的某些优势,必须考虑很多事情。例
如,对象库必须可以被重用。技术还在不停的发展,现有的产品也会很快的更新换代。如果
重用没有能够实现,那么就需要进行严格的控制和管理。易于使用的开发软件往往难以编写。面向对象程序设计工具有望解决这个问题。

总结面向对象的概念和术语汇总表
术语 描述
Abstract Class抽象类 不能实例化的类
Abstraction抽象 一个项目(可能是类或者操作)的本质特征
Aggregation聚合 两个类或者组件之间的关系,定义为“is part of”
Association关联 两个类或者对象之间的关系
Attribute属性 类了解的东西(数据/信息)
Cardinality基数 表示“有多少”的概念
Class类 类似对象的一种软件抽象,创建对象的模板
Cohesion内聚 封装单元(如组件或者类)的相关程度
Component组件 一种内聚功能单元,可以独立开发、发布、由其他组件编辑组成更大的单元。
Composition组合 强类型的聚合,其中“整体”完全负责各个组成部分,每个部分对象仅与一个“整体”对象相关联
Concrete Class具体类 可以从中实例化对象的类
Coupling耦合 两个项目之间的依赖程度
Generalization泛化 表示一个更泛化的元素和一个更具体的元素之间的关系。
Inheritance继承 定义为“is a”或者“is like”的关系
Instance实例 一个对象,它是某个类的一个示例
Instantiate实例化 从类定义中创建对象
Interface接口 定义了一套内聚行为的一个或多个操作特性标记的集合
Message消息 请求星系或者执行任务
Messaging消息传递 对象之间通过发送消息相互协作的过程
Method方法 有执行值操作的类实现的一个过程(与结构化编程中的函数相似)
Multiple Inheritance多重继承 直接继承自一个以上的类
Object对象 基于类定义的人物、地点、事件、事物等等
Optionality选择性 概念“你需要它吗?”
Override 在子类中重新定义属性和/或方法,以使它们与父类中的定义有区别
Pattern 在考虑相关因素的情况下,通用问题的一个可行性解决方案
Polymorphism多态 不同的对象可以以不同的方式响应同一消息,使对象可以交互而不需要知道确切的类型
Property 在UML2中,是一个命名的值,例如,属性和关联,包括组合,指定元素(例如类或者组件)的一个特征。在Java中,属性的组合包括Getter和Setter
Single Inheritance多重继承 仅从一个类直接继承
Stereotype构造型 建模元素的一种通用用法
Subclass子类 继承自另一个类的类
Superclass父类 另一个类从中继承的类

SOLID原则是类级别的,面向对象的设计理念:
(S)RP 单一职责原则 一个类有且只有一个更改的原因。
(O)CP 开闭原则 能够不更改类而扩展类的行为。
(L)SP 里氏替换原则 派生类可以替换基类被使用。
(I)SP 接口隔离原则 使用客户端特定的细粒度接口。
(D)IP 依赖反转原则 依赖抽象而不是具体实现。

面向对象并不是因为有了对象就高大上了,实则是因为它实实在在的解决了软件开发中的许多问题。你想想,仅仅是对struct 加了个访问控制而已,就演化出封装、继承、多态,而这些特性是面向过程语言不易构造出的,更关键的,它使代码复用变得容易许多(还是觉得函数才是复用的单元).


> 引用:

java回忆录—类与对象(万物皆对象):  http://blog.csdn.net/qq_22063697/article/details/52109006

java回忆录—面向过程和面向对象的比较:  http://blog.csdn.net/qq_22063697/article/details/52107881

---------------------------------------------------------

PO:
persistant object持久对象
最形象的理解就是一个PO就是数据库中的一条记录。
好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
--------------------------------------------------------------------------------
BO:
business object业务对象
主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。
比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
这样处理业务逻辑时,我们就可以针对BO去处理。
--------------------------------------------------------------------------------
VO :
value object值对象
ViewObject表现层对象
主要对应界面显示的数据对象。对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。
--------------------------------------------------------------------------------
DTO :
Data Transfer Object数据传输对象
主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO
--------------------------------------------------------------------------------
POJO :
plain ordinary java object 简单java对象
个人感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象。
一个POJO持久化以后就是PO
直接用它传递、传递过程中就是DTO
直接用来对应表示层就是VO
--------------------------------------------------------------------------------
DAO:
data access object数据访问对象
这个大家最熟悉,和上面几个O区别最大,基本没有互相转化的可能性和必要.
主要用来封装对数据库的访问。通过它可以把POJO持久化为PO,用PO组装出来VO、DTO

-------------------------------------------------------------------------------

Java面向对象知识总结- http://blog.csdn.net/qq_35101189/article/details/53976217