上文中我给出了画图程序的一种最普通也最常见的做法。就是把处理逻辑全放在系统的事件处理函数中,这种方法有以下几个缺点:

1.        逻辑性不强,写到后面自己都绕不过弯来。

2.        一个函数做了太多的事情,复杂的处理逻辑全放在系统的事件处理函数中。

3.        有条件判断,在目前这个简单的应用中还显不出它的可怕,不过它的坏处想想也知道多严重。你可以参考吕震宇的条件外置

那么,如何才能采取一个有效的方案解决这个问题呢?一步一步来,让我们从重构开始。
 

从一个画图程序谈起---重构(2)private void Form1_MouseDown(object sender, MouseEventArgs e)
{
从一个画图程序谈起---重构(2)            
if (bDrawLine && bFirstDown)
{
从一个画图程序谈起---重构(2)                
this.Cursor = Cursors.Cross;从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)                Line newLine 
= new Line();
从一个画图程序谈起---重构(2)                newLine.StartPoint 
= new Point(e.X, e.Y);从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)                drawingLine 
= newLine;
从一个画图程序谈起---重构(2)                bFirstDown 
= false;
从一个画图程序谈起---重构(2)            }

从一个画图程序谈起---重构(2)            
else if (bDrawLine == true && bFirstDown == false)
{
从一个画图程序谈起---重构(2)               if (drawingLine != null)
{
从一个画图程序谈起---重构(2)                drawingLine.EndPoint 
= new Point(e.X, e.Y);
从一个画图程序谈起---重构(2)                AddLine(drawingLine);
从一个画图程序谈起---重构(2)                }

从一个画图程序谈起---重构(2)            
this.Cursor = Cursors.Arrow; 
             }
        }


这么多的逻辑,看的太乱了。先使用Extract Method,把条理弄弄清楚。

从一个画图程序谈起---重构(2)private void Form1_MouseDown(object sender, MouseEventArgs e)
{
从一个画图程序谈起---重构(2)            
if (bDrawLine && bFirstDown)
{
从一个画图程序谈起---重构(2)                RecordFirstPt(e);
从一个画图程序谈起---重构(2)                bFirstDown 
= false;
从一个画图程序谈起---重构(2)            }

从一个画图程序谈起---重构(2)            
else if (bDrawLine == true && bFirstDown == false)
{
从一个画图程序谈起---重构(2)                RecordSecondPt(e);
从一个画图程序谈起---重构(2)                bFirstDown 
= true;
从一个画图程序谈起---重构(2)            }
从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        
private void RecordSecondPt(MouseEventArgs e)
{
从一个画图程序谈起---重构(2)            
if (drawingLine != null)
{
从一个画图程序谈起---重构(2)                drawingLine.EndPoint 
= new Point(e.X, e.Y);
从一个画图程序谈起---重构(2)                AddLine(drawingLine);
从一个画图程序谈起---重构(2)            }

从一个画图程序谈起---重构(2)            
this.Cursor = Cursors.Arrow;
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        
private void RecordFirstPt(MouseEventArgs e)
{
从一个画图程序谈起---重构(2)            
this.Cursor = Cursors.Cross;从一个画图程序谈起---重构(2)    
从一个画图程序谈起---重构(2)            Line newLine 
= new Line();
从一个画图程序谈起---重构(2)            newLine.StartPoint 
= new Point(e.X, e.Y);从一个画图程序谈起---重构(2)    
从一个画图程序谈起---重构(2)            drawingLine 
= newLine;
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)


 

这样主逻辑清楚了许多。

第一次按下鼠标,记录第一个点,然后设为第二种状态,下次再点击的时候,记录第二个点,此时完成一条线段,再回到第一种状态。

两个状态,不错再重构一下。让状态的意思表现出来。


从一个画图程序谈起---重构(2)private void Form1_MouseDown(object sender, MouseEventArgs e)
{
从一个画图程序谈起---重构(2)            
if (IsGetFirstPointState())
{
从一个画图程序谈起---重构(2)                RecordFirstPt(e);
从一个画图程序谈起---重构(2)                SetToGetSecondPtState();
从一个画图程序谈起---重构(2)            }

从一个画图程序谈起---重构(2)            
else if (IsGetSecondPointState())
{
从一个画图程序谈起---重构(2)                RecordSecondPt(e);
从一个画图程序谈起---重构(2)                SetToGetFirstPtState();
从一个画图程序谈起---重构(2)            }
从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        
private bool IsGetSecondPointState()
{
从一个画图程序谈起---重构(2)            
return bDrawLine == true && bFirstDown == false;
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        
private void SetToGetFirstPtState()
{
从一个画图程序谈起---重构(2)            bFirstDown 
= true;
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        
private void SetToGetSecondPtState()
{
从一个画图程序谈起---重构(2)            bFirstDown 
= false;
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        
private bool IsGetFirstPointState()
{
从一个画图程序谈起---重构(2)            
return bDrawLine && bFirstDown;
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)


 这样状态的意思就出来了,很好现在的逻辑清晰了许多,再看看下面这个鼠标移动的函数

从一个画图程序谈起---重构(2)private void Form1_MouseMove(object sender, MouseEventArgs e)
{
从一个画图程序谈起---重构(2)            
if (bFirstDown == false)
{
从一个画图程序谈起---重构(2)                
if (drawingLine != null)
{
从一个画图程序谈起---重构(2)                    Point mousePoint 
= new Point(e.X, e.Y);
从一个画图程序谈起---重构(2)                    DrawLine(drawingLine.StartPoint, mousePoint);
从一个画图程序谈起---重构(2)                }

从一个画图程序谈起---重构(2)            }
从一个画图程序谈起---重构(2)
从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)


把它也改一下:(具体省略同上)


从一个画图程序谈起---重构(2)private void Form1_MouseMove(object sender, MouseEventArgs e)
{
从一个画图程序谈起---重构(2)            
if (IsGetSecondPointState())
{
从一个画图程序谈起---重构(2)                DragLine(e);
从一个画图程序谈起---重构(2)            }

从一个画图程序谈起---重构(2)        }

从一个画图程序谈起---重构(2)


通过上面的重构,你对这个画线的过程是否更加清晰了?现在剩下的缺点就在于那个条件判断了。如何把条件判断消除?多态!详见下篇随笔

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-30
  • 2021-11-22
  • 2022-03-04
  • 2021-09-07
  • 2021-10-29
  • 2021-06-09
猜你喜欢
  • 2022-01-25
  • 2022-01-27
  • 2021-07-16
  • 2022-03-08
  • 2022-01-03
相关资源
相似解决方案