人世繁华|进行面向对象程序设计深剖,可以一学,大牛带你深入Java核心技术( 三 )


对象的这些关键特性在彼此之间相互影响着 。 例如 , 对象的状态影响它的行为 。 (如果一个订单“已送货”或“已付款” , 那么就应该拒绝调用具有增删订单中条目的方法 。 反过来 , 如果订单是“空的” , 即还没有加入预订的物品 , 那么这个订单就不应该进入“已送货”状态 。 )
传统的过程化程序设计 , 必须从顶部的main函数开始编写程序 。 当设计一个面向对象的系统时 , 没有所谓的“顶部” 。 对于学习OOP的初学者来说常常会感觉无从下手 。 答案是首先从设计类开始 , 然后再向每个类中添加方法 。
这些名词很可能形成类Item、Order等 。
接下来 , 查看动词 。 物品项目被添加到订单中 。 订单被发送或取消 。 订单货款被支付 。 对于每一个动词如:“添加”、“发送”、“取消”以及“支付” , 都要标识出主要负责完成相应动作的对象 。 例如 , 当一个新的条目添加到订单中时 , 那个订单对象就是被指定的对象 , 因为它知道如何存储条目以及如何对条目进行排序 。 也就是说 , add应该是Order类的一个方法 , 而Item对象是一个参数 。
当然 , 所谓“名词与动词”原则只是一种粗略的方法 , 在建立类的时候 , 哪些名词和动词是重要的完全取决于个人的开发经验 。
类之间的关系
在类之间 , 最常见的关系有
?依赖(“uses-a”)
?聚合(“has-a”)
?继承(“is-a”)
依赖 , 即“uses-a”关系 , 是一种最明显的、最常见的关系 。 例如 , Order类使用Account类是因为Order对象需要访问Account对象查看信用状态 。 但是Item类不依赖于Account类 , 这是因为Item对象与客户账户无关 。 因此 , 如果一个类的方法操纵另一个类的对象 , 我们就说一个类依赖于另一个类 。
很多程序员都使用UML(UnifiedModelingLanguage)绘制描述类之间关系的类图 。 图4-1就是这样一个例子 。 类用矩形表示 , 类之间的关系用带有各种修饰的箭头表示 。 表4-1给出了UML中最常见的箭头样式 。
我们想用OOP与读者也许更熟悉的过程式模型的对比来结束对OOP的简要介绍 。 在过程化程序设计中 , 首先需要确定要完成什么任务 , 然后:
?使用逐步求精的处理过程:将要完成的任务分解成若干个子任务 , 子任务再分解成更小的子任务 , 直到子任务小到可以直接实现为止(这是自顶向下的方法) 。
?编写求解简单任务的过程 , 并将它们组装成更加复杂的过程 , 直到完成需要实现的功能为止(这是自底向上的方法) 。
当然 , 大多数程序员使用自顶向下与自底向上相结合的策略来解决程序设计的问题 。 在过程化程序设计中 , 确定过程的手段与OOP中确定方法的方式基本一样 , 即查看问题描述中的动词或者动作 。 而在OOP中的最重要区别是首先从项目中分离出类 , 然后再找出这个类中需要定义哪些方法 。 除此之外 , 传统的过程和OOP方法的另一个主要区别是:在OOP中 , 每个方法都与负责执行这个操作的类相关联 。


推荐阅读