.Net Framework3.0 实践纪实(1)
引子
刚刚完成了TopGo程序的第一个版本,朋友们建议将此程序的开发过程共享。我也有此想法,唯恐自己能力有限,辜负了朋友们的期望。最后我还是决定把它写出来,作为大家闲来无事时讨论的话题也未尝不可,同时我也真诚地希望各位同好们提出批评和建议。
TopGo是一款使用.Net Framework3.0(WinFx) 编写的计算机围棋软件(由于本人喜欢下围棋,不知道有没有人知道几年前的心弈1.0, 那就是拙作。),严格的说TopGo并不是一款有关于围棋的游戏软件,更多是作为工具软件来设计的。之所以采用.Net Framework3.0,一则为了熟悉.Net Framework3.0, 二则是新的Windows Vista即将问世。
本纪实并不作为大家学习.Net Framework3.0的教材,有关.Net Framework3.0 方面的详细知识,大家可以阅读MSDN文档。
软件编程方法
TopGo的编写过程,既不是团队下的产物,甚至连作坊式都谈不上。但是,既然是软件开发,必然涉及到设计方法。十多年的软件开发生涯,我有我个人的开发方法,它是一种需求驱动的方法。
大家都有共同的体会,那就是在软件开发过程中,客户的需求总是琢磨不定,反复无常。尤其是当今社会的快速变换,各种需求的变化更加频繁。所以那种传统式的编写好所有的需求分析,让客户认可签字后在实现的方法已经不能适应目前的需要,于是,极限编程、敏捷编程陆续登上舞台。其实我的方法可以在极限和敏捷编程中找到影子,也许是受它们的影响吧,但它不是极限编程或者敏捷编程。
我的大体步骤是:
1、 确定部分需求
2、 编写代码实现上述需求,尽可能采用测试驱动方法
3、 逐步扩展需求
4、 如果软件还没有完成了全部需求,回步骤1。
具体的实施过程,大家可以从后面描述的内容中看到,这里就不做详细说明了。
布局
每个人都可以说出,开发软件的第一步就是要明确软件的需求,然后是对需求进行分析。大部分公司还要求系统分析员写出详细的需求分析文档以及设计规范书。无疑这些并没有错,问题是对于TopGo并不适合,TopGo首先假定对要编写的软件功能并不是太明确,其次TopGo并不是一个需要多人团队协作的大项目。
对于TopGo, 让我们看看如何开始。同许多程序员一样,面对一个项目,会有一种马上动手编写代码的渴望,而不是去写什么文档、做什么计划,当然我并不是反对这样做,何况每个人都有自己的做事方式。我的意思就是说一种行之有效的方法并不比写在教科书上的方法差。不过如何开始写你的第一行代码呢?记得有一本书叫做编程之道,书中描述到如果一个人在黑暗中要开枪击中目标的话,有三种方法,第一种是任意向一个方向开枪,期望瞎猫碰到死老鼠;第二种方法则是对着四周扫射,这样总有一颗子弹会命中目标;第三种那就是使用自动跟踪弹,就象鱼雷或者导弹那种,让子弹去寻找目标。第三种方法也是我要使用的方法,首先我们确定一个大概的方向,然后对准这个方向开枪,然后看看会发生什么。
下面是我最初想到的需求:
1、 TopGo必须能够显示一个棋盘;
2、 TopGo的棋盘必须可以在一个指定的位置显示指定颜色的棋子;
3、 棋子的位置可以通过鼠标来指定(准确地说是鼠标左键)
OK, 需求并不一定要一次性的全部列出来,三个需求目前对我们开始工作已经够了,它们也可以看成是三个编程任务或者三个目前要实现的目标。但是我们一次只能从中挑选一个出来。大致思考片刻,不难发现第一个任务是最好的开始(其实可以从任何一个开始)。考察第一个任务,我们可以分成更小的任务:
1、 TopGo必须能够显示一个棋盘
1.1 棋盘在界面上的位置
1.2 画棋盘的纵横线(标准为19*19),棋盘的大小必须可以动态设置比如说(10*10)
……
启动VS2005, 新建一个WinFx的Windows项目,起名为TopGo。对自动生成的Window1进行改名为MainWindow,并修改其它有关的部分,项目就这样开始了。
接下来,我们大致考虑一下界面的布局,经过考虑,我把界面分成了一个2*3的Grid:顶上一行合并用来布置菜单或者工具条,最底下一行也进行合并作为操作工具栏。中间一行分成两个部分,左边作为信息显示面板,棋盘显示在右边一栏。它们的Xaml定义如下:
<Window x:Class="TopGo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TopGo" MinHeight="600" MinWidth="800" WindowState="Maximized"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
<RowDefinition Height="36" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="280" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
</Grid>
</Window>
设置窗体最小尺寸为800*600的目的是因为如果窗体太小,棋盘可能就太小了,而且目前大多数显示器基本都可以支持这个尺寸,如果不支持这个尺寸的显示器,那么我想这些机器可能也不支持Windows XP以上的操作系统,程序也不能运行在这些机器上面。还有我们把信息显示面板栏的宽度以及上下两行的高度设置为固定的,这样我们可以保证剩下的空间最大可能的用于棋盘的显示。
(待续)