原文链接: http://www.javaworld.com/javaworld/jw-07-2008/jw-07-harmful-idioms.html?page=1
Four harmful Java idioms, and how to fix them
1. 区分fields, local variables and method arguments.
作者提议:
* Method arguments are prefixed with a
* Fields are prefixed with f
* Local variables have no prefix at all
例子:
public boolean equals (Object aOther) {
if (! (aOther instanceof Range)) return false;
Range other = (Range) aOther;
return fStart.equals(other.fStart) && fEnd.equals(other.fEnd);
}
这样可以增加code的可读性。尤其是在method或者class比较长的时候。
(其实在比较现代的IDE里,这三种变量是可以给以不同的语法着色的。)
2. 用package-by-feature 来代替package-by-layer。
A common way of dividing up an application is package-by-layer:
* com.blah.action
* com.blah.dao
* com.blah.model
* com.blah.util
An alternate style is package-by-feature:
* com.blah.painting
* com.blah.buyer
* com.blah.seller
* com.blah.auction
* com.blah.webmaster
* com.blah.useraccess
* com.blah.util
也就是说,把package理解为最高级别的抽象,class都是这个抽象的不同层次的实现。
把一个抽象的实现组织在一起也就理所当然了。这个package里包含需要实现这个feature的一切资源,不仅仅是Java source code。
原文是这么说的:
Here, items are not grouped according to their behavioral style. Instead, the behavior of individual classes is treated as an implementation detail, and classes are grouped according to the highest possible level of abstraction -- the level of the feature -- wherein all items related to a feature (and only to that feature) reside in one and the same package.
还提到了一个检验的方法:“删除测试” -- 移除一个feature应该只需要删除一个package。
In package-by-feature, the ideal is to pass the deletion test: you should be able to delete a feature by deleting a single directory, without leaving behind any cruft.
For example, in a Web application, the com.blah.painting package might consist of these items:
* Painting.java: A model object
* PaintingDAO.java: A data access object
* PaintingAction.java: A controller or action object
* statements.sql: The SQL statements used by the DAO
* view.jsp: The JSP used to render the result to the user
3. 用immutable objects代替JavaBeans。
其实,JavaBeans的定义已将其应用限制在一个非常特殊的领域--GUI widgets。
The JavaBeans specification was created for a very particular problem domain: that of manipulating graphical widgets at design time.
作者在文章后的问答中指出:
通常,JavaBeans适合于desktop apps,而Immutable objects适合于web apps。
(Immutable Model Objects seem to be fairly natural for web apps, but less natural for desktop apps.)
Immutables are less natural for desktop apps, because the user often needs to edit many items at once, and have all those edits applied en masse. If you need to apply edits all at once, then yes, using immutables is indeed a problem.
But for web apps, immutable Model Objects form a more natural default style.
在web apps中,Server发送一个object给client用于显示,然后client修改之后生成一个新的object并返回给Server用来更新。
Q1: Isnt the expense of creating so many new objects (a new object created for every field value change) offsetting the gains of immutability in this case?
A1: For the case of a web app, the cost of creating a new Model Object for each request is usually trivial.
Q2: Is there a better way of applying immutability in this situation?
A2: To get a better understanding, you could down load the free example application that comes with the web4j tool that I built.
http://www.web4j.com/Download.jsp
4. 把Private members放到后面。
通常,private members被放在class的前面。例如:
ublic class OilWell implements EnergySource {
private Long id;
private String name;
private String location;
private Date discoveryDate;
private Long totalReserves;
private Long productionToDate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
//..elided
}
作者指出:placing private items last, not first, seems to show more compassion for the reader.
Java之所以采用private在前面的方式,是因为早先的C++是这样的。不过C++社区已经更正了这个问题,而Java社区却没有及时更正。很大程度上是因为SUN发布的Coding Conventions缺乏管理了,而且SUN内部也不使用这个。
Ordering is: public, protected, private。
最合理的组织方式应该是:
constructors放在最前面,然后是non-private methods,最后是private fields和private methods。
It seems best to arrange code to imitate the same order used by Javadoc: first the constructors, then non-private methods, and finally private fields and methods. That's the only style in which the reader moves naturally from a higher to a lower level of abstraction.
分享到:
相关推荐
【标题】"java读书笔记笔记笔记笔记笔记笔记" 暗示了这是一份关于Java编程语言的学习笔记,可能包含了作者在阅读Java相关书籍时所做的重要记录和理解。笔记通常涵盖了语言的基础概念、核心特性、类与对象、内存管理...
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
java虚拟机读书笔记,主要描述阅读Java虚拟机核心技术的描述。
本项目名为"Java笔记桌面程序",它是由一个热衷于编程的开发者为解决其所在公司无法使用网络笔记客户端的问题而自创的。这个程序采用Java语言编写,充分体现了Java的跨平台特性,可以在多种操作系统上运行,包括...
### Java基础知识概述 #### 1. 前言 Java是一种广泛使用的面向对象的编程语言,因其跨平台性、安全性和强大的功能而受到欢迎。Java的设计理念是“一次编写,到处运行”,这意味着编写的Java程序可以在任何安装了...
java笔记java笔记java笔记java笔记java笔记java笔记java笔记
通过阅读《Java游戏编程读书笔记》这本书,你可以深入了解这些概念并学习如何将它们应用到实际项目中。文档中的内容可能涵盖了Java游戏开发的基本原理、代码示例、最佳实践以及常见问题的解决方案。通过深入学习和...
这份"java笔记java笔试题 java面试题"的资源无疑是准备Java程序员的笔试和面试时的重要参考资料。以下是一些关键的Java知识点,这些内容可能会在笔记或面试中出现: 1. **Java基础**:Java的基础语法包括数据类型...
### Java编程思想读书笔记 #### 一、Java与C++的区别及内存管理 在学习Java的过程中,我们常常会拿它与C++进行比较。这两门语言虽然有着相似之处,但也有许多不同点。 1. **内存管理:** - C++提供了更为底层的...
通过阅读《王者归来之Thinking in Java读书笔记》,你可以系统地掌握Java编程的核心知识,理解编程思想,提高解决问题的能力。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。这本书不仅提供了理论知识,还有...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。它的设计目标是具有简单性、面向对象、健壮性、安全性、可移植性、高性能和多线程等特性。Java的学习涵盖了...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
4. 多线程:在10多线程.md中,介绍了如何创建和管理Java线程,包括Thread类、Runnable接口,以及同步机制如synchronized关键字、wait()、notify()和notifyAll()方法。多线程技术是实现并发执行的关键,有助于提高...
"Effective Java读书笔记" Effective Java是一本关于Java编程语言的经典...Effective Java读书笔记总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点,为Java开发者提供了有价值的参考。
"Java超强笔记"正是一份专为新手准备的学习资源,它全面涵盖了从Java环境的搭建到软件设计的各种概念,旨在提供一个易读且系统的学习路径。 首先,笔记可能会从Java的起源和发展开始介绍,让你了解这门语言的历史...
12. **模块系统(Java 9及以上版本)**:Java 9引入了模块系统,提高了程序的封装性和可维护性,理解如何创建和使用模块是现代Java开发的一部分。 在"java笔记javajava"这个压缩包中,可能包含了上述各个知识点的...
学生读书笔记共享-学生读书笔记共享系统-学生读书笔记共享系统源码-学生读书笔记共享管理系统-学生读书笔记共享管理系统java代码-学生读书笔记共享系统设计与实现-基于springboot的学生读书笔记共享系统-基于Web的...
从标题“java核心思想读书笔记”和描述可以看出,这份资料是作者结合《Java核心思想》一书和其他网络资源整理而成,适合不同水平的Java学习者,特别是初学者和有经验的工程师。 1. **Java的设计目标** - 不同于...