面向对象VS面向过程

1

前言

向伟人致敬

其实这个问题真的是被问烂了,特别是刚入门的同行,我感觉这个问题应该是大家都听说过了,但是有多少人真的是理解这两个区别呢,这两种方式并不是简简单单的两种编程语言的区分,可能会有人说,面向对象就是万物皆对象,说的没错,我也相信你是一个爱学习的好宝宝,这句话如果我没记错的话应该是出自《java编程思想》,这本神书,带领太多的IT小白走进了java世界,在此应该向大佬致敬。话不多说,回归正题,今天我们就来解释一下这两种编程方式的优劣。

首先我们先根据一个简单的小栗子,来体会一下,这两种编程方式的不同之处。

2

问题

面向过程VS面向对象

提一个问题

假如说两种鸟,一种是百灵鸟,一种是喜鹊,他们都会叫,但是声音不同,在面向对象的世界里我们应该怎么区分呢,或者说,怎么去表达这两种不同的鸟类呢。

3

java

面向对象

思考一下吧

java的开发者可能一眼就能想到应该怎么做,java是一种面向对象的编程语言,利用面向对象的继承、封装、多态的特性,我们很容易解决这个问题,毕竟这是对于面向对象最基本的应用了。我们先创建一个鸟类对象,让百灵鸟跟喜鹊都继承鸟类,分别实现鸟类中的叫声。

来一段代码

公共鸟类接口

public interface Bird {    //公共的叫声行为    public void say();}

百灵鸟类

public class Lark implements Bird {    //百灵鸟的叫声行为    @Override    public void say() {        System.out.println("百灵鸟叫了一声!");    }}

喜鹊类

public class Magpie implements Bird {    //喜鹊的叫声行为    @Override    public void say() {        System.out.println("喜鹊叫了一声!");    }}

Test类

public class Test {    public static void main(String [] args){        //喜鹊叫        say(new Magpie());        //百灵鸟叫        say(new Lark());    }    private static void say(Bird bird){        bird.say();    }}

面向对象小结

三段言简意赅的代码充分展示了面向对象的代码风格,目前我们实现了面向对象的代码,继续进行面向过程的代码,

4

C

面向过程

思考一下吧

C语言的开发者可能遇到这个问题(本人JAVA,如有不妥,欢迎来稿),第一眼就是先写几个数据结构,然后将操作写到行为函数中,喜鹊跟百灵鸟分别为写一个数据结构,如图。

来一段代码

喜鹊数据结构

//喜鹊public class MagpieOP {    String name = "喜鹊";}

百灵鸟数据结构

//百灵鸟public class LarkOP {    String name = "百灵鸟";}

C代码

//面向过程,虽然用java写的,但是并没有用到三大特性,所以这段代码属于面向过程public class ProcedureOriented {    public void Bird(String name){        if(name.equals("喜鹊")){            System.out.println("喜鹊叫了一声!");        }else if (name.equals("百灵鸟")){            System.out.println("百灵鸟叫了一声!");        }    }}

面向过程小结

这段虽然使用intellij的java编译器写的,但是语法上属于面向过程,所以大家有时候不要去纠结着个问题。

6

重点

文章最重要的地方

重点来了!!!思考一个问题

如果现在,我需要增加一个啄木鸟类,这两种编程方式需要如何修改。

1、先说面向对象,我们只需要写一个啄木鸟类,然后让他继承鸟类,实现鸟类的叫声即可,不需要改动bird类。

2、再说面向过程,我们需要增加一个啄木鸟的数据结构,并且修改bird函数,在判断name时需要将啄木鸟加进去。

由此可见,面向对象的特点是修改数据结构的同时,不影响方法,也就是说添加一个类,不会对原系统的方法有影响。而面向过程在添加一个类的同时,需要修改原系统方法,但这能说明面向对象要比面向过程高级吗?我们继续思考一个问题。

再来思考一个问题!

如果现在,所有的鸟类都要吃东西,这两种编程方式需要如何修改。

1、先说面向对象,我们需要在bird类中增加一个eat方法,所有继承该bird类的鸟类都需要实现这个eat。

2、再说面向过程,我们只需要增加一下bird中的eat行为即可,不需要修改数据结构。

由此可见,也就是说当需要添加函数的时候,数据结构不会受到影响。相比于面向对象,面向过程对于添加行为特征要方便的多。

应该说,没有一种特别完美的编程方式,也不存在非常完美的编程语言,每一种语言都有他自己的闪光点,但是也有他的瑕疵,作为一个开发者,我们需要做的就是根据业务需求,择优开发。

7

总结

面向对象:修改数据结构的同时,不影响方法。

面向过程:添加函数的时候,数据结构不会受到影响。

原文发布于微信公众号 - 精讲JAVA(toooooooozi)

原文发表时间:2017-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

java基础学习_面向对象(上)01_day07总结

============================================================================= ==...

10420
来自专栏平凡文摘

国外大神总结的 10 个 Java 编程技巧!

14020
来自专栏wym

HDU 1166 敌兵布阵

http://acm.hdu.edu.cn/showproblem.php?pid=1166

10620
来自专栏深度学习计算机视觉

工厂方法模式

简单定义### 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 工厂方法(Factory Method)模式的意义...

34990
来自专栏大史住在大前端

javascript基础修炼(8)——指向FP世界的箭头函数

箭头函数是ES6语法中加入的新特性,而它也是许多开发者对ES6仅有的了解,每当面试里被问到关于“ES6里添加了哪些新特性?”这种问题的时候,几乎总是会拿箭头函数...

11630
来自专栏一个会写诗的程序员的博客

编程范式 (Programming paradigm)

范,模范、典范也。范式即模式、方法。常见的编程范式有:函数式编程、程序编程、面向对象编程、指令式编程等。

40410
来自专栏java一日一条

为什么要使用String

这段代码总的来说是OK的。该方法将map中每个Dwarable的key和值,以及和它期望被分解的dwarwleKey一同传得给另一个调用方法。因为功能简单,我就...

8320
来自专栏诸葛青云的专栏

C语言最难啃的三块硬骨头

指针之所以难理解,因为指针本身就是一个变量,是一个非常特殊的变量,专门存放地址的变量,这个地址需要给申请空间才能装东西,而且因为是个变量可以中间赋值,这么一倒腾...

19820
来自专栏同步博客

工厂模式

  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

12820
来自专栏IT笔记

聊聊JAVA中 String类为什么不可变

前言 "我的风格比较偏传统和经典" 小明说,"我们在打扮自己的问题上还是蛮冒险的...我觉得当你是只狗的时候,穿什么都hold的住!" ? 哈哈哈,脱离单身狗快...

431190

扫码关注云+社区

领取腾讯云代金券