面向对象个人心得体会_第1页
面向对象个人心得体会_第2页
面向对象个人心得体会_第3页
面向对象个人心得体会_第4页
面向对象个人心得体会_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象个人心得体会篇一:面向对象的编程总结一、 什么是面向对象: 所谓面向对象的编程就是:通过封装,继承,多态,把程序的耦合度降低,传统的雕版印刷术的问题就在于所有刻字都在同一版面上造成耦合度太高所致,当用面向对象的模式,使得印刷程序更加灵活,容易修改,并且易于复用。 对象(Object)是类(Class)的一个实例(Instance) 。如果将对象比作房子,那么类就是房子的设计图纸。所以面向对象程序设计的重点是类的设计,而不是对象的设计。类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务) 。类提供关键字public、protected 和 private 用于声明哪些数据和函数是公有的、受保护的或者是私有的。 二:基类 类与结构体的区别和联系; Strcut test Private:Int number; Public:Float socre; ; 类的创建方式和结构体几乎一样, Class test Private:Int number; Public:Float socre; Public:Public:Int rp(); Return number; Void setnum(int a) Number=a; ; 但是大家注意到没有,标准 c 中不允许在结构体中声明函数的,但是在 c+中的类中是可以的,这就和 c 有了本质的区别,很好体现了 c+面向对象的特点。 两种语言的区别: 过去的 c 语言是一种面向过程的语言 特性是: 程序=算法+数据结构 但 c+的特性是:对象=算法+数据结构; 程序=对象+对象+对象。 。 。 。 。 区别: 在 c 语言中个成员他们的默认存储控制是 public 而c+类中默认的存储控制是 private.; 上面的 rp()事成员函数,如果我们有如下定义: Test a; 的话,调用 rp()就可以写成: a rp() ; 成员函数的调用和普通成员的调用方式一致都采用“.”的操作符。 例如: class test private:/私有成员类外不能够直接访问 int number; public:/共有成员类外可以直接访问 float socre; public: int rp() return number; void setnum(int a) number=a; ; void main() test a; /=10;/错误的,私有成员不能外部访问 =; cout /通过共有成员函数setnum()间接对私有成员 number 函数进行访问 cout /*int pp=0; class test private: int number; public: float socre; int pp; public: void rp(); ; void test:rp() :pp=11; pp=100; void main() test a; test b; (); cout 利用域区分符我们可以在类定义的外部设置成员函数,但要注意的是,在类的内部必须预声明: 类型 类名 : 函数名()=值 void test:rp() 在函数类型的后面加上类的名称再加上域区分符(:)再加函数名称,利用这样的方法我们就在类的外部建立了一个名为 rp 的 test 类大成员函数(方法),可能很多人要问,这么做有意义吗?在类的 内部写函数代码不是更好? 答案是这样的:在类的定义中,一般成员函数的规模一般都比较小,而且一些特殊的语句是不能够使用的,而且一般会被自动的设置成为 inline(内联)函数,即使你没有明确的声明为 inline,那么为什么有会被自动设置成为inline 呢?因为大多数情况下,类的定义一般是放在头文件中的,在编译的时候这些函数的定义也随之进入头文件,这样就会导致被多次编译,如果是 inline 的情况,函数定义在调用处扩展,就避免了重复编译的问题,而且把大量的成员函数都放在类中使用起来也十分不方便,为了避免这种情况的发生,所以 c+是允许在外部定义类的成员函数(方法)的,将类定义和其它成员函数定义分开,是面向对象编程的通常做法,我们把类的定义在这里也就是头文件了看作是类的外部接口,类的成员函数的定义看成是类的内部实现。写程序的时候只需要外部接口也就是头文件即可,这一特点和我们使用标准库函数的道理是一致的,因为在类的定义中,已经包含了成员函数(方法)的 声明。 问题二 域区分符和外部全局变量和类成员变量之间的关系。 在上面的代码中我们看到了,外部全局和类内部都有一个叫做 pp 的整形变量,那么我们要区分操 作他们用什么方法呢? 使用域区分符就可以做到这一点,在上面的代码中:pp=11;操作的就是外部的同名称全局变量, pp=100;操作的就是类内部的成员变量,这一点十分重要! 问题三 一个类的所有对象调用的都是同一段代码,那么操作成员变量的时候计算机有是如何知道哪个成 员是属于哪个对象的呢? 这里牵扯到一个隐藏的 this 指针的问题,上面的代码在调用()的的时候,系统自动传递一 了个 a 对象的指针给函数,在内部的时候 pp=100;的时候其实就是 this-pp=100; 所以你把上面的成员函数写成如下形势也是正确的: void test:rp() :pp=11; this-pp=100;/this 指针就是指向 a 对象的指针 1. this 指针的用处: 一个对象的 this 指针并不是对象本身的一部分,不会影响 sizeof(对象)的结果。this 作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上 this 指针,编译器在编译的时候也是加上 this 的,它作为非静态成员函数的隐含形参,对各成员的访问均通过 this 进行。 例如,调用(9) SetMonth(public: Point(int a, int b) x=a; y=b; void MovePoint( int a, int b) x+=a; y+=b; void print() cout void main( ) Point point1( 10,10); (2,2); ( ); 当对象 point1 调用 MovePoint(2,2)函数时,即将point1 对象的地址传递给了 this 指针。 MovePoint 函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该 类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样 point1 的地址传递给了 this,所以在 MovePoint 函数中便显式的写成: void MovePoint(int a, int b) this-x +=a; this- y+= b; 即可以知道,point1 调用该函数后,也就是 point1的数据成员被调用并更新了值。 即该函数过程可写成 += a; point1. y + = b; 4. 关于 this 指针的一个经典回答:当你进入一个房子后, 你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。 对于一个类的实例来说, 你可以看到它的成员函数、成员变量, 但是实例本身呢? this 是一个指针,它时时刻刻指向你这个实例本身 二、派生类: 如果 A 是基类,B 是 A 的派生类,那么 B 将继承 A 的数据和函数。示例程序如下: class A public: void Func1(void); void Func2(void); ; class B : public A public: 篇二:对面向对象设计原则的总结对面向对象设计原则的总结 正如牛顿三大定律在经典力学中的位置一样,开-闭原则(Open-Closed Principle)是面向对象的可复用设计(Object Oriented Design 或 OOD)的基石。其他设计原则(里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则)是实现开-闭原则的手段和工具。 一、开-闭原则(Open-Closed Principle,OCP) 开-闭原则的定义及优点 1)定义:一个软件实体应当对扩展开放,对修改关闭( Software entities should be open for extension,but closed for modification.)。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。 2)满足开-闭原则的系统的优点 a)通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。 b)已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。 c)这样的系统同时满足了可复用性与可维护性。 正如牛顿三大定律在经典力学中的位置一样,开-闭原则(Open-Closed Principle)是面向对象的可复用设计(Object Oriented Design 或 OOD)的基石。其他设计原则(里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则)是实现开-闭原则的手段和工具。 一、 “开-闭”原则(Open-Closed Principle,OCP) “开-闭”原则的定义及优点 1)定义:一个软件实体应当对扩展开放,对修改关闭( Software entities should be open for extension,but closed for modification.)。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。 2)满足开-闭原则的系统的优点 a)通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。 b)已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。 c)这样的系统同时满足了可复用性与可维护性。 如何实现“开-闭”原则 在面向对象设计中,不允许更改的是系统的抽象层,而允许扩展的是系统的实现层。换言之,定义一 个一劳永逸的抽象设计层,允许尽可能多的行为在实现层被实现。解决问题关键在于抽象化,抽象化是面向对象设计的第一个核心本质。 对一个事物抽象化,实质上是在概括归纳总结它的本质。抽象让我们抓住最最重要的东西,从更高一层去思考。这降低了思考的复杂度,我们不用同时考虑那么多的东西。换言之,我们封装了事物的本质,看不到任何细节。 在面向对象编程中,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需更改,从而满足对修改关闭;而从抽象类导出的具体类可以改变系统的行为,从而满足对扩展开放。 对实体进行扩展时,不必改动软件的源代码或者二进制代码。关键在于抽象。 对可变性的封装原则 开-闭原则也就是对可变性的封装原则(Principle of Encapsulation of Variation ,EVP) 。即找到一个系统的可变因素,将之封装起来。换言之,在你的设计中什么可能会发生变化,应使之成为抽象层而封装,而不是什么会导致设计改变才封装。 对可变性的封装原则意味着: a)一种可变性不应当散落在代码的许多角落,而应当被封装到一个对象里面。同一可变性的不同表象意味着同一个继承等级结构中的具体子类。因此,此处可以期待继承关系的出现。继承是封装变化的方法,而不仅仅是从一般的对象生成特殊的对象。 b)一种可变性不应当与另一种可变性混合在一起。作者认为类图的继承结构如果超过两层,很可能意味着两种不同的可变性混合在了一起。 使用可变性封装原则来进行设计可以使系统遵守开-闭原则。 即使无法百分之百的做到开-闭原则,但朝这个方向努力,可以显著改善一个系统的结构。 二、里氏代换原则(Liskov Substitution Principle, LSP) 概念 定义:如果对每一个类型为 T1 的对象 O1,都有类型为 T2 的对象 O2,使得以 T1 定义的所有程序 P 在所有的对象 O1 都代换为 O2 时,程序 P 的行为没有变化,那么类型T2 是类型 T1 的子类型。 即,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类。而且它觉察不出基类对象和子类对象的区别。也就是说,在软件里面,把基类都替换成它的子类,程序的行为没有变化。 反过来的代换不成立,如果一个软件实体使用的是一个子类的话,那么它不一定适用于基类。 任何基类可以出现的地方,子类一定可以出现。基于契约的设计、抽象出公共部分作为抽象基类的设计。 里氏代换原则与“开-闭”原则的关系 实现开-闭原则的关键步骤是抽象化。基类与子类之间的继承关系就是抽象化的体现。因此里氏代换原则是对实现抽象化的具体步骤的规范。 违反里氏代换原则意味着违反了开-闭原则,反之未必。 三、依赖倒转原则(dependence inversion principle, DIP) 概念 依赖倒转原则就是要依赖于抽象,不要依赖于实现。(Abstractions should not depend upon details. Details should depend upon abstractions.)要针对接口编程,不要针对实现编程。 (Program to an interface, not an implementation.) 也就是说应当使用接口和抽象类进行变量类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。而不要用具体类进行变量的类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。要保证做到这一点,一个具体类应当只实现接口和抽象类中声明过的方法,而不要给出多余的方法。 传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块,抽象层次依赖于具体层次。倒转原则就是把这个错误的依赖关系倒转过来。 面向对象设计的重要原则是创建抽象化,并且从抽象化导出具体化,具体化给出不同的实现。继承关系就是一种从抽象化到具体化的导出。 抽象层包含的应该是应用系统的商务逻辑和宏观的、对整个系统来说重要的战略性决定,是必然性的体现。具体层次含有的是一些次要的与实现有关的算法和逻辑,以及战术性的决定,带有相当大的偶然性选择。具体层次的代码是经常变动的,不能避免出现错误。 从复用的角度来说,高层次的模块是应当复用的,而且是复用的重点,因为它含有一个应用系统最重要的宏观商务逻辑,是较为稳定的。而在传统的过程性设计中,复用则侧重于具体层次模块的复用。 依赖倒转原则则是对传统的过程性设计方法的倒转,是高层次模块复用及其可维护性的有效规范。 特例:对象的创建过程是违背开闭原则以及依赖倒转原则的,但通过工厂模式,能很好地解决对象创建过程中的依赖倒转问题。 关系 开-闭原则与依赖倒转原则是目标和手段的关系。如果说开闭原则是目标,依赖倒转原则是到达“开闭“原则的手段。如果要达到最好的“开闭“原则,就要尽量的遵守依赖倒转原则,依赖倒转原则是对“抽象化“ 的最好规范。里氏代换原则是依赖倒转原则的基础,依赖倒转原则是里氏代换原则的重要补充。 耦合(或者依赖)关系的种类: 零耦合(Nil Coupling)关系:两个类没有耦合关系 具体耦合(Concrete Coupling)关系:发生在两个具体的(可实例化的)类之间,经由一个类对另一个具体类的直接引用造成。 抽象耦合(Abstract Coupling)关系:发生在一个具体类和一个抽象类(或接口)之间,使两个必须发生关系的类之间存有最大的灵活性。 如何把握耦合 我们应该尽可能的避免实现继承,原因如下: 1 失去灵活性,使用具体类会给底层的修改带来麻烦。2 耦合问题,耦合是指两个实体相互依赖于对方的一个量度。程序员每天都在(有意识地或者无意识地)做出影响耦合的决定:类耦合、API 耦合、应用程序耦合等等。在一个用扩展的继承实现系统中,派生类是非常紧密的与基类耦合,而且这种紧密的连接可能是被不期望的。如 B extends A ,当 B 不全用 A 中的所有 methods 时,这时候,B 调用的方法可能会产生错误! 我们必须客观的评价耦合度,系统之间不可能总是松耦合的,那样肯定什么也做不了。 我们决定耦合的程度的依据何在呢? 简单的说,就是根据需求的稳定性,来决定耦合的程度。对于稳定性高的需求,不容易发生变化的需求,我们完全可以把各类设计成紧耦合的(我们虽然讨论类之间的耦合度,但其实功能块、模块、包之间的耦合度也是一样的),因为这样可以提高效率,而且我们还可以使用一些更好的技术来提高效率或简化代码,例如 c# 中的内部类技术。可是,如果需求极有可能变化,我们就需要充分的考虑类之间的耦合问题,我们可以想出各种各样的办法来降低耦合程度,但是归纳起来,不外乎增加抽象的层次来隔离不同的类,这个抽象层次可以是抽象的类、具体的类,也可以是接口,或是一组的类。我们可以用一句话来概括降低耦合度的思想:“针对接口编程,而不是针对实现编程。 在我们进行编码的时候,都会留下我们的指纹,如public 的多少,代码的格式等等。我们可以耦合度量评估重新构建代码的风险。因为重新构建实际上是维护编码的一种形式,维护中遇到的那些麻烦事在重新构建时同样会遇到。我们知道在重新构建之后,最常见的随机 bug 大部分都是不当耦合造成的 。 如果不稳定因素越大,它的耦合度也就越大。 某类的不稳定因素=依赖的类个数/被依赖的类个数 依赖的类个数 在编译此类的时被编译的其它类的个数总和 怎样将大系统拆分成小系统解决这个问题的一个思路是将许多类集合成一个更高层次的单位,形成一个高内聚、低耦合的类的集合,这是我们设计过程中应该着重考虑的问题! 耦合的目标是维护依赖的单向性,有时我们也会需要使用坏的耦合。在这种情况下,应当小心记录下原因,以帮助日后该代码的用户了解使用耦合真正的原因。 怎样做到依赖倒转? 以抽象方式耦合是依赖倒转原则的关键。抽象耦合关系总要涉及具体类从抽象类继承,并且需要保证在任何引用到基类的地方都可以改换成其子类,因此,里氏代换原则是依赖倒转原则的基础。 在抽象层次上的耦合虽然有灵活性,但也带来了额外的复杂性,如果一个具体类发生变化的可能性非常小,那么抽象耦合能发挥的好处便十分有限,这时可以用具体耦合反而会更好。 层次化:所有结构良好的面向对象构架都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供一组内聚的服务。 依赖于抽象:建议不依赖于具体类,即程序中所有的依赖关系都应该终止于抽象类或者接口。尽量做到: 1、任何变量都不应该持有一个指向具体类的指针或者引用。 2、任何类都不应该从具体类派生。 3、任何方法都不应该覆写它的任何基类中的已经实现的方法。 依赖倒转原则的优缺点 依赖倒转原则虽然很强大,但却最不容易实现。因为依赖倒转的缘故,对象的创建很可能要使用对象工厂,以避免对具体类的直接引用,此原则的使用可能还会导致产生大量的类,对不熟悉面向对象技术的工程师来说,维护这样的系统需要较好地理解面向对象设计。 依赖倒转原则假定所有的具体类都是会变化的,这也不总是正确。有一些具体类可能是相当稳定,不会变化的,使用这个具体类实例的应用完全可以依赖于这个具体类型,而不必为此创建一个抽象类型。 四、合成/聚合复用原则(Composite/Aggregate Reuse Principle 或 CARP) 概念 定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。 应首先使用合成/聚合,合成/聚合则使系统灵活,其次才考虑继承,达到复用的目的。而使用继承时,要严格遵循里氏代换原则。有效地使用继承会有助于对问题的理解,降低复杂度,而滥用继承会增加系统 篇三:java 面向对象的学习心得Java 面向对象的学习心得 大三的时候学校组织我们去苏州 NIIT 参加四个月的java 实训,我开始系统的学习期 java,之前大学的时候学的比较宽泛,没有专门的正对 java 的学习。 首先我是从学习 Java 编程开始接触 OOP(面向对象编程),刚开始使用 Java 编写程序的时候感觉很别扭,因为我早以习惯用 C 来编写程序,很欣赏 C 的简洁性和高效性,喜欢 C 简练而表达能力丰富的风格,特别忍受不了 Java 运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。 我对 Java 的面向对象的特性琢磨良久,自认为有所领悟,也开始有意识的运用 OOP 风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。 举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用 C 来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail 的 sendmail 命令发送。 然后考虑用 Java 来实现,既然是 OOP,就不能什么代码都塞到 main 过程里面,于是就设计了三个类: 一个类是负责读取数据库,取邮件地址,调用 qmail的 sendmail 命令发送; 一个类是读邮件内容,MIME 编码成 HTML 格式的,再加上邮件头; 一个主类负责从命令读参数,处理命令行参数,调用发 email 的类。 把一件工作按照功能划分为 3 个模块分别处理,每个类完成一件模块任务。 仔细的分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。 这样的分析方法其实是不适用于 Java 这样面向对象的编程语言,因为,如果改用 C 语言,封装两个 C 函数,都会比 Java 实现起来轻松的多,逻辑上也清楚的多。 我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。 举一个非常简单的例子:假使现在需要写一个网页计数器,客户访问一次页面,网页计数器加 1,计数器是这样来访问的 后台有一个数据库表,保存每个 id(一个 id 对应一个被统计访问次数的页面)的计数器当前值,请求页面一次,对应 id 的计数器的字段加 1(这里我们忽略并发更新数据库 表,出现的表锁定的问题)。如果按照一般从程序实现的角度来分析,我们会这样考虑:首先是从 HTTP GET 请求取到 id,然后按照 id 查数据库表,获得某 id 对应的访问计数值,然后加 1,更新数据库,最后向页面显示访问计数。 现在假设一个没有程序设计经验的人,他会怎样来思考这个问题的呢?他会提出什么样的需求呢?他很可能会这样想: 我需要有一个计数器,这个计数器应该有这样的功能,刷新一次页面,访问量就会加 1,另外最好还有一个计数器清 0 的功能,当然计数器如果有一个可以设为任意值的功能的话,我就可以作弊了。 做为一个没有程序设计经验的人来说,他完全不会想到对数据库应该如何操作,对于 HTTP 变量该如何传递,他考虑问题的角度就是我有什么需求,我的业务逻辑是什么,软件应该有什么功能。 按照这样的思路(请注意,他的思路其实就是我们平时在生活中习惯的思维方式),我们知道需要有一个计数器类 Counter,有一个必须的和两个可选的方法: getCount() / 取计数器值方法 resetCounte(转 载于: 小 龙 文档网:面向对象个人心得体会)r() / 计数器清 0 方法 setCount() / 设计数器为相应的值方法 把 Counter 类完整的定义如下: public class Counter public int getCount(int id) public void resetCounter(int id) public void setCount(int id, int currentCount) 解决问题的框架已经有了,来看一下如何使用Counter。 在里面调用 Counter 来计数,程序片断如下: / 这里从 HTTP 环境里面取 id 值 . Counter myCounter = new Counter(); / 获得计数器 int currentCount = (id); / 从计数器中取计数 / 这里向客户浏览器输出 . 程序的框架全都写好了,剩下的就是实现 Counter类方法里面具体的代码了,此时才去考虑具体的程序语言实现的细节,比如,在 getCount()方法里面访问数据库,更新计数 值。从上面的例子中看到,面向对象的思维方法其实就是我们在现实生活中习惯的思维方式,是从人类考虑问题的角度出发,把人类解决问题的思维方式逐步翻译成程序能够理解的思维方式的过程,在这个翻译的过程中,软件也就逐步被设计好了。 在运用面向对象的思维方法进行软件设计的过程中,最容易犯的错误就是开始分析的时候,就想到了程序代码实现的细节,因此封装的类完全是基于程序实现逻辑,而不是基于解决问题的业务逻辑。 学习 JDBC 编程的经典错误问法是:“我怎样封装对数据库的 select 操作?” 面向对象的设计是基于解决业务问题的设计,而不是基于具体编程技术的设计。我不会去封装 select 语句的,我只封装解决问题的业务逻辑,对数据库的读取是在业务逻辑的编码实现阶段才去考虑的问题。 回过头看上面那个发广告邮件的例子,应该如何应用面向对象的思维方法呢? 对于一个邮件来说,有邮件头,邮件体,和邮件地址这三个属性,发送邮件,需要一个发送的方法,另外还需要一个能把所有邮件地址列出来的方法。所以应该如下设计: 类 JunkMail 属性: head body address 方法: sendMail() / 发送邮件 listAllMail() / 列邮件地址 用 Java 来表示: public class JunkMail private String head; private String body; private String address; public JunkMain() / 默认的类构造器 / 从外部配置文件读邮件头和邮件体 =.; =.; public static boolean sendMail(String address) / 调用 qmail,发送 email public static Collection listAllMail() / 访问数据库,返回一个邮件地址集合 当把 JunkMail 设计好了以后,再调用 JunkMail 类完成邮件的发送,将是非常轻松的事情。 如果说传统的面向过程的编程是符合机器运行指令的流程的话,那么面向对象的思维方法就是符合现实生活中人类解决问题的思维过程。 在面向对象的软件分析和设计的时候,要提醒自己,不要一上来就去想程序代码的实现,应该抛开具体编程语言的束缚,集中精力分析我们要实现的软件的业务逻辑,分析软件的业务流程,思考应该如何去描述和实现软件的业务。毕竟软件只是一个载体,业务才是我们真正要实现的目标。 但是在设计过程中,心里却往往在担心,如果我完全不去考虑程序代码的实现的话,那么我怎么知道我的设计一定合理呢?我怎么知道我设计的类、接口一定可以实现呢?所以经常可以看到的现象就是: 在设计过程中,虽然知道不能过早考虑代码实现,但是每设计一个类,一个接口,心里都要不知不觉的用自己熟悉的编程语言大概的评估一下,看看能否编出来,因此,一不小心,就会又回到按照程序功能实现的思路进行设计的老路上去了。 举个例子来说明,在做 Web 程序设计的时候,经常要遇到分页显示数据的情况。比如说需要把系统中所有的用户都列出来这样的功能。假设使用 User 类来表示用户,增加用户 addUser(),删除用户 deleteUser(),查询所有用户 listU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论