面向对象设计 java_Java面向对象设计最佳实践 - 方法设计(一)

觉得相当有用,收藏下来 http://mercyblitz.iteye.com/blog/667939 在《类的设计基础知识》文章中提到, 方法作为 命名的控制类或者对象的有状态或无状态的执行模块,可称作类或者对象的“行为”。 方法在类中的地位相当重要,利用面向对象的多态性能够设计更为优雅的结构,同时巧妙地使用继承能够更好地减少冗余,因此其设计是重重之重。方 法的设计实践会按照下列的议程安排: 名称和注释设计 注释即规约 名称即语义 范围设计 物理范围 逻辑范围 参数设计 参数类型 参数顺序 参数数量 返回值设计 返回值类型 返回值特征 异常设计 异常类型 异常转换 泛型设计 AOP设计 一、 名称和注释设计 方法名称好比人的姓名,父母在给自己子女起名的时候,在字面上,尽量不想重复,同时在意义上,面体现了 父母的美好希望。好的名称不仅容易让人记住,同时会想起其特征。方法也是如此。 在面向对象设计中,对于API 方法来说,说明它的语义和体现的行为。那么,设计人员应该遵循方法的设计原则: 输入和输出,以及异常触发应该是规约的和可控制的,也就说方法说体现的行为或者履行的职责应该是有限的 。凡是任意暴露(从结构上)和职责(从逻辑上)模糊或者歧义,皆视作低内聚- 高耦合设计。 那么,规约方法行为和科学的名称是必要,也是重要的。        1.  注释即规约 在TDD 中,有句名言是“实现未动,测试先行”。那么设计中,则是“实现未动,规约先行”。也就说,在实现和命名方法的之前,应该好好设计下这个方法 的语义规约,即它要表达的语义和行为是什么。也叫做 契约编程 。良好的单一性规约,是 高内聚- 低耦合 的前提。 在实现方法之前,一般的设计人员更多地关注与功能性需求,而非功能性需求更多地由架构师考虑。显然,良 好的设计是需要全面考虑到的。下面总结了一些通用的规约,这也是后续文章重点介绍的。 功能性需求的规约: 方法物理上和逻辑上的范围  参数的接受范围、其数量、顺序、类型以及意义 返回值、其类型以及意义 方法异常触发的条件以及意义 前提和后续条件 非 功能性需求的规约: 性能指标(比如,时间和空间) 安全(比如,执行权限、防止攻击) 为一致性(比如,什么条件下保持一致性) 软件条件限制(比如,编程语言限制) 当了解这些规约之后,那么剩下就是怎么体现到设计中。代码实现是利用编程语言,而规约表述是自然语言, 自然地,在编程语言中,大多数是利用注释来表达。Java 同样如此,不过可利用 Javadoc 来生成 API 文档。 当客户端使用方法之前,它可以通过注释来了解方法规约,更好地增加了方法的可用性。 在方法实现之前,给方法添加注释,固然是一种很好的方法。当受制于时间的情况下,采用一种“命名即注 释”的方法更佳。接下来接受方法命名。        2.  名称即语义 前面提到“命名即注释”的方法,通过命名就知道方法的意图,一般用于方法实现相对简单的情 况,比如在Java Bean 中, Setter 和 Getter 方法就是一种体现。设计时,可以利用这种方法提高方法的易用性和可读性。 Java的 API 中,提供了很多命名模式的参考,其命名一般可以归纳为几类: a)  动词 以动词命名方法,比如: i.  对象状态比较 Java代码 java.lang.Object#equals(java.lang.Object),  java.lang.String#contains(java.lang. CharSequence),  java.util.Collection#contains(E),  java.util.Comparator#compare(T,T)  ii. 状态改变的 Java代码 java.lang.Collection#clear(),  java.io.Closeable#close(),  java.lang.String#intern(),  java.lang.String#trim();  b)  动词- 名词 i.  状态转化 Java代码 java.lang.Integer#parseInt(java.lang.String) ,  java.lang.String#getBytes(),  javax.jms.Session#createMessage()  ii.  条件判断 Java代码 java.util.Iterator#hasNext(),  java.lang.Class#isInterface(),  java.lang.String#isEmpty(),  java.lang.Thread# holdsLock (java.lang.Object)  iii.  状态改变 Java代码 java.lang.Thread#setContextClassLoader(java.lang.ClassLoader),  javax.Servlet.http.HttpSession#removeAttribute(java.lang.String)  iv.  通讯传输 Java代码 javax.mail.Transport#sendMessage(javax.mail.Message,javax.mail.Address[])  c)  动词- 介词 i.  对象状态比较 Java代码 java.lang.Comparable#compareTo(E)  ii.  抽象实现 Java代码 java.util.Formattable#formatTo(java.util.Formatter,int,int)  d)  动词- 介词 - 名词 e)  名词 i.  状态转化 Java代码 java.util.Map#values(),  java.util.Collection#iterator(),  java.lang.Number#longValue(),  java.util.Collections#singletonMap(K,V)  ii.  用户状态表示 Java代码 java.lang.String#length(),  java.lang.Object#hashCode(),  java.util.Collection#size()  f)  名词- 动词过去式 i.  事件回调 Java代码 java.awt.ActionListener#actionPerformed(java.awt.ActionEvent),  javax.servlet.ServletContextListener# contextInitialized javax.servlet.ServletContextEvent)  g)  介词- 名词 以介词- 名词组合的方法, i.  状态转换 Java代码 java.lang.Object#toString(),  java.lang.String#toLowerCase(),  java.util.Collections#asList(T...)  ii.  事件回调 Java代码 javax.jms.MessageListener#onMessage(javax.jms.Message)  h)  形容词- 名词 i.  对象创建 Java代码 javax.xml.parsers.DocumentBuilderFactory#newDocumentBuilder()  ii.  状态转换 Java代码 java.util.Collections#synchronizedList(java.util.List),  java.util.Collections#unmodifiableList(java.util.List extends E>)  iii.  状态表示。 Java代码 java.util.concurrent.BlockingQueue#remainingCapacity()  通过归纳的这些命名模式,相信能够给方法命名带来些灵感。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值