面向对象编程的个人理解

对象是对现实业务的抽象概念,可能是属性集(具备容器的特性)也可能是方法集(具备行为特性),或者是两者都有.
行为特性最终都可以归结为一个初始集到结果集的映射.
属性集和方法集就是一个对象的结构,分析归纳这些结构就属于面向对象编程的范畴.

而行为特性的分析属于面向过程+面向对象编程相结合的分析.
因为一个复杂的行为特性可能会包含多个子行为,每个子行为都可以归纳为一个对象.
比如,假设行为1是将集合A映射为集合B,这中间的过程可能是以下几种中的一种(面向过程分析):
    A->C->B
    A->D->B
    A->E->B
这其实就对应了java开发中的条件控制,这过程中间又衍生了多个对象,如A->C ,C->B,A->D,D->B等对象(面向对象分析)    
    
站在java开发的角度,无论再复杂的行为,最终都可以归纳为基础语句集,
对于JVM来讲,一个基础语句就是一个对象。
但对于Java开发者来讲,一个基础语句就是一个原子行为,因为这个语句的处理过程对于开发者不可控(它由JVM负责底层实现).

综上,一个复杂行为的分析最终都可以归纳为多个原子行为的组合.

所谓的基础语句,从广义上可以理解为JDK自带的方法、算术运算等,以及其他第三方jar包提供的方法。
总结一句话就是,你在分析对象A的时候,这个语句你没有办法改动它的映射关系了,那这就是一个基础语句。

比如说,假设A项目依赖B项目,WebUtil.getQueryString()是B项目中定义的方法,那么对于项目A的开发者来讲,
WebUtil.getQueryString()就是一个基础语句,
因为这是B项目中包封装好的函数,在A项目中无法改动它的逻辑(映射关系).

站在数学的角度,映射除了一对一映射,还有一对多,多对一等等。
所以在分析java代码的时候应该更灵活,而不是局限于看形参和返回值.

即使是无返回值的方法,它本身也应该有一个映射关系的处理逻辑,
不然这就是一个空方法(啥也不干,当然你也可以将此理解为一种特殊行为,就像jvm中的void处理一样).

比如:
void test(){
System.setProperty("user.dir","G:/temp");
}
这个test改变了系统变量user.dir的值映射关系,这就是一个原子行为,虽然它既没有形参又没有返回值.
当然这这是从代码层面的述说,站在业务的角度,
这个行为描述为设定系统用户根目录为G:/temp会更容易理解一些.

站在面向对象编程的角度,虽然每一个对象最终都可以归纳为多个基础语句的组合,但是在分析代码的时候不应该奔此而去。
而应该像剥洋葱一样,一层一层的剥开,因为一个复杂对象肯定是有层次性的.
如果你直奔基础语句而去,那这就不是面向对象编程,而是面向过程编程了.

比如一种最简单的分层:
    void do(){
        init();
        start();
        destroy()
    }
    void init(){
        loadConfig();
        validConfig();
        cacheConfig();
        ....
    }
这个do行为第一层就是做了三个动作,init,start和destroy.
init属于第二层的操作,它又细分为loadConfig,validConfig,cacheConfig等等

所以在面向对象编程的分析中,找准第一层很重要,这通常都建立在熟悉业务的基础上。
如果不熟悉业务怎么办,找到业务入口Debug调试揣摩是一种比较好的方案。
如果连业务入口也找不到,那要么是代码太糟糕,要么是你的经验还不够,不耻下问去吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值