对象是对现实业务的抽象概念,可能是属性集(具备容器的特性)也可能是方法集(具备行为特性),或者是两者都有.
行为特性最终都可以归结为一个初始集到结果集的映射.
属性集和方法集就是一个对象的结构,分析归纳这些结构就属于面向对象编程的范畴.
而行为特性的分析属于面向过程+面向对象编程相结合的分析.
因为一个复杂的行为特性可能会包含多个子行为,每个子行为都可以归纳为一个对象.
比如,假设行为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调试揣摩是一种比较好的方案。
如果连业务入口也找不到,那要么是代码太糟糕,要么是你的经验还不够,不耻下问去吧。