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
,容易让人联想到移动量,移动距离
之类,而不是本意的正在移动的
。
其次这个名称中的X
和Y
,也有可能联想到差值X、Y
,而不是本意的方块的坐标值
。
综合上面,这个名称可能就会理解为:移动量的X/Y值
。
尤其是结合bCanMoveUp = CanMoveUp( Direction, ref nMovingPanelY );
中,有ref nMovingPanelY
,能不能向上移动,能的话就返回移动距离值。
5、bCanMoveUp = CanMoveUp( Direction, ref nMovingPanelY );
这一段中,“能不能向上移动”,为什么要丢“方向信息”进去
个人理解:“能不能向上移动”本身只和当前坐标以及边界条件相关,至于移动的方向是向上和向下与我这个方法没有关系。
因此可以改为:首先判断移动方向是UP
的时候,在判断“能不能向上移动”。改成:bCanMoveUp = CanMoveUp( ref nMovingPanelY );
,此时如果bCanMoveUp
是true
的时候,就直接会返回移动后的坐标值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
的整体概念。而是用它的Width
和Height
属性来进行判断。
解决意见:
这样的话,用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;
}