- 浏览: 119076 次
- 性别:
- 来自: 宁波
文章分类
最新评论
1.对局部变量(local variables),字段(fields),参数(method arguments)这三种变量的命名没有区分,造成了代码的阅读困难,增加了代码的维护成本。 作者举了个例子: 在这个方法中,arg直接用argument的缩写,虽然大家一看就知道这是参数了,但这种命名方式却丢失了参数代表的对象本身的含义。大家知道这是参数,却不知道这是什么参数。如果方法的参数多一点,都按照arg1,arg2这样的方式命名,阅读代码的时候很头疼。另外两个字段变量,start和end,突然凭空而出,想一下才知道这应该是字段。当然,这个方法很短,造成的困难还不大,如果这个方法比较长的话,突然看到start和end两个变量,一般会先在前面找一下是不是局部变量,然后才能确定是类的字段变量。 这个问题貌似微不足道,但为什么要让代码阅读者花费额外时间在这些琐碎的问题上呢?如果有个方案能让代码阅读者一目了然的明白变量是那种变量,为什么不采用呢?就如同Steve McConnell在 《代码大全》中说的:"让人费神去琢磨神秘杀人凶手这没有问题,但你不需要琢磨程序代码,代码是用来阅读的。" 修正后的代码样式应该是: 这样的代码看起来一目了然,如果你没有一目了然,说明还是习惯问题,习惯养成了就好了。 不过作者的方案里,给类字段变量前面加 f 前缀,如果用代码生成工具生成get,set方法是会比较麻烦。get,set方法中我们不希望出现个f。不过这个问题可以用修改代码生成工具的方式解决。如果这个习惯普遍被java界接受,这些应该都不成问题了。 作者引用了一句名言: "By relieving the brain of all unnecessary work, a good notation sets it free to concentrate on more advanced problems, and in effect increases the mental power of the race. Before the introduction of the Arabic notation, multiplication was difficult, and the division even of integers called into play the highest mathematical faculties. Probably nothing in the modern world would have more astonished a Greek mathematician than to learn that ... a large proportion of the population of Western Europe could perform the operation of division for the largest numbers. This fact would have seemed to him a sheer impossibility ... Our modern power of easy reckoning with decimal fractions is the almost miraculous result of the gradual discovery of a perfect notation." 个人理解大意为: 把大脑从不必需的工作中解放出来,一个好的记号法可以让大脑去关注更高级的问题,提升民族的整体智力。在阿拉伯数字记号法被介绍进来以前,乘法是非常困难的,计算整除也需要非常高的数学才能。一个古希腊的数学家可能非常诧异于西欧的大多数人口可以计算很大数字的除法。这个事实对他来说似乎是不可能的。我们现代人很容易用小数算帐的能力几乎可以说是由逐渐探索出的一套完美的计数法而造成的奇迹。 2.包(package)的命名和划分按照行为和层次划分(package-by-layer)而不是根据特征和功能划分(package-by-feature) 这个问题在我刚学java的时候就遇到了,在看了众多的网上开源程序后,我也慢慢习惯了按层次命名包。 作者举了个例子: 我们已经习惯了按照层次分类或者叫按照行为分类,model一个包,dao一个包,service一个包,action一个包。这样就把具有同样特征或者功能的类划分到了不同的包里。这样的习惯,把java的包内私有(package-private)这个作用域给完全扔掉了,而包内私有是java的默认作用域。(ps:我学java来好像很少用过java的包内私有这个作用域,汗一个) 这中包的划分习惯也违反了面向对象编程的核心原则之--尽量保持私有以减少影响,因为这种习惯强迫你必须扩大类的作用域. 下面的包命名方式是按照特征划分命名: 举个例子,在一个web应用中, 值得注意的是这种情况下,包里包含的不仅仅是java源码文件,同时也包含其他与该特征相关的文件。这点上好像违反大多数java程序员的习惯,并且如果要打包为jar好像也不方便,真实环境中如何应用,有没有别的麻烦,还要待实践一下。 作者列举了这种包划分方式的优点: 包是高内聚的,并且模块化,包与包之间的耦合性被降到最低。 代码的自文档性(或自描述性 self-documenting)增强. 读者只需看包的名字就对程序有些什么功能或特征有了大概的印象。在《代码大全》中, Steve McConnell 将自文档化(self-documenting)的代码比作 "the Holy Grail of legibility."(不知道怎么翻译) 把类按照每个特征和功能区分开可以很容易实现分层设计。 相关的成员在同一个位置。不需要为了编辑一个相关的成员而去浏览整个源码树。 成员的作用域默认是包内私有。只有当另外的包需要访问某个成员的时候,才把它修改为public. (需要注意的是修改一个类为public,并不意味着它的所有类成员都应该改为public。public成员和包内私有(package-private)成员是可以在同一个类里共存的。) 作者引用了一句Effective Java中的名言: "The single most important factor that distinguishes a well-designed module from a poorly designed one is the degree to which the module hides its internal data and other implementation details from other modules." 3.习惯用JavaBeans而不是不可变对象 按照javabeans的说明书(JavaBeans specification ),javabeans是用来解决特殊领域的问题:在图形界面程序的设计中充当小部件。但现在通常用javabean来做数据库记录的映射。作者反对javabean的这种用法。他提出了一个问题: 假如你要从数据库记录集映射一行为对象,不考虑现有的持久化方案和框架,你会将这个对象设计成什么样子?跟javabean相似呢还是完全不一样? 作者倾向于设计一个完全不一样的,他列举他的设计的几个特点: It would likely not have anything to say about events and listeners.(不太明白作者的意思) 它内部有一个数据验证机制。这样一个验证机制对大多数数据库应用非常重要。(记住对象的第一原则:一个对象应该同时封装数据和对数据的操作。在这种情况下,操作就是验证数据。) 数据验证机制可以给最终用户(end user)报错。 作者不满于现有的数据库持久化框架滥用javabean,提出了几个观点,但没有具体的代码演示。据我的理解,作者的意思和前一段时间javaeye上争论的充血模型和贫血模型有点类似。 4.类成员的排序没有按照成员的作用域(scope) 的大小从大到小排列,而是喜欢把private放在前面。 作者举了一个常见的类样式: 这种方式将private变量放在最前面。作者认为应该倒过来,把private变量的申明放在最后面。 因为人们认识一个事物的通常过程都是从一般到特殊,从抽象层次来说,是从高到底的认识过程。如果你倒过来的话,就不能从整体上把握事物,也不能抓住事物的本质,只能在一堆具体的片段事实中迷失。 整体的抽象允许你忽略细节。抽象的层次越高,你可以忽略越多的细节。读者阅读一个类时可以忽略的细节越多他会越高兴。脑袋里填充太多的细节是痛苦的,所以细节越少越好。因此,将private成员方在最后会显得更富有同情心,因为这样阻止了不必要的细节显露给读者。 原来C++程序的习惯也是把private成员放在最开始。然而,C++社区迅速的认识到这是一个有害的规范,这个规范现在已经被修正。(参看 a typical C++ style guide ) 注意:public 接口应该放在class的最开始,其次是protected成员,最后是private成员。原因是: 把接口放在开始是非常有意义的。把实现部分,private 片段,放在开始是一个历史遗留问题。最后还是要反复强调一下,一个类的接口的重要性超过实现细节。 将私有成员放在类的开始是一个等待打破的怀习惯,它似乎是sun早期的编码规范造成的。 将代码按照javadoc的顺序编排是非常好的:首先是构造方法,然后是非私有方法,最后是私有字段和方法。这样读者阅读的时候很自然的从抽象层次的高向低运动。 作者的这个观点确实很有道理,以前也没仔细思考过。可以考虑给IDE做个重构插件,专门按照这种排序格式化代码。
作者提出了解决方案:
-- Alfred North Whitehead, An Introduction To Mathematics
com.blah.action
com.blah.dao
com.blah.model
com.blah.util
com.blah.painting
com.blah.buyer
com.blah.seller
com.blah.auction
com.blah.webmaster
com.blah.useraccess
com.blah.util
com.blah.painting包可能包含下面的成员:
-- Joshua Bloch, Effective Java
发表评论
-
一次Java垃圾收集调优实战
2011-01-04 21:45 1441 资料 JDK5.0垃圾收集优化之--Don't ... -
架构师必读书籍
2011-01-04 21:40 476年又过年,去年在写在译的书又长出了一茬,又是时候订一份今 ... -
工作流相关
2011-01-04 10:09 826微内核工作流引擎体系架构与部分解决方案参考 -
jsp/servlet相关
2010-12-30 20:22 1153Servlet/JSP学习笔记(1)-tomcat和eclip ... -
memcached相关
2010-12-30 20:03 874memcached完全剖析-1.memcached基础: h ... -
Hibernate 和 memcached 的集成问题
2010-12-30 19:53 1061做过的项目中Hibernate都是直接采用ehcache做为缓 ... -
hibernate-memcached--在Hibernate中使用Memcached作为一个二级分布式缓存
2010-12-30 19:49 1424hibernate-memcached--在Hiberna ... -
数据库推荐
2010-12-30 19:09 756基于mysql的数据库集群系统的实现: http://hi. ... -
hadoop推荐
2010-12-30 15:27 873CSDN hadoop专题 http://subject. ... -
java与内存文章推荐
2010-12-30 10:58 767内存详解:理解jvm如何使用windows和linux上的内存 ... -
lucene相关
2010-12-29 20:12 797深入 Lucene 索引机制 http://www.i ... -
String的理解
2010-12-29 15:49 754本文是对http://www.iteye.com/topic/ ... -
Tomcat虚拟主机及Root Context配置
2010-12-12 21:44 10151.虚拟主机 对一个Tomcat,可以配置多台虚拟主机。 ... -
转载来的过来经典java网站
2010-12-04 22:30 802一个朋友给我的希望大家喜欢,自己留个备份,没事逛逛!!http ... -
继续Open Session In View
2010-12-04 22:26 1019转自:http://www.iteye.com/top ... -
j2ee中的事务浅谈(转)
2010-12-04 21:50 731事务是企业应用开发中的重要概念,对于部分 Web 应用,事务也 ... -
Tomcat6 使用 NIO
2010-12-04 21:49 915首先,何谓nio? ... -
深入探讨 Java 类加载器2
2010-12-04 21:44 596开发自己的类加载器 我的天,爱死这作者了!!(转载 ... -
通过 Tomcat Advanced I/O 获得高性能的 Ajax
2010-12-04 21:19 736转自:http://www.ibm.com/develop ... -
Servlet 3.0 实战:异步 Servlet 与 Comet 风格应用程序
2010-12-04 21:16 801转自http://www.ibm.com/develo ...
相关推荐
四个有害的Java编码习惯 程序中的编码风格让我们的编程工作变得轻松,特别是程序维护员,他们要经常阅读其他人编写的程序编码,这一点尤其突出。编码规范从根本上解决了程序维护员的难题;规范的编码阅读和理解起来...
以下是对标题和描述中提到的四个有害Java编程习惯的详细解释和改进建议: 1. **变量命名没有区分** 不同类型的变量(局域变量、参数、字段)使用相同的命名约定,使得阅读代码时难以快速辨别它们的用途。建议采用...
### HIBERNATE - 符合Java习惯的关系数据库持久化:深入解析与实践 #### 一、概述 Hibernate是Java领域内最受欢迎的对象关系映射(ORM)框架之一,它简化了Java应用程序与关系型数据库之间的交互,使得开发人员...
“hibernate-符合Java习惯的关系数据库持久化”这一标题明确指出了我们要探讨的主题——Hibernate,这是一个非常流行的Java ORM(对象关系映射)框架,它使得Java开发者能够按照面向对象的方式来操作数据库,而无需...
这个过程涉及到将数字转换成符合人类阅读习惯的货币格式,包括添加逗号分隔符,处理负数,以及在必要时添加前导零。本文将深入探讨如何实现这一功能,并结合标签"源码"和"工具",给出一个实用的解决方案。 首先,...
在Java中,我们可以创建一个映射表,存储阿拉伯数字与中文数字的对应关系,然后编写一个方法来实现转换。以下是一个简单的实现: ```java public class NumberToChinese { private static final String[] units = ...
而习惯于把汽车当作一个整体来认识。 包含通用对象类的库叫作类库。 2.2.7 多态型 面向对象程序的最后一个概念是多态性。凭借多态性,你可以创建一个新的对象,它具 有与基对象相同的功能,但是这些功能...
这个程序的核心概念源于史蒂芬·柯维在其著作《高效能人士的七个习惯》中提出的“四象限法则”,这四个象限分别是:重要且紧急、重要但不紧急、不重要但紧急、不重要且不紧急。 在程序设计上,用户可以通过点击不同...
- 文件夹`szys-master`可能代表一个Git仓库,表明这个课程设计遵循了良好的版本控制习惯,每个版本的变化可以通过提交历史追踪。 通过以上步骤,我们可以构建一个功能完备的四则运算题目生成器,它不仅能满足基本...
`SimpleDateFormat`通过接受一个`Locale`对象来格式化日期时,会根据该区域的习惯来显示日期,如星期、月份的名称等。 示例代码: ```java SimpleDateFormat simpleFormat = DateFormat.getDateInstance(DateFormat...
exe4j是一个Java到Windows可执行文件的转换器,它允许开发者将Java应用程序打包成.exe格式,以便在没有Java环境的机器上运行。exe4j提供了图形界面和命令行两种方式来操作,便于不同需求的开发者使用。 二、转换...
实验报告的主题是“JAVA实验报告四数据库编程”,主要目的是让学生掌握基本的数据库管理系统(DBMS)使用、理解Java数据库连接(JDBC)的概念,并通过JDBC-ODBC桥接技术来开发实际的数据库系统。实验内容包括设计和...
### 第一个Java程序知识点解析 #### 一、Java程序的基础结构与HelloWorld示例 - **基础结构**:Java程序的基础单位是类(`class`),每个类中至少包含一个主函数(`main` 方法)。Java是一种面向对象的语言,因此...
2. **Applet生命周期**:Java Applet有四个主要状态:装载(loading)、初始化(initializing)、启动(starting)和停止(stopping)。在用户访问包含Applet的网页时,这些生命周期方法会被调用,用于资源的分配和...
总结来说,Java金额数字转中文工具类是一个实用且高效的工具,它通过简单的接口封装,实现了数字到汉字的转换。开发者可以根据需要调整和扩展这一工具类,以适应不同的应用环境和需求。通过对这一工具类的学习和应用...
JavaScript Smoothing, 简称 JSmooth,是一个实用的开源工具,主要功能是将Java的JAR文件转换为可执行的Windows EXE文件。这个工具对于开发者来说非常有用,因为它可以方便地让Java应用程序在没有Java运行环境的...
JSON 基于 JavaScript 的一个子集,但 JSON 是独立于语言的文本格式,同时它使用了类似于 C 语言家族的习惯(包括 C、C++、C#、Java、JavaScript、Perl、Python 等许多语言)。 **2. Java 对象** Java 是一种面向...
本文将深入探讨四个流行的Java解析库:Fastjson、Dom4j、Jdom和Jsoup,它们各自具有独特的优势和适用场景。 首先,Fastjson是阿里巴巴开源的一个高性能的JSON库。它提供了极简的API,使得在Java对象和JSON数据之间...
《Thinking in Java》是Bruce Eckel的经典之作,第四版更是深受程序员喜爱的Java学习资源。这本书深入浅出地讲解了Java编程语言的核心概念和技术,包括面向对象编程、数据结构、网络编程、多线程等内容。提供的习题...
* 文件注释:每个 Java 源文件都应包含一个单一的公共类或接口,私有类和接口可以与公共类放入同一个源文件。 * 包和引入语句:在多数 Java 源文件中,第一个非注释行是包语句,之后可以跟引入语句。 * 类或接口注释...