介绍几种有害的Java编码习惯
浏览:2582 类型:软件技术 发布人:WzW 发布日期:2009/6/4 22:21:25
介绍几种有害的Java编码习惯
1.按层次划分包,而不是根据特征或功能划分最常见的划分应用序就是按层次命名包:
com.blah.action 、com.blah.dao 、com.blah.model、com.blah.util
也就是说,把具有同样特征或者功能的类划分到了不同的包里。因为成员的属性对其他成员应该是可见的,这就意味着几乎应用程序中所有的类都是公共的。实际上,这种按层次划分包的方法完全扔掉了Java的包内私有。包内私有应该彻底不使用。现在,包内私有是Java程序语言中设计者的默认作用域。这种包的划分习惯也违反了面向对象编程的核心原则之--尽量保持私有以减少影响,因为这种习惯强迫你必须扩大类的作用域。由于一些奇怪的原因,一些Java组织不赞成这种命名,似乎不公正的。
另一种风格是按特征划分命名:
com.blah.painting 、com.blah.buyer 、com.blah.seller 、com.blah.auction 、com.blah.webmaster 、com.blah.useraccess 、com.blah.util
这里,成员不按行为划分,而是按照不同特征的类划分,每个成员都关联不同的特征。这种方法下包在最初使用是被定义。
例如:在Web应用程序中,“com.blah.painting”包可能由下列成员组成:
◆Painting.java: 一个model对象
◆PaintingDAO.java: 一个数据存取对象Dao
◆PaintingAction.java: 一个控制或者行为对象
◆statements.sql: Dao对象使用的SQl文件
◆view.jsp: Jsp文件
需要特别说是的是,这种划分方法,每一个包都包含所有成员有关的特征文件,而不仅仅是Java源文件。这种按特征划分包的方法,要求在做删除操作时要注意,删除一个特征时要删掉它的整个目录,不能保存在源码中。
这种方法优于按层次划分包的方法,表现在以下几点:
◆包是高内聚的,并且模块化,包与包之间的耦合性被降到最低。
◆代码的自描述性增强. 读者只需看包的名字就对程序有些什么功能或特征有了大概的印象。在《代码大全》中, Steve McConnell 将自描述性的代码比作 "易读的圣杯",来表达它的易读性。
◆把类按照每个特征和功能区分开可以很容易实现分层设计。
◆相关的成员在同一个位置。不需要为了编辑一个相关的成员而去浏览整个源码树。
◆成员的作用域默认是包内私有。只有当另外的包需要访问某个成员的时候,才把它修改为public. (需要注意的是修改一个类为public,并不意味着它的所有类成员都应该改为public。public成员和包内私有(package- private)成员是可以在同一个类里共存的。)
◆删除一个功能或特征只需要简单的删除一个文件夹。
◆每个包内一般只有很少的成员,这样包可以很自然的按照进化式发展。如果包慢慢变的太大,就可以再进行细分,把它重构为两个或者更多新的包,类似于物种进化。而按照层次划分的方式,就没办法进化式发展,重构也不容易。
一些框架推荐使用层层定义包的传统的方式做为包的命名方法:由于使用传统的包命名,开发者总能知道在哪个位置可以找到这些项目,但是为什么避免人们这样做呢?使用另一种按特征定义包的风格,就不需要这种单调的操纵,因此,按特征定义完全超越了任何其它命名约定。约书亚布洛赫在《高效的Java》一书中说到:区分一个设计好坏的唯一重要因素是模块内部隐藏的数据和其它模块中涉及的实现过程的程度。
2.习惯用JavaBeans而不是不可变对象
不可变对象是构造后状态不改变。Scala的主要创造者Martin Odersky最近还称赞过这种不可变对象。在《高效的Java》一书中,Joshua Bloch列举了大量实例支持使用不可变对象,并总结了很多优点。但他的意见,似乎很大程度上被忽略。大多数程序使用JavaBeans来替代不可变对象。JavaBean明显要比不可变对象复杂的多,因为它的巨大的声明空间。粗略的讲,你可以把JavaBean看作是与不可变对象完全相反的对象:它允许最大的可变性。JavaBean常被用来做数据库记录的映射。假如你要从数据库记录集映射一行为对象,不考虑现有的持久化方案和框架,你会将这个对象设计成什么样子?跟javabean相似呢还是完全不一样?我认为会完全不一样,说明如下:
◆它不包含一个无参数构造方法(这一特征是javabean必备的。)。作者认为一个数据库记录的对象如果不包含任何数据是没有意义的。一个数据库表的所有字段都是可选的情况有多少?
◆It would likely not have anything to say about events and listeners.(不太明白作者的意思)
◆它不强迫你用可变的对象。
◆它内部有一个数据验证机制。这样一个验证机制对大多数数据库应用非常重要。(记住对象的第一原则:一个对象应该同时封装数据和对数据的操作。在这种情况下,操作就是验证数据。)
◆数据验证机制可以给最终用户(end user)报错。
按照javabeans的说明,javabeans是用来解决特殊领域的问题:在图形界面程序的设计中充当小部件。说明中绝对没有提到数据库。但现在通常用javabean来做数据库记录的映射。从实际角度来讲,许多被广泛使用的框架要求应用程序使用JavaBeans(或者其它类似的规范)来映射数据库记录。这种滥用不利于编程者了解和使用不可变对象。
3.私有成员排在其它成员的前面类成员的排序没有按照成员的作用域的大小排列,而是把private放在前面。
上一篇:javascript实例:什么是绑定? 下一篇:使用Java读取OpenOffice文档的方法
其它相关文章
您可能会在 Outlook 中收到“Outlook 禁止访问下列具有潜在不安全因素的附件”消息
windows批处理命令输出空白行|windows批处理命令显示空白行
Win7 Cisco VPN Client 442错误解决办法