分享
 
 
 

良好的Java风格:第一部分

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

良好的Java风格:第一部分

作者:Thornton Rose

日期:2001年2月22日

翻译:ant21

简介

多年来,作为一名软件开发者和顾问,我看到过各种程序语言编写的大量代码。其中有书写优雅的,也有书写丑陋的,不幸的是很多代码都属于后者。我希望说服你和我的开发伙伴我们应该在代码风格上给予更多的关注,就像我们关注用户界面和应用程序的其它部分那样。这一系列由两部分组成,在第一部分中,我将解释为什么我们应该关心代码看起来到底是什么样子,并向你展示良好Java风格的一些基本要素。

为什么风格如此重要

虽然Java是用来写程序而不是写散文的,但它也是用来表达思想和想法的。而且,除了传递信息,这些思想和想法也必须确实在解决一些问题。也许你会顾虑好的风格或许会像是在浪费时间,但它可以让我们在代码中表达的思想和想法格外的清晰。

这里是使用良好风格的一些理由[来自"Java Code Conventions," Sun Microsystems]:

一个软件产品一生80%的花费是在维护上。

任何软件都几乎不可能一生都由软件的原作者来维护。

好的风格能够提高软件代码的可维护性。

如果软件还附带源码的话,那它应该像产品的其它部分那样结构良好,清晰,专业。

以良好的风格编写代码还有下面这些好处:

提高代码的可阅读性,连贯性和一致性,这样使代码容易理解和维护。

易于跟踪和调试,因为代码是清晰和连贯的。

易于从你或别的程序员停止的地方继续编写代码,特别是经过较长的一段时间以后。

提高代码指南的价值,因为参与者可以更加集中注意力去了解代码正在做什么。

一般原则

以良好的风格编写Java并不困难,但确实需要注意细节。这里是一些应该遵守的一般原则:

使代码清晰并易于阅读。

使代码一致。

使用明显的标识符。

有逻辑地组织文件和类。

每个文件只有一个类(不包括内部类)。

最大行宽在80-90个字符之间。

使用空格和(或)其它易于判断的分隔符。

缩进使用空格而不是制表符。

制表符 vs. 空格

制表符 vs. 空格是一个有关编写代码的严谨问题,我并不想让你认为只有一种正确方式。我赞成使用空格是因为它确保我的代码在我的编辑器里和在你的编辑器里看起来一样,反之亦然。如果你感觉使用空格而不是制表符“就是不对”,那么就用制表符吧。

大括号和缩进

缩进风格(参看,Raymond, "Indent Style")或者大括号("{" 和 "}")和相关的代码缩进是另一个关于编写代码的严谨问题。像Java这种C风格的编程语言,有很多种缩进风格,并且我也不想说它们其中的哪一种就更好一些。在这篇文章的大部分示例代码中,我使用人们常说的K&R风格。如果你不喜欢K&R,那就用另一种风格好了。

注释

你可以有两种类型的注释放到你的Java代码中:Javadoc注释(也叫文档注释)和实现注释。Javadoc注释可以用javadoc工具提取并产生API文档。实现注释用来解释代码的“如何”和“为什么”。使用下面的原则来注释你的Java代码。

在任何允许使用Javadoc注释的地方使用Javadoc注释(最起码用在类和方法上)。

使用块注释而不是行尾(拖尾)注释,除了一些特殊情况,比如变量的声明。

而且,要记住好的注释总是有帮助的;而坏的注释却是令人讨厌的。

例1. 坏的注释风格。

// applyRotAscii() -- Apply ASCII ROT

private void applyRotAscii(){

try{

int rotLength = java/lang/Integer.java.html" target="_blank">Integer.parseInt(rotationLengthField.getText().trim()); // get rot len

RotAscii cipher = new RotAscii(rotLength); // new cipher

textArea.setText(cipher.transform(textArea.getText())); // transform

}catch(java/lang/Exception.java.html" target="_blank">Exception ex){

/* Show exception */

ExceptionDialog.show(this, "Invalid rotation length: ", ex); }

}

例2. 好的注释风格。

/**

* Apply the ASCII rotation cipher to the user’s text. The length is retrieved

* from the rotation length field, and the user’s text is retrieved from the

* text area.

*

* @author Thornton Rose

*/

private void applyRotAscii() {

int rotLength = 0; // rotation length

RotAscii cipher = null; // ASCII rotation cipher

try {

// Get rotation length field and convert to integer.

rotLength = java/lang/Integer.java.html" target="_blank">Integer.parseInt(rotationLengthField.getText().trim());

// Create ASCII rotation cipher and transform the user’s text with it.

cipher = new RotAscii(rotLength);

textArea.setText(cipher.transform(textArea.getText()));

} catch(java/lang/Exception.java.html" target="_blank">Exception ex) {

// Report the exception to the user.

ExceptionDialog.show(this, "Invalid rotation length: ", ex);

}

}

块和声明

使用下面的原则来写块和声明:

每行只放置一个声明。

控制声明的时候总是使用大括号(比如,’if’)。

考虑在块结束的地方做注释(比如,} //end if),特别是那些长的或者嵌套的块。

把各种变量的声明放在块的开头。

总是初始化变量。

如果想做完美主义者,左对齐变量名。

switch块中缩进case子句。

操作符的前后分别加上空格。

使用if,for,或者while的时候,在"("前面加上空格。

在表达式中使用空格和圆括号以提高可阅读性。

’for’循环中的变量在应用“把各种变量的声明放在块的开头”的原则时是个例外。循环变量应该在for语句的初始化部分进行声明,比如,for(int i = 0; ...)

在块结束的地方放置一个声明有助于你捕捉到意外删除的结束大括号。有时候,在一个巨大的文件中要想找到它们真的会把你逼疯的。

例3. 坏的块风格。

try{

for(int i=0;i<5;i++){

...

}

int threshold=calculateThreshold();

float variance=(threshold*2.8)-1;

int c=0;

if (threshold<=15) c=calculateCoefficient();

switch(c){

case 1: setCeiling(c*2); break;

case 2: setCeiling(c*3); break;

else: freakOut();

}

}catch(java/lang/Exception.java.html" target="_blank">Exception ex){ ... }

例4. 好的块风格。

try {

int threshold = 0;

float variance = 0.0;

int coefficient = 0;

// Prepare 5 cycles.

for (int i = 0; i < 5; i ++){

prepareCycle(i);

}

// Calculate the threshold and variance.

threshold = calculateThreshold();

variance = (threshold * 2.8) - 1;

// If the threshold is less than the maximum, calculate the coefficient.

// Otherwise, throw an exception.

if (threshold <= MAX_THRESHOLD) {

coefficient = calculateCoefficient();

} else {

throw new java/lang/RuntimeException.java.html" target="_blank">RuntimeException("Threshold exceeded!");

}

// Set the ceiling based on the coefficient.

switch (coefficient) {

case 1:

setCeiling(coefficient * 2);

break;

case 2:

setCeiling(coefficient * 3);

break;

else:

freakOut();

} // end switch

} catch(java/lang/Exception.java.html" target="_blank">Exception ex) {

...

} // end try

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有