C#培训2019-10-23第七课方块移动 Form控制方块移动2 — 老师问题讲解

1、首先借用了上一题的代码:为了存方向信息,用了一个数组。这样所有方块的方向信息就得用一个二维数组,如下:
MovingDirection[] m_DirectionArray = new MovingDirection[ 4 ];
MovingDirection[][] m_AllObjtctDirectionArray = new MovingDirection[ m_nObjectNumber ][];

然而,实际上此题存方向信息,根本用不到数组。因为此题中,方向信息在一个Timer触发时候,只有一个方向!所以根本不用拿数组去装它,也就没有二维数组了。

2、 Light.cs这个类命名不是很合适

第一次看到这个 new的时候,会觉着这个是一个灯,而实际上我在这边是表达一个灯组。

m_smallPanel = new Light( nObjectI );

那么单独看这一行,这里的nObjectI信息就容易误导,到底是和大方块的PositionIndex一致呢,还是灯组中每个小方块都有一个Index。造成理解误导。

3、m_smallPanel这个对象的名称不合适

只有我们在New这个类的对象时候:Light m_smallPanel;才知道m_smallPanel是代表灯。其余的时候我都是调用这个对象名称(m_smallPanel),这个时候就没有这个信息了,我只知道小方块信息,表达就很不明确。

4、nMovingPanelX 以及nMovingPanelY这两个变量名称不合适

这两个变量设计上代表的是方块左上角的坐标,如下:

			int nMovingPanelX = this.Left;
			int nMovingPanelY = this.Top;

首先这个名称中的Moving,容易让人联想到移动量,移动距离之类,而不是本意的正在移动的
其次这个名称中的XY,也有可能联想到差值X、Y,而不是本意的方块的坐标值
综合上面,这个名称可能就会理解为:移动量的X/Y值
尤其是结合bCanMoveUp = CanMoveUp( Direction, ref nMovingPanelY );中,有ref nMovingPanelY,能不能向上移动,能的话就返回移动距离值。

5、bCanMoveUp = CanMoveUp( Direction, ref nMovingPanelY );这一段中,“能不能向上移动”,为什么要丢“方向信息”进去

个人理解:“能不能向上移动”本身只和当前坐标以及边界条件相关,至于移动的方向是向上和向下与我这个方法没有关系。
因此可以改为:首先判断移动方向是UP的时候,在判断“能不能向上移动”。改成:bCanMoveUp = CanMoveUp( ref nMovingPanelY );,此时如果bCanMoveUptrue的时候,就直接会返回移动后的坐标值nMovingPanelY
这样的话下面这行代码就不需要了:

			if( bCanMoveUp ) {
				nMovingPanelY -= m_nMovingUpSpeed;
			}

改成:

		if( bCanMoveUp == false ) {
			//修改方向为向下	
		}
6、在判断能否移动后,读者的第一反应是,我下面会移动了。但是我下面的代码却是对亮哪个灯的判断。这样会造成逻辑上的不连贯。建议更改顺序。
7、Size类型的MoveDistanceSize的存在是否合适

如下:

			// size difference after moved
			Size MoveDistanceSize = MoveAfterSize - MoveBeforeSize;

问题:
没有必要用Size来存的话,就尽量不用Size存。现在用一个Size类型的变量,但是我们后面并没有用到Size的整体概念。而是用它的WidthHeight属性来进行判断。
解决意见:
这样的话,用int类型的变量来存这个数据就更合适,还能取更容易理解的名称:“垂直移动量”或者“向上移动的量”、“向下移动量”。这样后面做逻辑判断的时候会更明确。阅读性会更强。

8、注释问题:对移动量的判断中,注释了:// right light on,这样读者会以为下一行的代码就执行了亮灯的操作,会对后面的EventCenter.LightOn( KeyStateLight, PositionIndex );代码部分产生疑惑:“既然已经亮灯了,为什么还要再亮一次呢?”
			// horizontal direction move
			if( MoveDistanceSize.Width > 0 ) {

				// right light on
				KeyStateLight[ 2 ] = MovingDirection.RIGHT;
			}
			else if( MoveDistanceSize.Width < 0 ) {

				// left light on
				KeyStateLight[ 1 ] = MovingDirection.LEFT;
			}
9、KeyStateLightArray = KeyStateLight;这行代码将亮灯信息存起来没有用到,去掉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值