面向对象到底是个啥?

    每次说到面向对象,都让我想起当年最开始学习计算机的那段日子,因为“只要胆子大,一周七天假”、“六十分万岁多一分浪费”的这些口号麻痹着自己,学艺不精的我心安理得的将所有的功能敲进一个方法,为了实现功能而实现功能,能写死的一定写死,导致每次有啥要改的地方都要将代码从头到尾修改一遍。

    然后我学到了面向对象。

    我觉得我叩开了新世界的大门。

 (图片源自网络,侵删)

    随着开发经验的不断增长,一个和现实世界完全不一样但又无处不相似的世界慢慢刻在了我的生活里,它不断地进化,飞速的进化,用几十年甚至几年的时间进化出一个又一个复杂庞大却不断趋于完备的生物。EJB、String、 Struts、Hibernate、MyBatis、SVN、Git、SpringBoot、SpringCloud、Dubble、Zookeeper、MySQL等等等等,这些庞然大物推动着这个世界飞速进化着。我开始明白为啥大部分的框架都在用小动物的图标作为自身的代表,因为框架的开发者的眼中,这就是自己的孩子吧。而这个世界的飞速演化,正是因为面向对象思想的不断完善以及进步。

    那么,面向对象到底是个啥?

    面向对象,是一种对现实世界理解和抽象的方法,是计算机编程发展到一定阶段后的产物。

    简而言之,就是将功能和行为封装进一个对象,强调具备功能行为的对象。

    再通俗点的话,比如你是超市老板,最开始的时候,超市的进货、上架、标价、出售、维护、记账都是由你自己完成,这就是最开始的面向过程。

/**
 * 超市类
 */
class Supermarket {
    private Logger logger = LoggerFactory.getLogger(Supermarket.class);
​
    /**
     * 超市运行方法
     */
    public void run(){
        logger.info("进货");
        logger.info("上架");
        logger.info("出售");
        logger.info("维护");
        logger.info("标价");
        logger.info("记账");
    }
}

    但是随着顾客越来越多,超市越开越大,慢慢的你开始力不从心了,于是你找了几个服务员,有人负责进货和上架,有人负责出售和维护,有人负责标价和记账,这就是面向对象。

/**
 * 超市类
 */
class Supermarket {
    private Logger logger = LoggerFactory.getLogger(Supermarket.class);
​
    /**
     * 超市运行方法
     */
    public void run(){
        new Salesperson("李明").work("进货", "上架");
        new Salesperson("李雷").work("出售", "维护");
        new Salesperson("韩梅梅").work("标价", "维护");
    }
}
​
/**
 * 售货员
 */
class Salesperson {
    private Logger logger = LoggerFactory.getLogger(Salesperson.class);
​
    private String name;
​
    public Salesperson(String name){
        this.name = name;
    }
​
    /**
     * 工作
     */
    public void work(String...jobs){
        for (String job : jobs) {
            logger.info(this.name + "正在做工作:" + job);
        }
    }
}

    ​面向对象有什么优势呢?首先你不需要再凡事都自己干了,员工可以去做,降低了耦合性。如果你突然还想加一个打扫卫生的功能,你只需要再招一个打扫卫生的员工就好了,提高了可维护性。所以面向对象对于系统的功效就是降低了耦合,提高了可维护性。

    ​面向过程是具体化的,流程化的,解决一个问题,你需要一步一步去实现。

    ​面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,我们可以忽略,只要我们会用就可以了。 就像你不会记账,但是你可以招一个会记账的员工就好了。

    ​面向对象的思维就像是一个二次元的世界,每个对象也会有自己的行为以及动作,我们的程序就是将这些对象构建出来,然后让他们去有机的去完成一些任务,就像是在公司里的我们,每一个人单独拿出来都是一个对象,每一个人负责的工作是不同的,单独拿出来这个工作可能毫无意义,但是所有人的工作加起来就变成了一个有序运作的公司整体​。

(图片源自网络,侵删)

​    ​在最开始的机器语言时代,程序猿开发是比较困难的,因为人需要将想让机器运转的行为转换为机器的二进制编码录入进去​。这就像我们的世界最开始只有水、空气这种元素的时候。

    ​到了后来的汇编语言,定义了基本的语法结构、操作符和数据类型,但是本质还是针对特定的硬件编程,比如cpu​。就像是世界开始产生单细胞生物了。

    再到后面的高级语言,类似于C++/Java/.NET​。抽象出来了语言,实现了硬件无关性,不需要再面对硬件编程。而且类似于Java这种通过实现一个jvm虚拟机,屏蔽了各个操作系统的差异,同时定义了一个标准的目标代码(class文件),只要class文件满足jcp定义的规范,就可以被jvm执行。就像世界的生物开始进化出了动物植物等各种高等生物​。

    ​而现在,这个二次元的各种生物正在不断的进化中,各种框架的不断发展,核心思想依然是面向对象,在机器学会使用自然语言之前,人类依旧需要通过面向对象的思想,将自然语言转换为计算机程序。

(图片源自网络,侵删)

    ​最后,引用一段《大话设计模式》中大鸟给小菜讲的故事:

    ​“话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗性大发,不觉吟道:‘喝酒唱歌,人生真爽……’众文武齐呼:‘丞相好诗!’于是一臣子速命印刷工匠刻版印刷,以便流传天下。”

    ​“样张出来给曹操一看,曹操感觉不妥,说道:‘喝与唱,此话过俗,应改为‘对酒当歌’较好!’于是此臣就命工匠重新来过。工匠眼看连夜刻版之工,彻底白费,心中叫苦不迭。只得照办。”

    ​“样张再次出来请曹操过目,曹操细细一品,觉得还是不好,说:‘人生真爽‘太过直接,应改问语才够意境,因此应改为‘对酒当歌,人生几何……’当臣子转告工匠之时,工匠晕倒……”

大鸟:“小菜你说,这里面问题出在哪里?”

小菜:“是不是因为三国时期活字印刷还未发明,所以要改字的时候,就必须要整个刻板全部重新刻。”

大鸟:“说得好!如果是有了活字印刷,则只需更改四个字就可,其余工作都未白做。岂不妙哉。

一、要改,只需更改要改之字,此为可维护

二、这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用

三、此诗若要加字,只需另刻字加入即可,这是可扩展

四、字的排列其实可能是竖排可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。”

    ​“而在活字印刷术出现之前,上面的四种特性都无法满足,要修改,必须重刻,要加字,必须重刻,要重新排列,必须重刻,印完这本书后,此版已无任何可再利用价值。”

小菜:“是的,小时候我一直奇怪,为何火药、指南针、造纸术都是从无到有,从未知到发现的伟大发明,而活字印刷仅仅是从刻版印刷到活字印刷的一次技术上的进步,为何不是评印刷术为四大发明之一呢?原来活字印刷是思想的成功,面向对象的胜利。”

原创文章 8 获赞 41 访问量 5629

猜你喜欢

转载自blog.csdn.net/jcSongle/article/details/105646823