C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十二)2010-02-23 博客园 深蓝色右手C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十二)重构 – 让代码插上翅膀自由飞翔上一节,我将游戏地图模式进行了一次重大的变动,这在实际开发中意味着项目大规模重置,虽然表面上显得游刃有余,仅仅一个AllMove()方法的改变即实现了完美转型,这全得归功于前20节所搭建起的相对高度可扩展平台。但是,随着开发不断深入,我慢慢的感到些许的不安,因为代码上的日益松散与结构的渐渐稀疏如同Windows系统的磁盘碎片与日俱增,未来维护时的烦琐与痛心疾首已历历在目。代码向我发出了求救信号,用什么来拯救你-我的代码?是时候亮剑了 –- 我的第一次亲密重构。下面我将分几点对上一节中的代码进行重构:一、统一化代码格式,让代码可读性发挥到极至:我以上一节中创建地图地表层的代码为例:
private void InitMapSurface() {
MapSurface.Width = 1750;
MapSurface.Height = 1440;
MapSurface.Source = BitmapFrame.Create((new Uri(@"Map .jpg", UriKind.Relative)));
Carrier.Children.Add(MapSurface);
Canvas.SetLeft(MapSurface, -320);
Canvas.SetTop(MapSurface, -200);
MapSurface.SetValue(Canvas.ZIndexProperty, -1);
}
大家先看InitMap()方法中的前3行代码,它们均以MapSurface打头进行赋值书写;接着看倒数2、3行,却又是以Canvas.Set…()模式来设置MapSurface的属性;更可怕的是最后一行,明明可以写成Canvas.SetZIndex(…)的形式,好歹也与它前面两行凑合凑合,可是这个作者赶着写项目,五花八门的写法都出来了。尽管,这达到实现功能的要求;可是仅仅不上十行的代码可读性已达到了“神出鬼没”的地步,你是否曾想过如此类似的代码一旦多起来,除了你,还有谁能进行维护?上帝知道。其实这段代码改造起来是很简单的,不外呼统一书写格式,从而提高代码的可读性。下面且看我是如何操作的:1、分析,Canvas.SetLeft、Canvas.SetTop与Canvas.ZindexProperty这3个东西设置的是地表层图片左上角距离游戏窗口的X距离、Y距离以及它在游戏窗口中的深度(层次)。并且,它们的赋值范围均为整数(正、负、0皆可)。2、思考,WPF与Silverlight同属于不同形式的应用,一个桌面,一个浏览器;但是它们却可以使用相同的xaml进行表现层设计,是MS刻意拉近两者的距离?这无从考证,未来可以回答我们,但是从两着的共性让我不禁联想起了网页。3、比较,网页对象的Style(Css样式表)属性中有3个属性与上面的3个属性名称与作用惊人的相似:left、top、z-index,只是它们必须在position:absolute模式下使用,但这又切中了我们下怀,Canvas画布的内部布局同样是采用基于点的绝对定位,两者看来仿若一物。