“520又是面向对象的一天,就聊点和对象相关的吧~ ”
如果说要聊下面向对象(Object Oriented),那不得不提的就是和它相对的另一个概念:面向过程(Procedure Oriented)。而面向对象产生的背景则是设计思想和理念的进步,以及系统的日益复杂,人们慢慢发现面向过程这种方式已经不再适合解决现有问题了,于是慢慢催生了面向对象这一概念。
而这两个概念之间的差异点,我认为核心在于分析问题和看待问题的角度。
面向过程是偏向于过程的,对于一个问题,面向过程会将其拆解为一个个步骤,然后一步步执行,执行完了问题也就解决了。代表语言可能有 C语言, 这里说可能是因为C也可以定义结构体,也算一定程度上广义的对象,但整体上它还是面向过程的语言。
面向对象在解决一个问题时候,则是倾向于抽象出来一个实体,然后将其作为一个整体或多个整体进行思考,然后解决问题。代表语言有 Java (老牌咖啡了)。
这样说可能有点绕,知晓区别的不看这篇文章也能理解,不知晓的可能看了这两句话也稍稍迷一点。
我们不妨举个谈到面向对象都会谈到的一个问题:如何把一个大象放到冰箱里?。
我们可以看到,以上的解决问题的方法就是有一个个步骤/过程组合而成的,而解决问题则是通过按照一定的顺序调用方法进行。整体都是面向过程的。
那面向对象怎么该怎么解决这个问题呢?
首先我们分析下这个问题涉及到哪些实体,这个问题中涉及到了 冰箱 和 大象。
所以我们就可以按照以下的方式进行了~
然后我们就只需要
冰箱.开门
=> 大象.行走(冰箱里)
(让大象走到冰箱里) => 冰箱.关门
就ok了
整体我们都是把二者作为了对象去看待,就像在现实中对待两个事物一样。
通过对比,我们就明白面向对象和面向过程二者的区别啦~
现在很多时候,说到面向对象大家就说Java;有的也说面向对象就是 Java。这肯定是错的,就像聊到区块链就说是比特币一样。
面向对象是一种思想,而 Java 则只是它的一种在编程语言方面的应用。而它的应用绝不仅仅于此,不仅 Java,现在对于数据库的设计、系统层面的功能设计处处都是面向对象的应用。而对于这种思想的运用,还需要我们有一定的数据抽象能力。
我们举个人物身份如何在软件系统中抽象的例子,首先我们把人的共有属性找出来,作为所有角色共有的;然后我们再在这个基础上去向具体的任务角色具体,然后根据他们的不同职业去添加特有的属性或方法。这在 Java 中也就是封装和继承的体现。
图有点简陋1😹
图有点简陋2😹
多态则是说同一个动作(方法),不同实体有不同的表现,比如说上图中警察和歌手,都可以唱歌(方法),但是警察的唱歌可能是唱军歌,歌手的唱歌则可能是唱单身情歌。同一个方法在不同的实体有不同的表现。
另外,我们在进行一个系统开发设计的过程中,也不乏有面向对象的体现。比如说,我们要写一个树洞小程序。
首先我们要分析,它涉及到哪些对象:用户、动态、评论等(简单举这几个)。
然后对于用户,他的属性就有:账号、密码、角色、邮箱、昵称等等等。
对于动态,它就有谁发的(用户)、内容、发布时间、更新时间、状态等等。依次类推,我们系统的库表结构基本就出来了,这里说的简单哈,具体问题具体分析。
然后对于方法,我们围绕动态展开,就有发布、删除、查找等等一系列,这样围绕几个系统的对象依次展开,自然系统功能基本也就罗列出来了。当然到具体系统还是需要具体流程具体分析。还是要同具体的业务逻辑挂钩滴。
那面向对象的定位是什么呢?目前面向对象基本可以解决大多数场景下的问题,优点也十分明显:结构性强、易拓展、易复用等。但是他也有一些缺点,比如说如果问题较小,完全为了面向对象而面向对象,则会比较“重”一些。
这东西就是编程发展的必然产物,但也可能是中间产物。但就目前,这种思想还是可以滴!
之后可能会围绕Java的再谈一下面向对象在Java语言中的一些理念和原则,写个小短文