一个扑克游戏的诞生—扑克牌及相关类代码兼谈异常
呵呵,真得很高兴上篇帖子发了以后马上有一个叫ide的朋友对我画的uml图提出了批评,这是我最希望看到的,希望这位ide网友能够继续就这个问题继续指教我一下,呵呵。另外我还是想强调一下,写这篇文章并不是为了给大家做教程,而是希望大家看到我做这个游戏当中从设计到最后完成的设计思路及编程方法,而我做这个游戏也仅仅是为了学习一下.net 而已,所以我希望大家能给我提出批评意见,而不是当作什么大作来读。我也需要学习,也需要提高自己的水平,这也就是尽管我对rose不是很熟悉但我还是敢于自暴其短把我画的uml图贴出来,我不是做范例,而是在展示自己的学习成果,并且我想我所存在的问题可能就是大家初学uml时最可能犯的错误,如果通过对这些问题的讨论能够给我或其他初学uml的人有所帮助,那是最理想不过的事了。我希望大家能指出这篇文章中的错误或不合理的地方,大家共同进步,其他那些和程序设计及编码无关的问题就不在我们讨论的范围之内,所以,请告诉我为什么错,错在那里,正确的应该是怎样,而不是只是简单的说我错了或指摘我某方面的水平,那不是一种好的讨论方式。
言归正传,继续昨天的问题。通过刚才的类图可以看到有两个前面类设计中没提到的类:cardnotfoundexception和cardalreadyexists类,这两个类都是从system.exception类继承来的,是自定义异常类。具体代码如下:
cardnotfoudexception.cs
using system;
namespace bigeagle.games.cards
{
/// <summary>
/// 未找到指定card对象异常
/// <br>author: bigeagle</br>
/// <br>date: 2002/4/19</br>
/// <br>history: 2002/4/19</br>
/// </summary>
public class cardnotfoundexception : system.exception
{
/// <summary>
/// 牌对象
/// </summary>
private card m_objcard ;
/// <summary>
/// 存取牌对象的属性
/// </summary>
public card thecard
{
get
{
return this.m_objcard ;
}
set
{
this.m_objcard = value ;
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="a_objcard">未找到的牌对象</param>
public cardnotfoundexception(card a_objcard)
{
this.m_objcard = a_objcard ;
}
/// <summary>
/// 重载构造函数
/// </summary>
/// <param name="a_objcard">指定的牌对象</param>
/// <param name="a_strmessage">消息,调用父类构造函数使用</param>
public cardnotfoundexception(card a_objcard , string a_strmessage):base(a_strmessage)
{
this.m_objcard = a_objcard ;
//base(a_strmessage) ;
}
}//end class
}//endnamespace
file : cardalreadyexistsexception.cs
using system;
using bigeagle.games.cards ;
namespace bigeagle.games.cards
{
/// <summary>
/// cardalreadyexistsexception 的摘要说明。
/// </summary>
public class cardalreadyexistsexception:system.exception
{
/// <summary>
/// 已存在的牌
/// </summary>
private card m_objcard = new card() ;
/// <summary>
/// 存取牌的属性
/// </summary>
public card thecard
{
get
{
return this.m_objcard ;
}
set
{
this.m_objcard = value ;
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="a_objcard">牌对象</param>
public cardalreadyexistsexception(card a_objcard)
{
this.m_objcard = a_objcard ;
}
/// <summary>
/// 重载构造函数
/// </summary>
/// <param name="a_objcard">牌对象</param>
/// <param name="a_strmessage">消息,父类用</param>
public cardalreadyexistsexception(card a_objcard , string a_strmessage) : base(a_strmessage)
{
this.m_objcard = a_objcard ;
}
}//end class
}//end namespace
这两个类很简单,一个是牌未找到异常,另一个是牌已经存在异常。相信不用我解释大家也能看懂(唯一需要注意的是这两个类构造函数中有个调用父类有参构造函数的用法,如果不太熟悉的话可以看一下相关教程。),那么,为什么要定义这两个异常类呢,为什么不直接抛出一个普通的exception或者干脆等系统自己来处理呢?说到这里,我想结合上述问题讲一下有关异常的问题,主要原因是在不少朋友的代码里看到有太多的错误使用异常或干脆忽略异常的问题。
为什么要使用异常以及如何使用异常教科书里都有,我就不再赘述了。现在我要说的是为什么要自定义异常。一个比较成熟的软件项目中,错误处理的代码应该占很大比例,最糟糕的使用异常的方法就是在自己的方法中添加一个空catch子句或者干脆不理他,不处理异常会造成很多问题。既然要处理异常,那就要针对不同的异常来决定不同的处理方法,而不能简单的捕捉一个exception,这也就是为什么要自定义异常类的原因。举个简单的例子(还是关于扑克牌的),比如说我们现在要生成一副牌然后保存到数据库中,并且要求这副牌中不能有相同的两张牌,如果只是简单的捕捉一个exception对象,那你在后边的测试纠错中很难直接定位出错的原因,而如果分别捕捉不同的异常,那可以得到丰富的可用于测试纠错的信息。
