文档章节

OOP面向对象编程

wiitht
 wiitht
发布于 2017/06/19 16:23
字数 3906
阅读 6
收藏 0

在运用面向对象的思维方法进行软件设计的过程中,最容易犯的错误就是开始分析的时候,就想到了程序代码实现的细节,因此封装的类完全是基于程序实现逻辑,而不是基于解决问题的业务逻辑。 

面向对象的设计是基于解决业务问题的设计,而不是基于具体编程技术的设计。我不会去封装select语句的,我只封装解决问题的业务逻辑,对数据库的读取是在业务逻辑的编码实现阶段才去考虑的问题。

例:如果按照一般从程序实现的角度来分析,我们会这样考虑:首先是从HTTP GET请求取到id,然后按照id查数据库表,获得某id对应的访问计数值,然后加1,更新数据库,最后向页面显示访问计数。

我需要有一个计数器,这个计数器应该有这样的功能,刷新一次页面,访问量就会加1,另外最好还有一个计数器清0的功能,当然计数器如果有一个可以设为任意值的功能的话,我就可以作弊了。
需求,我的业务逻辑是什么,软件应该有什么功能。

在面向对象的软件分析和设计的时候,要提醒自己,不要一上来就去想程序代码的实现,应该抛开具体编程语言的束缚,集中精力分析我们要实现的软件的业务逻辑,分析软件的业务流程,思考应该如何去描述和实现软件的业务。毕竟软件只是一个载体,业务才是我们真正要实现的目标。 

使用面向对象的思维方法,其实是一个把业务逻辑从具体的编程技术当中抽象出来的过程,而这个抽象的过程是自上而下的,非常符合人类的思维习惯,也就是先不考虑问题解决的细节,把问题的最主要的方面抽象成为一个简单的框架,集中精力思考如何解决主要矛盾,然后在解决问题的过程中,再把问题的细节分割成一个一个小问题,再专门去解决细节问题。

 

1.面向对象设计的一个原则:在设计的时候不应过早的考虑具体程序语言的实现。所以必须用抽象的方法,和具体实现无关的方法来表达业务逻辑。
2.面向结构:在分析上可能是自顶而下,而在设计的时候是自底而上的设计是一种机器命令式的思考,更注重步骤,如演绎(一般到特殊)推理一样,耦合性非常高。
关系:纵向
特征:程序的执行过程是由程序员控制

面向过程:设计方法强调从软件的功能特性出发来思考问题,使用面向过程会在不同的级别上,把系统分为多个功能模块,同时尽量确保模块之间的耦合度最小

3.面向对象:在分析上可能是自底而上,而在设计的时候是自顶而下的设计是认识客观世界的过程。
--设计:是整体到部分的过程,要保证系统的“整体属性”,也要遵循“道”的原则(从辩证的角度)
--分析:世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。(哲学)
关系:横向
特征:程序的执行过程是由用户控制
面向对象:面向问题本身,从问题本身的角度思考,问题本身是由对象构成的,关注的是“做什么”才能解决问题,而这个过程是将业务逻辑抽象出来的过程,这个过程是设计和开发出由对象构成的系统(求解空间)的过程。

表现:
--分析:从问题空间的构成成员分析(前提:符合客观世界)
--设计:从求解空间分析基于问题空间而设计(符合客观世界)
    自上而下的设计更加符合“能做什么”的思维方式
    --将问题抽象成简单的框架,先解决主要矛盾,在将问题细化
    成细小的问题(从宏观角度看问题)

面向对象的方法进行系统的分析:
1)了解系统的功能。列举出它的对外接口,即对于使用者来说它有什么功能。把这整个系统作为一个对象。
2)环境。系统不是运行在真空中的,操作系统等外部环境都可能会影响它。所以把环境也作为一个大的对象。
3)内部。在系统的内部,一般都比较复杂,一般的做法是规定一个粒度,枚举出该粒度上所有的物体。比如说人体,如果在器官的粒度上,就有心,肝,肺。而小于该粒度的物体(或称对象),比如血细胞,就忽略,作为其它物体(或称子系统的内部对象)。
4)子系统。不断缩小粒度,沿用步骤1~3,直到不能再抽象为止。
5)无形的物体。一个完整的互连的系统需要许多无形的物体,比如消息等了,一般这样的对象比较难发现。当你发现各个子系统无法正确合作或理顺关系时,试着加入一些辅助对象。

面向对象技术就是要软件开发者从技术层面向管理层面倾斜,以宏观的眼光看待系统。

