原型的杂货铺首页

 
[转贴]一个Java程序员的话(1)

 
发表新主题   回复主题    原型的杂货铺首页 -> 软件技术
阅读上一个主题 :: 阅读下一个主题  
作者 正文
Archetype
论坛管理员


加入时间: 2003/02/11
文章: 64
来自: 北京
原币: 107

离线
文章时间: 2003-4-22 周二, 下午2:29    标题: [转贴]一个Java程序员的话(1) 引用回复

发信人: yyh (一笑了之), 信区: Java
标 题: 一个Java程序员的话(1)
发信站: BBS 水木清华站 (Fri Nov 10 15:28:20 2000)

发信人: ywtian (格格巫), 信区: Java
标 题: 一个Java程序员的话(1)
发信站: The unknown SPACE (Thu Nov 9 02:10:44 2000) WWW-POST

前言
想写一本书,一本写给程序员的书,一本能包含了我自己对JAVA的摸索
过程,能让其他的程序员少走一些弯路.
JAVA的确是一种令程序员陷入两难境地的言语, 确切的说是思想. 它
提供了如此丰富的library,让程序员能够很容易的写出功能强大的程
序. 同时它也封装了如此多的细节, 让程序员能够轻易的写出很拙略
的程序. 它所代表的object指向思想设计之初是为了把程序员从纷繁
复杂的编程细节中解放出来,来达到对已有程序的利用. 但是在编程
实际上又要求程序员了解其实现的细节而避免写出因调用已有librar
y不正引起的performance慢的,耗费系统资源多的程序.通常成为一个
优秀的JAVA程序员需要较长时间的经验积累,包括从程序的tuning中,
或从其他有经验的程序员口中,才知道一定功能需要怎样实现,在程序
中需要避免那些问题.但这往往是比较片面的,知其然而不知其所以然
.我想大多数程序员都有类似的经历,举一个简单的例子,下面有三种
对String的累加操作.
① String tmp = ‘a’ + ‘b’ + ‘c’;
② String tmp = null;
tmp+= ‘a’;
tmp+= ‘b’;
tmp+= ‘c’;
③ String tmp = null;
StringBuffer buf = new StringBuffer();
buf.append(‘a’);
buf.append(‘b’);
buf.append(‘c’);
tmp = buf.toString();
有些JAVA程序员在任意的用这三种方法的任一种,无视它们的区别.有
些程序员知道第三种方法好一直在用而不知其为什么好,以至于作为
经验教条的传授给JAVA新手.真正的答案是什么呢?让我们揭开JAVA
String Class和StringBuffer Class
的封装面纱看看它的内部实现.在JAVA中的String Class是一个不可
变类,所有对一个Sting Object的改变都回导致一个新的String
Object的生成.那么对tmp+=a中+符号的实现呢?如果你注意一下Strin
gBuffer的Javadoc会发现.JDK对它的实现是tmp=(new
StringBuffer().append(tmp).append(‘a’)).toSting(); 这样我
们发现②这种方法在隐性生成了一个StringBuffer Object
和一个String Object 再乘3就是六个object 的资源耗费.(还不包括
String Class 和StringBuffer Class内部使用的Char[])而方法③只
用了两个.也许有些程序员会对这些耗费不以为然,的确也是,不过在
一些场景下它会成为perfamence的瓶颈.再回头看看①这种方法,它会
被JAVA编译器编译为tmp=(new
StringBuffer().append(‘a’).append(‘b’).append(‘c’)).to
String();我们发现做的和③方法是同样的事. 写这本书的目的就是
想让一个JAVA程序员知道我在写JAVA程序的一些编程的经验并且明白
为什么.这样的话在写自己的JAVA程序时就会根据场景有意识的活用
这些经验,而不至于陷入另一个极端Max Performance. 我很喜欢Dov
Bulka书中的一段话,turning performance 就象一剂药过多会有副作
用,要用的刚刚好.
ywtian



--
※ 来源:.The unknown SPACE bbs.mit.edu.[FROM: ]
_________________
老夫聊发少年狂,左牵黄,右擎苍。
锦帽貂裘,千骑卷平冈。
欲报倾城随太守,亲射虎,看孙郎。

酒酣胸胆尚开张,鬓微霜,又何妨!
持节云中,何日遣冯唐?
会挽雕弓如满月,西北望,射天狼。

欢迎光临http://archetype.126.com
返回顶端
阅读会员资料 发送站内短信 发送电子邮件 浏览发表者的主页
Archetype
论坛管理员


加入时间: 2003/02/11
文章: 64
来自: 北京
原币: 107

离线
文章时间: 2003-4-22 周二, 下午2:30    标题: [转贴]一个Java程序员的话(2) 引用回复

发信人: yyh (一笑了之), 信区: Java
标 题: 一个Java程序员的话(2)
发信站: BBS 水木清华站 (Fri Nov 10 15:31:50 2000)

发信人: ywtian (格格巫), 信区: Java
标 题: 一个Java程序员的话(2)
发信站: The unknown SPACE (Fri Nov 10 00:16:03 2000) WWW-POST

