zoukankan      html  css  js  c++  java
  • 什么是面向对象?

    什么是面向对象?

     。(面向过程在分析的时候,会主要关注先怎么样后怎么样,OO则有哪些对象参与,各对象有啥特性,能干啥,他们之间发生了什么)
    在设计的时候应尽可能考虑到变化,所以有时要用到抽象(类是具体业务对象的抽象,抽象类是类的抽象,接口是方法的抽象),开闭原则(修改的时候对新增开放,对修改关闭)。设计模式就是围绕着封装变化而讲的。
    面向对象的对象(类)是和现实业务中的对象对应的,所以从理论上说可以描述现实生活中的一切活动和流程。

    面向对象的思维方式:
      面向对象是围绕对象和类来分析、设计软件系统的。
    面向对象分析:
      面向对象分析的主要任务是根基用户的需求,建立一个准确的、完整的、一致的系统模型。在面向对象的分析过程里,项目
    组通过分析软件的功能性需求,得到一个理想化的系统模型,该模型更多的侧重于描述我们需求解决的问题是什么---我们称这种模型为分析模型。
    面向对象分析与面向对象设计的区别:
    1、在侧重点上,面向对象分析侧重于理解问题,描述软件做什么,而面向对象设计侧重于理解解决方案,描述软件如何做。
    2、面向对象分析一般只考虑理想的设计,不关心技术和实现的细节,而面向对象设计更具体、更详细、更接近真实的代码的设计方案。
    3、在设计结果的描述方式上,分析阶段侧重描述对象的行为,设计阶段侧重于描述对象的属性和方法。
    4、面向对象分析只关注功能性需求,而面向对象设计既关注功能性需求,也关注非功能性需求。
    5、面向对象分析的产生的系统模型通常规模较小,而面向对象的设计产生的系统模型规模较大,内容也比较完整、详尽。
    用例驱动的面向对象分析:
    面向对象分析的过程包括:
    1、从用例中提取实体对象和实体类。
      提取实体对象的方法,依据用例描述中出现的名词和名词短语来提取实体对象,必须对原始的名词和名词短语进行筛选。
    得到实体对象后,对实体对象进行归纳、抽象出实体类。
    2、提取属性
    3、提取关系
    4、添加边界类
    5、添加控制类
    6、绘制类图
    7、绘制顺序图
    8、编制术语表


    上面这个说明基本表明了一个做对象的人都在干嘛!看的出来,做对象的人首先干的事情不是编码,而是设计一个模型和规范。而上面说的两种人的区别只是颗粒度的问题,做分析的颗粒度大些,做设计的颗粒小些。

    继承的场合
    若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的功能。如男人(Man)是人(Human)的一种,男孩(Boy)是男人的一种。那么类Man 可以从类Human 派生,类Boy 可以从类Man 派生。
    用代码表现出来就是:
    class A{}
    class B:A{}

    组合的场合
    若在逻辑上A 是B 的“一部分”(a part of),则不允许B 继承A 的功能,而是要用A和其它东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head 应该由类Eye、Nose、Mouth、Ear 组合而成,不是派生而成。
    用代码表现出来就是:
    class A{}
    class C{}
    Class B
    {
        A a;
        C c;
    }
    上面的代码的意思就是:对象A和C只是对象B的一部分,因此在B中声明A和C(术语叫引用,关系就是组合或聚合),
    如果B要执行A的功能,就去调用A的方法即可,这如同人的身体由头、手、躯体和脚组成,如果要身体实现
    “走”的方法,就让身体调用“腿”这个对象的“走”的方法即可。

    我总结了几个概念
    1、将性质相同的对象进行抽象,这个抽象的过程就是类的设计;
    2、对象B是对象A的特定一种,那么我们可以设计B继承于A;
    3、对象A有部件B、C等,那么我们设计时可以将B、C组合形成A;
    4、多个对象具有相同的方法、属性定义,但具体的执行情况不同,这样我们称之为对象的多态;

    类设计的求同存异
    求同:就是将性质相同的对象进行抽象,这个抽象的过程就是类的设计,结果就是类的定义
    存异:某类对象A中的某些成员B具有与其它成员不同的性质,我们可以将这类成员B的特有性质再进行抽象


    核心就是面向抽象编程:
    InterFace IProduct
    {
      void DoSomething();
    }

    Class ProductA:IProduct
    {
       public void DoSomething()
       {
          //代码
       }
    }
    Class ProductB:IProduct
    {
       public void DoSomething()
       {
          //代码
       }
    }

    IProduct A = new ProductA();
    //不要用 ProductA A=new ProductA();

    IProduct B= new ProductB();
    //不要用 ProductB B=new ProductB();




    private void DoSomething(IProduct product)   //如果不是面向抽象,每种产品就要单独写这样一个方法了
    {                                            //而且以后还可以增加ProductC....,这个方法是不需要改的。
        product.DoSomething();
    }
    抽象是固定的、不变的。我们程序中将来可能会发生改变的部分应面向接口编程,而不是面向具体的多变的对象,这样,当对象发生改变后原有程序的架构可以保持不变。


    类:就是哲学的物质
    对象:就是物质的具体形式
    抽象:就是抽出像的部分!
    所谓抽象,就是把像的东西抽出来,那剩下的自然就是不像的了。。

    面向接口编程是面向对象的精髓。多态,继承,封装,都用,并不表示就是面向对象。

    1.抽象的难度要降低,符合人类的自然思维相对于面向计算机的角度更为自然,简单。
    2.隔离变化,封装和多态目的就是隔离变化,把易变的和不变的分开,简化需求不断变化的应付成本。


    OO就是封装、继承、多态。
    9.学习设计模式有利于理解OO。
    10.OO是目的是“封装变化”和“重用”。
    11.OO的设计思路是要把“变化”留出来。
    12.如果需求改得乱七八糟而导致无法维护就等于设计失败。
    13.学习面向对象最主要的就是要多多实践,只有在项目中才能体会到底什么才是面向对象。

    一个概念
    一切皆为对象

    面向对象就是先定义数据结构,在写算法,
    面向过程就是先写算法,在定义数据结构.


    很多人说的都是OOP的思想,也就是面向对像的编程,也是学校里学的比较多的,出来了多做苦工,
    而面向对像大体分为三层,而且在社会上也会因你撑握的层次决定了你的价值,

    像多态,继承等,其实都是比较浅的,当然是相对于面向对像这个知识体系的.

    面向对像大体分为OOP,OOA,OOD分就是面向对像编程,面向对像分析,面向对像设计
    而后面二个才是面向对像的精髓,像架构师级别的人就一般做的后面二种工作

    《UML应用建模实践过程》不错,详细描述了面向对象分析、设计过程的全过程。<面向对象分析与设计>

    OO的重要表现形式是封装、继承、多态,但是有封装、继承、多态并不一定是OO

    先理解以下 接口 和 抽象类,面向对象最主要就是代码重用和低耦合。如果做到低耦合,那么就更容易维护了。


    一位高手的回答:
    个人认为,楼主搞不清楚的地方是:为什么我用"对象.方法()"来写程序仍然被人指为面向过程式的编程.大家说了一大气,都没有讲清楚讲具体,所以就算楼主把回帖全看了,也还是没办法理解.

    在下在这里简单又粗糙地向楼主解说一下,如果有错,也请大家指正:
    如果在你写的主程序的主要执行代码里是以下这种情况:
    ...
    对象1.方法1();[这里调用如此多的方法是为了得到返回值后,让其他计算步骤再利用]
    对象2.方法1();
    对象1.方法2();
    对象1.方法3();
    对象2.方法2();
    ...

    那只能说,你把不同对象的不同方法有效地结合到了一起,你的方法起到的不过是个计算式的某一步的作用,相当于一大堆的计算代码行.这样看,你的思维仍然是行编程的.只不过把很多行简化成了某个对象的某个方法.

    如果在你写的主程序的主要执行代码里是以下这种情况:

    对象1.方法1();[只有对象创建和简略的几个对象方法的调用,基本不返回值,也不需要提供什么返回值给其他的计算来利用]

    那这基本上就算是面向对象的编程了.为什么?因为你将大把的计算处理,全都抽象整理到了创建对象的那个类中,这里面有关于这个类的对象的全部方法,与其他类的关联达到最弱(弱藕合).这样它的再利用的价值就会达到最高(可重用).而且可以证明你的业务已经被提取到了这个类的内部(抽象,封装).

    *当你对上述两段代码进行修改的时候,你就会发现明显的不同.
    第一段代码,你需要在主程序中不断地修改每个对象的每个方法,因为业务变了,步骤也就都变了.
    第二段代码,你根本不需要在主程序中修改什么.你只需要修改创建对象的那个类的某个方法.因为业务再变,也只是某个抽象后的对象的处理变化了.
    其他的区别就不一一列举了,你弄清楚这些,就差不多算是知道两者之间的区别了.

    面相对象我觉得至少得考虑两个方面:
    1 如何设计能够更符合继承和组合的逻辑原理
    2 如何设计能让扩展者和使用者的工作量最小

    培养OO思想其实很简单,当你遇到一个需求时,先把这个需求拿出来,单独思考,想他可能有什么属性,有什么方法,是否有功能类似的兄弟姐妹,之后单独实现,并且用单元测试来测试。 最后在回到需求点调用。
    借用24楼兄弟的例子,如果你现在写UI,需要记录log,你可能很自然的想到
    class Logger
    {
        void Log(string message){}
    }
    然后你回到UI,调用Logger.Log("用户登录成功了"),这就是典型的面向过程的思想。你甚至可能会写个Logger的接口,但你的思想还是面向过程。

    而如果你想我的项目需要一个Log功能,他可能需要记录exception,记录Event,记录自定义的Message,他可能记录到database,记录到文件,甚至记录到串口,或许将来会记录到不可预见性的地方,那么你需要提供配置文件,Logger工厂和继承的子Logger来扩展。 这样,一个丰富的,有血有肉的Logger对象浮出水面。
    接下来你可能考虑如何调用这个Logger,直接在UI调用可能是不明智的,他违背了MVC原则,那么你可能需要一个SystemEvents对象,专门负责抛出各种各样的Events,或者打入MessageQueue。好了,既然我们有了SystemEvents对象,我们还需要一个监视对象来监视SystemEvents的变化,并最终记录到Logger中。
    OK,小功告成,我们有了一套互相协调工作的对象,大家互相配合完成一些工作,这时候你可以完成你的代码了,你的代码可以写的非常丑陋,你可以没有继承,没有多态,但是你的思想已经是OO思想了。

    很多朋友可能误解了,以为继承,多态就是OO。其实OO在前,技术在后。先辈们有了OO的思想,然后发明了继承,多态等技术来更好的实现这种OO思想。记住,OO是思想,是思路。

    面向对象编程应记住以下三条原则
    ① 针对接口进行编程,而不要针对实现编程。
    ② 优先使用对象组合,而不是类继承。
    ③ 封装变化点。

    再明确一下开闭原则:
    面向扩展开放,面向修改封闭。

    请参照《Beginning C# Objects》一书;
    《敏捷软件开发》一书;
    《设计模式》一书。

    需要了解
    UML语言
    面向对象的5大原则
    GOF23种设计模式


    面向对象考虑的是谁去做,面向过程考虑的是怎么做,也就是说使用一个类时就是面向对象;在建一个类时就是面向过程,好比你要寄一份信你考虑的是让邮局去寄不需要知道邮局是怎么把信送给收信人的这就是面向对象,当你建邮局这个类时就必须要考虑邮局是怎样把这份信送给收信人这就是面向过程

  • 相关阅读:
    Spring.Net AOP的通知类型及通知链
    Spring.Net框架介绍及基本配置(学习笔记一)
    Spring.Net对方法的注入(学习笔记三)
    Spring通过容器获取配置对象及事件注入(学习笔记二)
    SqlServer2008 数据库同步的两种方式(Sql JOB)
    AOPUnity使用初探
    PIABPolicy Injection Application Block
    LINQ查询基础
    C#泛型基础
    [转载]CSS块级元素和行内元素
  • 原文地址:https://www.cnblogs.com/pricks/p/1494048.html
Copyright © 2011-2022 走看看