In my last post, I refactored some horribly commented code into the following:
public void HighlightPotentialDropNode(
UltraTreeNode potentialDropNode,
Point dropLocationRelativeToTree)
{
DropLinePositionEnum newDropLinePosition = DropLinePositionEnum.OnNode;
if (PointIsAboveNode(potentialDropNode, dropLocationRelativeToTree))
{
newDropLinePosition = DropLinePositionEnum.AboveNode;
}
else if (PointIsBelowNode(potentialDropNode, dropLocationRelativeToTree))
{
newDropLinePosition = DropLinePositionEnum.BelowNode;
}
DrawDropLinePosition(potentialDropNode, newDropLinePosition);
}
private bool PointIsAboveNode(UltraTreeNode node, Point pointInTreeCoords)
{
return pointInTreeCoords.Y < (node.Bounds.Top + EdgeSensitivity);
}
private bool PointIsBelowNode(UltraTreeNode node, Point pointInTreeCoords)
{
return pointInTreeCoords.Y > ((node.Bounds.Bottom - EdgeSensitivity) - 1);
}
I was a bit quick to publish that post – because 5 minutes later I discovered that I wasn’t quite done cleaning up this method... Can you tell what’s wrong with it? It’s breaking the single responsibility principle.
Let’s do one more ‘extract method’ refactoring on it, putting the logic of calculating the DropLinePosition in a separate method:
public void HighlightPotentialDropNode(
UltraTreeNode potentialDropNode,
Point dropLocationRelativeToTree )
{
DropLinePosition dropLinePosition =
CalculateDropLinePosition(potentialDropNode, dropLocationRelativeToTree);
DrawDropLinePosition(potentialDropNode, dropLinePosition);
}
private DropLinePosition CalculateDropLinePosition(
UltraTreeNode potentialDropNode,
Point dropLocationRelativeToTree)
{
DropLinePosition dropLinePosition = DropLinePosition.OnNode;
if (DropLocationIsAboveNode(potentialDropNode, dropLocationRelativeToTree))
{
dropLinePosition = DropLinePosition.AboveNode;
}
else if (DropLocationIsBelowNode(potentialDropNode, dropLocationRelativeToTree))
{
dropLinePosition = DropLinePosition.BelowNode;
}
return dropLinePosition;
}
private bool DropLocationIsAboveNode(UltraTreeNode node, Point dropLocationRelativeToTree)
{
return dropLocationRelativeToTree.Y < (node.Bounds.Top + EdgeSensitivity);
}
private bool DropLocationIsBelowNode(UltraTreeNode node, Point dropLocationRelativeToTRee)
{
return dropLocationRelativeToTRee.Y > ((node.Bounds.Bottom - EdgeSensitivity) - 1);
}
Now we’re talking :)