我认为面向对象编程的意思是以对象为基本单位进行编程,但是我觉得编写代码不是面向对象的根本,即使面向对象编程的特点也只是为了寻求一种编码方式,虽然这个编码方式达到了一些目的但是我觉得也只是面向对象的一些附属优势,而在具体就到了实现过程上,就成为了一种过程。所以面向对象是不能仅从一个方向去看待,而要从多方面去看:简单的是一种编程方式,复杂一些是一种设计,更上的则是一种思想理念。这些环节虽然都是面向对象但是对面向对象的使用可是天差地别。
1.面向对象的重点是分析和设计
我觉得面向对象的思想并不意味着就是面向类的实例编程同时也不光是实现那几个特点,而关键在于人们要进行研究的任何事物,所以我认为面向对象的重心应该在于怎么看待一个问题,然后去分析和设计,而不是去实现某一个功能,单纯的从编码角度去看待对象与对象之间的联系是片面的,因为对象之间联系的根本在于类之间的关系,基本的类之间的联系或者成为消息传递的对象,这些联系都依赖于最初的分析和设计(即什么成为类和类之间的关系),而不是后期的排布,所以面向对象思想的根本是为了分析设计。
2.面向对象的分析设计的需求是什么
面向的对象的根本是什么,我觉得是它要解决一个什么样的问题,这是一个关键。为什么出现面向对象,最后为什么面向对象的使用率逐渐增高,这是因为出现任何产品的递增都是因为出现了需求,那面向对象的需求是什么,是因为发现在预期时间内高质量的程序越来越难(我认为是因为随着应用面越广导致问题的复杂化和扩展性加强,导致之前的结构不在适用,使得每次开发都需要重头开始去分析设计一个需要耗费大量时间),为了让解决问题的方法更加的通用,所以我觉得面向对象的编码格式只是为了使代码的划分贴近于最开始的构思和之后的设计,所以分析设计的理念是尽量减少下一次的工作量同时出产高质量的程序。
所以面向对象是为了下一次更易于开发而出现的,所以编程语言更加对底层进行封装以减少考虑底层部分的问题并且减少工作量,使人尽量去以看待问题而不是关注于计算机底层运行的角度去分析问题,之后就是根据分析出的结果来进行设计,这时一个好的设计才能为之后的编码打下基础,只有好的设计才能体现出面向对象的优势,根据问题来设计在遇到下一个类似问题时可重用代码。这些优势就是良好的设计所带来的易维护,质量高,效率高,易扩展,可复用等,而这些就是根据设计和面向对象的特点体现出来的,根据类之间的关系是每一个部分都是可以拆分的独立个体,所以是类之间的关系尽量简单,使各类的功能更加精简。
抽象这是一个常见的词,在各种书里都很常见,在有的书里抽象作为面向对象的特点,而另一些则没有提到。我觉得首先面向对象本身就是抽象的,在进行分析的时候抽象的角度取决于所针对问题的目的,首先抽象的目的是为了建立类也就是说在进行第一步分析(首先分析了问题领域确定了客观事物即自然对象,之后根据问题进行分析找到问题方向就是要提供什么服务)后,针对这个服务进行抽象不是单纯的寻找共同点而是有目的向共性靠拢,这种抽象是为了设计铺路,抽象的越核心,越稳定,在这个系统里就越基础就像一个基石一样任何功能的扩展都在这上面完成,所以分析问题就是拆解问题得到不同大小的问题来确定抽象的层级,每次抽象都是一次封装,针对抽象出的类进行设计成符合服务要求的形式,我觉得抽象是一个系统中最基础的部分,它决定了设计的好坏,抽象的层次越高越通用而过高则没实际价值,在较高层次的抽象关系可以反映底层次的关系,这就是为什么上层类可以反应下层对象之间的关系原因。
一个系统因为基类可以明确主体,也因为基类才能去扩展。
3.如何进行符合要求的分析设计
首先,面向对象的思想就是看待问题的观点,即对一个问题的客观表示,而不是去对它进行实现。应该找到问题里的客观存在,而不是主观上的逻辑执行。对问题进行需求分析,将每个客体的需求关系理清,建立一个模型,这个模型里有客观存在的对象,然后针对它们去建立类,找到共同点去抽象成为父类。不能单独的看待一个问题,应该尽量以一个全局的视角去分析,比如什么还能用到这个问题,这个问题会引发什么样的新问题,在分析之初要考虑的很多,把问题要想广不能只局限于实现。
如何完成一个好的面向对象,首先是将自己的思维贴近一个分析的角度,这是一个关键的改变,不是从步骤解决问题而是去看问题中有哪些客观存在的点,就像解一道数学题先去分析已知什么未知什么而不是直接去想怎么求解(这是我的感觉没有找到比较合适的语句来描述,所以尽量意会),所以使用面向对象是为了不局限于计算机指令而去单独的思考问题,理清到底这个问题都包含了什么。问题是由人去解决的,而程序是由计算机解决的,人只看待问题而不去兼顾实现这时的结果才是人为处理问题的最优解,所以面向对象的编码过程就是起到从人的思维到计算机执行的一个过渡过程。如何能够将自己的代码组合成设计的理念则是第二步。
应该使用设计模式,这些设计模式是比较常用的面向对象的一种模型,同时尽量符合面型对象的原则
为什么使用设计模式,设计模式是从众多设计情况中抽象出的模型,是一种具备面向对象设计理念和设计优势的总结,这些总结因为不同的情况产生不同的情况种类,这些模式就像公式一样,使人们能够在更容易的达到设计的目的,完成开始的设计要求,这些模式在设计的过程中可以巧妙的填补结构上的缺口,使结构更加合理
就像设计成的框架就是设计好的可以复用的一组相互协作的类,成熟的设计都依靠各种结构之间的关系组合成为一个整体,而设计模式就是为了这个整体服务的,是为了快速设计而总结的理解。
设计模式的关键不是在于如何去补完其中的细节,而是意识到使用这些模式时重复出现的问题,如果不能很好的分析设计就不能正确的意识到问题
之前我认为面向对象是为了将人的思维从计算机上分离单独的思考问题,而现在我觉得应该思考的是一个事件,而每一个事件里都包含了诸多的问题(只是为了表明层次感,我觉得事件比问题的层次高一些),这些问题才是需要设计,要达到设计的目的,这些问题需要独立化,降低问题之间的耦合性,从而满足原则,这些问题才是应该抽象的,问题的核心不会变,要完成这一点就应该让问题依赖于抽象而不是实现,因为为了之后的需求变化将类中经常变化的部分从类中分离出去,这样设计是为了复用,抽象不拘泥于实现为的是之后改变,不必在意之后的实现避免所设计的类过于依赖(为了之后的实现)具体的实现,改变了设计的初衷,是为了更好的下一次开发去设计。
这些原则都是为了达到设计目标而出现的规则,比如位了代码复用,增加可维护性等等。
单一功能原则、开闭原则、里氏替换原则、依赖倒转原则、迪米特原则、接口隔离原则、聚合/组合复用原则
(1)单一职责原则:一个类只应该做和一个职责相关的事情,不要把过多的业务放在一个类中完成。
(2)迪米特法则:软件实体之间应该做到最少的交互。不要和陌生人说话。调用方只关心他需要使用的方法
(3)接口隔离原则:使用专门的接口,比用统一的接口要好。便于分工,在实现接口时,不应该看到自己不用关心的方法。
(4)开闭原则:软件实体应该对扩展开放,对修改关闭。开闭原则是设计原则的核心原则,其他的设计原则都是开闭原则表现和补充。实现开闭原则的方法就是抽象。
(5)聚合/组合复用原则。多使用聚合/组合达到代码的重用,少使用继承复用。
(6)依赖倒置原则:面向抽象编程,不要面向具体编程。
设计模式
(1)简单工厂模式
(2)策略模式
(3)开放-封闭原则模式
(4)单一职责模式
(5)依赖倒转模式
(6)装饰模式
(7)代理模式
(8)工厂方法模式
(9)原形模式
等等。。。。
这些都是如何更好的完成一个类或几个类之间的功能的模版
因为这些都是总结下来,可以达到设计目的的方法,都是针对面向对象的优势来进行的编码
所以不先去管实例化的对象和去设计类才是关键
从编程方式上来看如果只是简单的完成功能,对一个类的数据和针对数据的操作进行封装然后调用其中的方法,这只能叫做基于对象编程,就像编写或使用一个函数一样的使用一个类里的方法,要是在强一些使用好了继承、多态这些才算是面向对象的第一步,但是仅仅做到这样还是不够的,因为仅仅完成类内的部分,就算是代码写的漂亮也仅仅完成了逻辑上的过程依然是执行了一些步骤,即使编写的代码很好但是也只是完成了一个功能,我觉得这也并不符合面相对象的根本理念,这只是完成了面向对象编程,通过已经划分好的类去实现里面的功能。