??xml version="1.0" encoding="utf-8" standalone="yes"?> 陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?br />(zhn)可以通过其博客了解更多信息和文章Q?a target="_blank" onfocus="this.blur()">http://www.ChenGang.com.cn
]]>
前段旉把一个界面框架完成了Q今天基于这个框架开发一个小模块Q在q里把这个模块设计的全过E记录下来,希望大家讨论q指正?br />
一、v?br />
公司交给我一个Q务,为测试员写一个手机模拟界面,以方便她们的手机短信试。过d们都是用MC4J直接调用公司服务器的MBean服务来模拟进行测试,以验证我们整个系l^台。这U测试主要是查收发短信是否正常,而我的要做的工作是Q让她们在测试的时候更方便更直观?br />
二、需?br />
我和试员陈MMQ也是软g的用者)U定了一个时_(d)大家一h讨论q个软g的需求?br />
1、首先,我大概了解了一下她们的试工作Q知道我要做个什么东东?br />
2、然后我回去思考了一下,再次扑֥详细了解其测试的具体步骤Qƈ在一张白U怸以UML用例囄方式Q记录下需求的功能。用例是什么?用例是需求,是你的软g应该h的功能,当然用例囑֏是概括性的对功能进行了描述?br />
3、最后,我坐在我的电(sh)脑前开始用MagicDraw UML来画用例图(我不喜欢用RoseQ那玩意太笨重了Q界面友好性也不好Q。在ȝ例图的时候,我发C一些隐含的功能Q这些是陈MM在和我做需求时没有考虑到的Q注Q开发者应该ؓ(f)用户挖掘隐含需求)。我和陈MM一一定了这些我新发现的需求,最后得到如下的用例图?br />
Q?Q手机前台测试操作的用例图(说明Qinclude是指某用例包?include)子用例)
Q?Q后台管?br />
三、界面设?br />
接下来是界面设计。既然是手机模拟Q我很自然就拿我的motorola手机的操作界面来做参考。不q这里应该注意到Q手机操作环境和?sh)脑操作环境不尽相同Q比如说?sh)脑有鼠标,q有键盘可以输入文字Q,所以没有必要唯妙唯肖的完全模枋Q还是以使用者操作方便ؓ(f)丅R?br />
界面设计是很重要的一步,不要一上来写E序Q一定要先做到心中有个大概,否则q工的可能性就很大。而且Q把界面拿出来给客户看,客户也就能做到心中有敎ͼq能早提出一些新需求和意见来。千万不要等到Y件做完了再拿l客L(fng)Q到时客L(fng)了如果要修改Q那做太多白费工了?br />
׃软g界面相对单,陈Q基本没有提修改意见Q但q不是个好兆头。不q极限编E就是要拥抱变化不是^_^。咱不怕她改,只要大致的界面她能定下来p了?br />
界面我喜Ƣ用Visio来画Q当然也听说有h喜欢用)Q来快速构建界面原型的Q看个h喜好了。整个界面如下:(x)
q个是后台管理界?br />
四、类?br />
cd反映了Y件的数据模型。在设计数据模型Q我参考了界面设计囑֒用例图,扑և一个个的类。然后参照用例图的一个个功能Q设计出了各cȝ属性和Ҏ(gu)。设计初始的cd当然不可能很详细Q但臛_应该看到个大概。有错误不要紧,后期可以慢慢修正Q但大体关系q定下来了?br />
NeilQ公司EQ_(d)Q一?0岁左右的真正的资q序员Q说Q看一个Y件的设计主要看两个类Q类囑֒时序图。类囄定了软g数据模型的静态关型,时序囑ֈ是数据模型的动态关pR?br />
cd如下Q看英文大致可以知道c/属性/Ҏ(gu)的含义和作用了,׃一一介绍了?br />
五、时序图
时序图是本文最后一个图Q时序图表明了用例图中各功能的实现方案,同时也反应了cd中各cȝ交互关系。以后程序的逻辑和时序图基本一致。不q,有些Z(x)ȝ得很详细的时序图Q详l到都快赶上伪代码别了Q我觉得q没必要。我把时序图看做反映自己思\的大概过E,所以也q个大概?br />
我认为时序图要简z易懂,q样以后你的后l护者,拿到q个软g的时序图Q当然也包括用例图、类图)Q就能明白你的大概设计思\。另外,L序图也能整理自己的思\Q同时还可以对类囄设计q行验证。在画这个时序图的过E中Q我q正了在类图中的几处考虑不周的地斏V?br />
ȝQ时序图可以Q1Q整理思\Q2Q验证类的设计(Q)是很好的软g文档Q对l护者理解代码很有帮助?br />
q里仅给出其中几个时序图Q实际上我也没有把用例都dQ有些类似的单的Q就忽略了)
Q1Q新增一个手机号?br />
Q2Q关?br />
Q3Q开?br />
Q4Q发送短?br />
到这里设计阶D就完成了,用时一天。下一步是~码Q将应用Q_(d)Q先写测试代码的方式来写代码Q下ơ再介绍了?br />作者简?/h5>
版权声明Q本博客所有文章仅适用于非商业性{载,q请在{载时注明出处?qing)作者的|名?/p>
]]>
异常处理
?/span> 概念
?/span> 异常处理
?/span> Ȁ发异?/span>
?/span> 创徏自己的异?/span>
?/span> CZ
Java 语言的设计从Ҏ(gu)上便于我们写出整z、设计良好的代码Q尽如此,在程序运行中仍可能有各种各样的错误出现?/span>
1 、概?/span>
采用新的异常处理机制
在以往的程序开发过E中Q常帔R用返回D行处理。例如,在编写一个方法,可以q回一个状态代码,调用者根据状态代码判断出错与否。若状态代码表CZ个错误,则调用这q行相应的处理,或显CZ个错误页面或错误信息。通过q回D行处理的Ҏ(gu)是有效的Q但是有它的许多不之处?/span>
1 ?/span> E序复杂
2 ?/span> 可靠性差
3 ?/span> q回信息有限
4 ?/span> q回代码标准化困?/span>
采用错误代码和异常处理相l合的方式的优越性:(x)
1 ?/span> 把错误代码与常规代码分开
2 ?/span> 可以?/span> catch 中传播错误信?/span>
3 ?/span> 可以寚w误类型分l?/span>
4 ?/span> 方便定位错误Q维?/span>
异常
异常是异常事gQ它是程序遇到异常情冉|Ȁ发的事g。许多异常,如程序错误,I指针,数组溢出{。下面是一个出错流E?/span>
上图中:(x)
W一步:(x)插入用户?/span> Keynet Q登录系l?/span>
W二步:(x)服务器验证用L(fng)w䆾Q判断用L(fng)权限
W三步:(x)q回错误的信息?/span>
q是一个简单的异常处理CZQ怎样单、方ѝ快L(fng)得到错误信息。可以采用错误代码和异常两种方式相结合的方式处理?/span>
2 、异常处?/span>
Java 的异常是面向对象的。一?/span> Java ?/span> Exception 是一个描q异常情늚对象 . 当出现异常情冉|Q一?/span> Exception 对象׃生了 , q放到异常的成员函数里?/span>
Java 的异常处理是通过 5 个关键词来实现的Q?/span> try,catch,throw,throws ?/span> finally 。在 Java 语言的错误处理结构由 try Q?/span> catch Q?/span> finally 三个块组成。其?/span> try 块存攑ְ可能发生异常?/span> Java 语言Qƈ理相关的异常指针; catch 块紧跟在 try 块后面,用来Ȁ发被捕获的异常; finally 块包含清除程序没有释攄资源Q句柄等。不?/span> try 块中的代码如何退出,都将执行 finally 块?/span>
try ?/span> catch ?/span> ?/span>
可以采用 try 来指定一块预防所有异常的E序。紧跟在 try E序块后面,应包含一?/span>
或多?/span> catch 子句来指定你惌捕获的异常类型:(x) try catch 的格式一般ؓ(f)Q?/span>
try{
/**do something*/
}catch(?{
?/span>
}catch(?{
?/span>
}
例如Q?/span>
try{
int a= 100/0
}catch(Exception e){;
System.out.println(e.getMessage());
}
每当 Java E序Ȁ发一个异常时Q它实际上是Ȁ发了一个对象,而只有其类?/span> Throwable cȝ对象才能被激发?/span> Throwable cM的提供了一些方法。如Q其中的 getMessage() Ҏ(gu)打印出异常对应信息?/span>
Catch 子句的目标是解决异常情况Q把变量讑ֈ合理的状态,q象没有出错一L(fng)l运行。如果一个子E序不处理没个异常,则返回到上一U处理,如此可以不断的递归向上直到最外一U?/span>
finally ?/span>
finally 关键字是?/span> Java 异常处理模型的最佌充?/span> finally l构使代码M(x)执行Q而不有无异常发生。?/span> finally 可以l护对象的内部状态,q可以清理非内存资源。如果没?/span> finally Q?zhn)的代码就会(x)很费解。例如,下面的代码说明,在不使用 finally 的情况下(zhn)必d何编写代码来释放非内存资源:(x)
import java.net.*;import java.io.*;
class WithoutFinally{
public void foo() throws IOException { // 在Q一个空闲的端口上创Z个套接字
ServerSocket ss = new ServerSocket(0);
try { Socket socket = ss.accept();
// 此处的其他代?/span> ... }
catch (IOException e) {
ss.close(); //1
throw e; }
ss.close(); //2 }}
q段代码创徏了一个套接字Qƈ调用 accept Ҏ(gu)。在退Ҏ(gu)之前Q?zhn)必须关闭此套接字Q以避免资源漏洞。ؓ(f)了完成这一dQ我们在 //2 处调?/span> close Q它是该Ҏ(gu)的最后一条语句。但是,如果 try 块中发生一个异怼(x)怎么样呢Q在q种情况下, //2 处的 close 调用永远不会(x)发生。因此,(zhn)必L莯个异常,q在重新发出q个异常之前?/span> //1 处插入对 close 的另一个调用。这样就可以保在退Ҏ(gu)之前关闭套接字?/span>
q样~写代码既麻烦又易于出错Q但在没?/span> finally 的情况下q是必不可少的。不q的是,在没?/span> finally 机制的语a中,E序员就可能忘记以这U方式组l他们的代码Q从而导致资源漏z?/span> Java 中的 finally 子句解决了这个问题。有?/span> finally Q前面的代码可以重写ؓ(f)以下的Ş式:(x)
import java.net.*;import java.io.*;
class WithFinally{
public void foo2() throws IOException {
// 在Q一个空闲的端口上创Z个套接字
ServerSocket ss = new ServerSocket(0);
try { Socket socket = ss.accept();
// 此处的其他代?/span> ... }
finally {
ss.close();
}}}
finally 块确?/span> close Ҏ(gu)总被执行Q而不?/span> try 块内是否发出异常。因此,可以保在退Ҏ(gu)之前M(x)调用 close Ҏ(gu)。这h可以确信套接字被关闭ƈ且?zhn)没有泄漏资源。在此方法中不需要再有一?/span> catch 块。在W一个示例中提供 catch 块只是ؓ(f)了关闭套接字Q现在这是通过 finally 关闭的。如果?zhn)实提供了一?/span> catch 块,?/span> finally 块中的代码在 catch 块完成以后执行?/span>
finally 块必M try ?/span> try/catch 块配合用。此外,不可能退?/span> try 块而不执行?/span> finally 块。如?/span> finally 块存在,则它M(x)执行。(无论从那点看Q这个陈q都是正的。有一U方法可以退?/span> try 块而不执行 finally 块。如果代码在 try 内部执行一?/span> System.exit(0); 语句Q则应用E序l止而不?x)执?/span> finally 执行。另一斚wQ如果?zhn)?/span> try 块执行期间拨掉电(sh)源, finally 也不?x)执行。)
try ?/span> catch ?/span> finally ?/span>
最好采用此l构处理异常 . ?/span> catch 中捕获异?/span> , ?/span> finally 块中清除不需要的资源 , q样E序l构会(x)更完?/span> , 健壮 . 例如 :
try{
/**to do */
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
finally{
clearUpAll()
}
3 、激发异?/span>
Java 语言可以不在Ҏ(gu)中直接捕P而用 throw 语句异常抛l上层的调用者?/span> Throw 语句是来明地抛出一个异常;首先你必需得到一?/span> Throwable 的实例句柄,通过参数传到 catch 中,或者采?/span> new 操作W来创徏一个?/span>
格式Q?/span> throw new WhcaException(e.getMessage);
E序?x)?/span> throw 语句后立即终止,它后面的语句都不执行Q然后在包含它的所?/span> try 块中从里到外L含有与其匚w?/span> catch.
声明异常c?/span>
?/span> throw 语句被用在方法说明中Ӟ throw 有用 throws 代替。关键字 throws 用来标明一个方法可能抛出的各种异常。对大多?/span> Exception 子类来说Q?/span> Java ~译器会(x)你声明在一个方法中抛出的异常的cd。如下:(x)
格式Q?/span> type method_name(arg_list) throws WhcaException{
…?/span>
}
例如Q?/span> public void execute(String str,int index) throws WhcaException{
try{
}
catch(Exception e){
throw new WhcaException(“JB: M:?e.getMessage)
}
}
4 、创q异常c?/span>
当程序员为提供一些特定的功能?/span> Java cLQ往往需要保证类之间有良好的关系Q而且cM间的接口易于理解和实玎ͼq是定义一个新的异常类。徏议创q异常c,便于l护Q管理?/span>
定义一个新的异常类
通常采用 Exception 作ؓ(f)异常cȝ类Q如Q?/span>
package whca.common;
public class WhcaException extends Exception{
public WhcaException(){
}
public WhcaException(String s){
super(s);
}
}