面向对象关注什么?关注的是对象的行为,面向对象是使用行为来对对象进行分类的.
在面向对象中派生类为什么能够替换基类(替换原则),不是因为派生类是一个基类,而是因为派生类具有与基类一致的行为

面向对象:软件系统尽可能的模拟现实世界的事物,按照现实世界中的客观规律来组织和实现软件产品
数据代表对象的状态,操作代表对象对内、外部环境变化的响应方式
面向对象分析:模型侧重于描述我们需要解决的问题是什么

4.设计:
自底向上设计:先设计一些较下层的程序,即去解决问题的各个不同的小部分,然后把这些部分组合成为完整的程序。
自顶向下设计:先对最高层次中的问题进行定义、设计、编程和测试,而将其中未解决的问题作为一个子任务放到下一层次中去解决。这样逐层、逐个地进行定义、设计、编程和测试,直到所有层次上的问题均由实用程序来解决,就能设计出具有层次结构的程序。 

思考:
1.在运用面向对象的思维方法进行软件设计的过程中,最容易犯的错误就是开始分析的时候,就想到了程序代码实现的细节,因此封装的类完全是基于程序实现逻辑,而不是基于解决问题的业务逻辑。
2.我有什么需求,我的业务逻辑是什么,软件应该有什么功能。
3.抛开具体编程语言的束缚,集中精力分析我们要实现的软件的业务逻辑,分析软件的业务流程,思考应该如何去描述和实现软件的业务
4.程序=算法+数据结构。结构化方法只是对传统程序结构的改进,用三种基本结构来组织程序,使程序结构更为清晰,程序开发更有序、更容易。
面向对象思想则以计算机信息处理和信息管理的功能为前提,模拟客观世界的事物及事物之间的联系。对象技术的关键概念是对象、消息、类,关键机制包括封装、多态和继承

 

1.基本原则:
-------可维护、可复用、可扩展、灵活性好
-------代码要规范
-------从计算机的角度去理解
--属性是类了解的事情而方法是类完成的事情;
--系统应由对象来创建对象拥有数据和功能属性定义数据而方法定义功能;
--抽象的过程就是定义类了解和要完成的事情的过程(数学模型);
--对一个事物进行怎样的抽象将依据你要设计的程序而定
--封装解决如何为系统功能建模的问题,在面向对象的世界中,俺们要把系统建模成类,类也要建模为属性和方法,设计类将如何完成这些事情的过程就被称为封装
----继承:
----在面向对象语言中,接口的多种不同的实现方式即为多态
----多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作

一个是以对象为基本单元,用对像的使用来完成程序功能
而面向结构化则只是写你操作赛车是要进行的动作
所以说结构化就是细化为几个部分,分别完成后,在进行组装
面向对像则是将整个内容分析清楚,封装成一个完整的东西后,你在进行内部细化
面向过程的思维方式是分析综合。面向对象的思维方式是构造。


面向对象也可以说是从宏观方面思考问题,而面向过程可以说是从细节处思考问题。在面向对象中,也存在面向过程。

从微观角度说,对象有着坚硬的外壳,从外部看来,除了它用来与外界交互的消息通道之外,对象内部就是一个黑匣子,什么也看不到,这称为封装;对象可以结合在一起形成新的对象,结合后的对象具有前两者特性的总和,这称为聚合;对象可以繁育,产下的孩子将拥有父辈全部的本领,这称为继承;对象都是多面派,它会根据不同的要求展现其中的一个面,这就是接口;多个对象可能长着相同的脸,而这张脸背后却有着不同的行为,这就是多态……
 实现继承是指使用基类的属性和方法而无需额外编码的能力;
         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
         可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。


--------------------------------------
面向对象程序设计语言 
面向对象技术并不是某个特定语言的特权。如同结构化程序设计一样,OOP概念可以在很多语言比如C和Pascal中实现。但是,当程序越来越大时,程序设计工作会变得拙劣而混乱。而一个支持OOP概念的程序设计语言则可以让一切变得简单。 
一个语言必须支持几个主要的OOP概念才能称其是面向对象的。根据所支持的OOP特性,语言可以分为以下两类: 
1、基于对象的程序设计语言; 
2、面向对象的程序设计语言。 
基于对象的程序设计语言仅支持封装和对象辨识。 
一个面向对象的程序设计语言所要支持的重要特性如下: 
·数据封装 
·数据隐藏和访问机制 
·对象的自动初始化和清除 
·操作符重载 
支持对象风格程序设计的语言称为基于对象的程序设计语言。它们不支持继承和动态绑定。 
Ada就是一个典型的基于对象的程序设计语言。 
面向对象的程序设计不仅仅包含基于对象程序设计的特性,还支持继承和动态绑定。 
OOP的应用 
OOP最有前途的应用领域如下: 
1、实时系统; 
2、仿真和建模; 
3、面相对象数据库; 
4、超文本、超媒体和扩展文本; 
5、AI和专家系统; 
6、神经网络和并行程序设计; 
7、决策支持和办公自动化系统; 
8、CIM/CAM/CAD系统。
面向对象是在面向过程基础上.也就是说面向对象编程实际上是把过程命令放在指定的对象中,对象所完成的动作是由过程命令来决定的.