第一章 用它的时候你了解它多少.
我们大多数人都是从写procedure程序过渡来的,怎么能从我们的proc
edure情结中摆脱出来一直是一件头疼的事. 我们中很多人都是在打
着JAVA的幌子,写着VB的程序,用JAVA只是当它是一种编程语言,而对
它没有更深的认识.
我曾看到过这样一段code是检查从web页面上提交的数据是否是数字.
public boolean isNumeric(String str){
int nLength = str.length();
char chrArray = str.toCharArray();
for(int i=0; i<nLength; i++){
if((chrArray[i] >= 0x30) && (chrArray[i]<= 0x39))
continue;
else
return false;
}
}
按照procedure编程的常识,这样写程序是天经地义的事,但是否忽略
了JAVA言语它自己的强大type检查机制,有没有想想这样的check需要
吗?
再举一个常遇到的例子,我们经常用Hashtable来保存key/value的数
据,下面是一段code从Hashtable中取出key所相对应的value,如果has
htable中没有此key存在,做一些别的操作.
If(table.containsKey(keyName) {
return table.get(keyName);
}
else {
//do something else
}
又是一个perfect的程序,可
是吗?我们实际上做了冗余的操作.Hashtable的containsKey method
会遍历和keyName的hashcode相同的所有key/value pairs. 但get
method也做了同样的事. 我们再来看看它们做了哪些同样的事,①计
算keyName的hashcode ②遍历hashcode相同的key/value
pairs,用equals 来匹配相应的key.
其实要是仔细看看jdk的javadoc的话会发现,在说明hashtable
class的时候,已经给了一段code,变形后用在这里.
value = talbe.get(keyName);
if(value !=null) {
return value;
}
else{
//do something else
}
在hashtable里能把同样的思想用在put method上吗?回答它需要一定
的场景,说道这里我建议我们在用某个class的时候,应要仔细看看它
的文档说明.如果要求去解读source,那么又与object指向的思想相违
了.



--
※ 来源:.The unknown SPACE bbs.mit.edu.[FROM: ]
_________________
老夫聊发少年狂,左牵黄,右擎苍。
锦帽貂裘,千骑卷平冈。
欲报倾城随太守,亲射虎,看孙郎。

酒酣胸胆尚开张,鬓微霜,又何妨!
持节云中,何日遣冯唐?
会挽雕弓如满月,西北望,射天狼。

欢迎光临http://archetype.126.com
返回顶端
阅读会员资料 发送站内短信 发送电子邮件 浏览发表者的主页
Archetype
论坛管理员


加入时间: 2003/02/11
文章: 64
来自: 北京
原币: 107

离线
文章时间: 2003-4-22 周二, 下午2:31    标题: [转贴]一个Java程序员的话(3) 引用回复

发信人: yyh (一笑了之), 信区: Java
标 题: 一个Java程序员的话(3)
发信站: BBS 水木清华站 (Sat Nov 11 14:50:32 2000)


发信人: ywtian (格格巫), 信区: Java
标 题: 一个Java程序员的话(3)
发信站: The unknown SPACE (Fri Nov 10 04:14:37 2000) WWW-POST

看了老大们的Re信,我也比较有劲了.先谢了.有老大问起string
class来,小的不敢不答.
反正我也没有整体结构的想法,呵呵!

第二章 Java中的Idioms
要说起来Java也很有意思,它给软件开发中从头到尾都套上了大大小
小的框框—pattern.
从architecture到programming. 这的确又是JAVA重用思想在设计上
的体现.这一章主要想谈谈programming中的pattern—idioms.
首先就想说说JAVA中最特殊,最常用的String Class.
它就是Immutable value pattern在JDK中的一个典型例子.在程序开
发中,我们常常会遇到这样一些data
object,我们关心的是它的content 而不是它的identity.
拿一个string object来说,我们只关心它里面有什么character,而不
管它是object A或是B. 对于这样一些object如果它的state是可变的
,那么我们在编程是就会有各种各样的麻烦.先是你必须保证thread
safe,这样你需要同步化. 再有你必须时时刻刻提防这alias
problem,因为JAVA的object传递是reference的传递(在这我想澄清两
点①基本型是value传递的②还有在RMI调用中object也可能是value
传递,这在和面的章节中在详细介绍) 这样你要对每次引用做clone而
保证不影响原来的object的值.正是由于这么多的麻烦,我们干脆让这
个object的state不可变,这就引入了Immutable value pattern.既然
它现在变成Immutable,那么thread safe也好alias problem也好,都
解决了.还有一点又注意,你要让你的这个class 为final,不然被继承
一把,重载了你的method还是比较危险.还有就是要提供很多construc
t了.
用Immutable value pattern的class都会存在一个问题,生成含
有比较复杂的content的object时,很不方便.试想一下如果JDK里少了
StringBuffer class和符号+,会出现什么情况.你想得到一个经过运
算得到的string object,需要都写在construct里,因为只有它是唯一
的接口.所以配合着Immutable value pattern还有两种pattern :
Class Factory Methods和Mutable Companion而StringBuffer
class正是String class的一个Mutable Companion.

待续.....


--
※ 来源:.The unknown SPACE bbs.mit.edu.[FROM: ]
_________________
老夫聊发少年狂,左牵黄,右擎苍。
锦帽貂裘,千骑卷平冈。
欲报倾城随太守,亲射虎,看孙郎。

酒酣胸胆尚开张,鬓微霜,又何妨!
持节云中,何日遣冯唐?
会挽雕弓如满月,西北望,射天狼。

欢迎光临http://archetype.126.com
返回顶端
阅读会员资料 发送站内短信 发送电子邮件 浏览发表者的主页
显示文章:   
发表新主题   回复主题    原型的杂货铺首页 -> 软件技术 所有的时间均为 北京时间
1页,共1

 
论坛转跳:  
不能在本论坛发表新主题
不能在本论坛回复主题
不能在本论坛编辑自己的文章
不能在本论坛删除自己的文章
不能在本论坛发表投票
不能在这个论坛添加附件
可以在这个论坛下载文件


Powered by phpBB 2.0.3 © 2001, 2002 phpBB Group
中文phpBB开发小组提供技术支持