面向对象
这是本人读到的关于面向对象最好的理解
参考资料:https://tieba.baidu.com/p/6010145114?pn=3
初级:面向对象是一种“编程”思想
中级:面向对象是一种“设计”思想
高级:面向对象是一种设计“思想”
初级开发者的"面向对象"
面向对象这个概念,应该是大家学习java或者是学习编程遇到的第一个"坎".
因为这个概念对于新手来说是十分抽象的.大家一开始很难理解什么是"对象".什么叫面向对象编程.
这里我简单使用一个例子来表述一下:盖房子.
这个例子真的和软件开发十分相似,建筑行业的很多思想也和软件开发类似.
我们盖房子需要一个东西:"结构".我们需要定义这个房子的结构和框架以便大家理解.
同时软件编程一样,我们需要定义一个事物来"组织"我们的代码.
所以对于新人来说.首先理解"面向对象"是一种编程方法.是一种对于代码进行组织然后实现
业务功能的方法和设计思想.
何为对象
可能编程中最难的部分就是理解什么是对象了.上面我们理解面向对象是代码组织的一种方法.
那么这个方法具体是什么呢?我个人的理解就两个字:抽象.
即.我们需要用代码来实现真实社会中的一个功能,一个事情或者表现真实社会中的事务.
但是代码又全都是一个个符号和语法.如何能真正的组织我们的代码.然后实现功能呢.
这个时候必须对现实生活中的一些"特征"进行抽象,然后映射到我们的编程设计中.这种特征的抽象
就是抽象出一个个对象的概念.
比如我们设计一个程序用来卖苹果.那么在程序中.苹果就可以是一个对象.他的特征是有重量和有数量.
然后进一步.我们会针对"数量"和"重量"来进行实现售卖的功能.然后大家发现我们自然而然的忽略了"苹果"
这两个字.这就是之前说的"抽象".而面向对象就是把一个个实物进行抽象,用我们的代码进行组织
所以,请记住"对象"是对现实事务的特征的一种抽象.
何为面向对象编程
介绍完何为"对象".我们继续介绍如何运用对象进行编程.
还是上面卖苹果的例子.我们把苹果抽象成了"数量"和"重量".那么售卖者会提供一个功能:
"价钱"=("数量"or"重量")x"单价"
这就是我们组织代码的方式.
其核心的本质就是.我们基于"万物皆对象"这种方法,组织我们自己的代码.从而让代码能够有一定的聚合和分类.让代码好理解一些.
所以对于新人来理解面向对象:这是一种编程方式.编程绝对不是几百上千个if和循环组成的.而应该是一个个对象互相交互形成的
注意!新人在写代码的时候可以强制要求自己使用多个对象来组成自己的功能.千万别写一个几百行的大功能
面向对象的基本技术
当我们理解了面向对象的一些概念之后.我们可以尝试使用面向对象来解决问题.大家应该知道.不仅仅是"我们"来用面向对象.同时有非常多的前人一样使用面向对象的工具来解决问题.所以这些前人的智慧就形成了一些公用的方法.
这些通常的做法和解决具有某些特征的问题的方法叫:设计模式.
大家可以通过设计模式来更加进一步的理解面向对象技术.
此外,除了设计模式以外还有一些java语言支持的操作和原则.我们同样可以学习
比如面向对象五大原则:SRP,OCP,LSP,DIP,ISP.这些内容.
当然初级开发可以从一些基本的面向对象操作来学习
比如:接口,实现类,继承,多态,包装.这些概念,然后自己思考然后来写一个程序.
中级开发的面向对象
- 中级开发专注解决问题而不是专注技术
- 中级开发会慢慢不提一些技术而是提一些概念
- 中级开发第一时间想到的是要怎么去思考
而高级已经有自己的方法论了
其实对于中级开发,可能已经应用了大量的面向对象的编程技术了.比如spring就是一个大的工厂设计模式实现的ioc.
所以慢慢"如何写代码"以及如何组织自己的代码,如何来实现一些CRUD已经不是问题了.甚至能脱口而出一些设计模式,用设计模式的思考方法来思考一些内容.
所以此时就开始理解面向对象为一种"设计"方式了.此时考虑的不仅仅是实现,而且是整个"架构"来如何"设计".而考虑架构的时候就是一个设计的使用方法了.
架构方法
- 一个架构的初步设计想法
当我们在说架构的时候是在说什么?为什么说运用面向对象是一种"设计"的方法.因为对于中级开发来说.往往面临一个独立的开发业务功能.那么如何实现这个功能,一定需要对功能进行"设计".他们会设计多少个类.设计整体的结构.
进一步,假如需要这个同学写一个企业级别的架构.那么需要怎么做呢?此时可能需要机遇现有业务情况做"设计"的"设计",进一步把我们组织代码的方式来进行抽象.这句话貌似很难理解.我来简单举个例子
- 如果我们写数据层代码,使用jdbc来书写,那么可能10个业务都需要进行prepare,写sql,然后execute
- ok,我们把这些数据库的操作全部面向对象.我们使用mybatis框架,不用面向jdbc了.仅仅需要书写很多个bean和对应的sql即可.
- 如果我们有100个业务呢?我们发现所有的业务几乎都有getById方法,并且getById里面的sql都是全量返回一个bean的所有信息.那么我们是不是可以通过反射来实现这部分的功能,一个sql完成所有工作呢?
上面就是一层一层更加抽象的方式来组合我们的代码.
进阶思考
中级程序员面对的问题可能多种多样,此时他们会接触到另外一些方法论.比如aop.比如soa.比如mvc.比如微服务等等.
当我在罗列这些词语的时候感觉就看到了几年前的自己,感觉每个概念和每个技术都要运用到自己的设计或者架构中.
中级程序员慢慢自己手中的工具会越来越多.可选择的也越来越多.活灵活现的使用我上面的这些设计方法.并且有了自己的理解就可以慢慢成为高级程序员了