面向对象考虑的是“能做什么的问题”,“怎么做”不是面向对象所关心的问题。(宏观角度)
例:USB接口问题:
主板只关心,只要有东西接入就能读出属性,至于“怎么做”不是主板所关心的问题


对于对象来说,每个对象所关心的是自己可以“做什么”而不是

面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。

面向对象方法是以认识论为基础,用对象来理解和分析问题空间,并设计和开发出由对象构成的软件系统(解空间)的方法。 由于问题空间和解空间都是由对象组成的,这样可以消除由于问题空间和求解空间结构上的不一致带来的问题。简言之,面向对象就是面向事情本身,面向对象的分析过程就是认识客观世界的过程。
面向对象的思想就是以面而不是以线的角度看问题。

从程序设计的角度来看,面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。

面向对象的方法是面向对象的世界观在开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。

“怎么做”:功能
“做什么”:对象

© 著作权归作者所有

wiitht
粉丝 3
博文 158
码字总数 113941
作品 0
深圳
架构师
私信 提问
【java基本】面向界面变成(AOP)的原理

AOP原理: 动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 场景: 面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承...

卯金刀GG
2018/04/14
0
0
Android中AOP实践之一概念篇

预热 在说AOP之前先来说说java最经典的OOP(面向对象编程),我们通过面向对象的封装思想把同一类事物的共性归为一类中,方便我们统一管理。比如我们会把汽车的轮子,发动机,车身喷漆都放在...

LaxusJ
2017/11/12
0
0
OOP vs 过程式编码

今天早上我被问了一个奇怪的问题:"你那个PasswordLib的范例是OOP模式的,如果我想用过程式编程解决,那该怎么做?"。这个问题让我想了很久,因为这个功能需求自身就是过程化的。所以我觉得要...

王振威
2012/11/26
400
0
Java——面向对象

Java——理解面向对象 一:什么是面向对象编程? 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起...

李可爱34
2016/04/01
45
0
OOP vs 过程式编码

今天早上我被问了一个奇怪的问题:"你那个PasswordLib的范例是OOP模式的,如果我想用过程式编程解决,那该怎么做?"。这个问题让我想了很久,因为这个功能需求自身就是过程化的。所以我觉得要...

junwong
2012/07/20
9.4K
40

没有更多内容

加载失败,请刷新页面

加载更多

Feign输出Info级别日志

背景   spring cloud netfix组件中,feign相关的日志默认是不会输出的,需要自定义配置才能输出,并且Feign只对Debug基本的日志做出响应, 实际业务需要输出Info级别的日志,所以需要做自定...

xiaomin0322
13分钟前
2
0
面向解决问题的java编程,spring boot,mybatis generator和坑-1starter

1、start一个spring boot项目 第一课我们也不能免俗,要从starter开始,spring boot的起始项目脚手架可以从spring boot官方starter生成地址开始:https://start.spring.io/ 这张图列出了一个...

wphmoon
14分钟前
1
0
Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作

Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作 0行云流水00人评论61017人阅读2018-04-11 19:57:20 KVM的安装配置与基本操作 目录 第一部分 实验环境 第二部分 安装图形界面 ...

linjin200
17分钟前
1
0
php获取网站favicon.ico图标 api源码

 通常情况下,做网站的都会给自己的网站添加一个Icon,浏览器上一长排的标签页,用Icon来区分就显得更加醒目。现在想找一个没有Icon的网站并不好找,可见没有Icon的网站是多么的业余啊。"什...

xiaogg
20分钟前
1
0
双亲委派的认识

首先JVM中有三种类加载器 Bootstrap启动类加载器 Extension扩展类加载器(ExtClassLoader) System系统类加载器(AppClassLoader) 某个特定的类接到加载类的请求时候,首先将加载任务委托给...

最胖的瘦子
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部