所以我设法创建一个简单的fla并设法将其上传到http://wonderfl.net/c/unNZ所以如果有人喜欢帮我,那就很容易。(我确实想到在这里发布代码,但我不这样做认为人们会阅读300多行代码,然后在不知道我到目前为止做了什么以及我想要的事情的情况下帮助我
故事很长 - >链接中的代码执行此操作:
- 查看我们想要放置对象的网格单元格是否是空闲的 - 如果是,我们可以将框放入其中。
- 查看当前对象(Box)剩余的单元格是否被占用 - 如果是,请检查其中的对象是否比当前对象少1 - 如果它们将它们连接在一起/如果什么也不做(只是放置它)
-Combine复杂对象(比如将一个包含2个(或更多)框的对象添加到另一个包含2个或更多框的对象中。)
然而,我完成编码的方式根本没有效率。我认为可能不需要很多东西,但我可以再次nt think of a better solution that would in the end work and show what I
瞄准。
问题不在于我对目前的代码不满意,问题是当我添加检查是否RIGHT / TOP / BOTTOM单元格逻辑时(目前我只有它会变得非常荒谬/混乱,甚至现在我也不知道我是否会设法做到这一点。
那么有人会帮我这么做。
答案 0 :(得分:1)
您在代码的这一点上要做的是重构。
基本上,您需要获取代码,并将其分解为更小的函数。理想情况下,任何函数都不会超过大约5行代码。因为否则,你的功能正在违反单一责任规则而且做得太多。
此时有两种重构方法。更艰难的方式,或更容易更长的方式。 更长的方法是手动尝试将代码分解为更小的函数。看看哪些元素是常见的,并重构出来。例如这段代码:
for( var k:int = 0; k <= ifl; k++ )
{
Grid[ numbers[1] ][ (numbers[0] - k ) ].alpha = 1;
Grid[ numbers[1] ][ (numbers[0] - k ) ].circle.visible = true;
Grid[ numbers[1] ][ (numbers[0] - k ) ].isOccupied = false;
trace( " ++++++!!!! grid was occupied" + numbers[1] + "_" + (numbers[0] - k ) ) ;
}
将成为此代码:
private function clearOccupiedSpaces(ifl:Array):void
{
for( var i:int = 0; i <= ifl; i++ )
{
Grid[ numbers[1] ][ (numbers[0] - i ) ].alpha = 1;
Grid[ numbers[1] ][ (numbers[0] - i ) ].circle.visible = true;
Grid[ numbers[1] ][ (numbers[0] - i ) ].isOccupied = false;
trace( " ++++++!!!! grid was occupied" + numbers[1] + "_" + (numbers[0] - i ) ) ;
}
}
if( currentObj.itemsFromLeft > 0 )
{
trace("zzzzzzz");
//when we start to drag it (we remove it from the cell) we restore all the properties to the LEFT cell
var ifl:Number = currentObj.itemsFromLeft; // total left elements
clearOccupiedSpaces(ifl);
}
一旦将所有内容分解为较小的函数,您的代码将看起来不那么混乱,您将能够更轻松地找到模式并管理代码。您还需要较少的评论,因为您的功能将清楚标明他们正在做什么。
第二个更好的选择是使用TDD或测试驱动设计重构代码。这将允许您通过编写测试来解决您的算法。您自然会得到更小的功能,并且能够知道某些更改是否意外地破坏了用例。 例如,您现在可以进行LEFT检查。但是,如果当你写出正确的支票时,你会在LEFT中打破一些东西吗?你不会真的知道,除非你使用单元测试,否则为时已晚。
单元测试的一个例子是这样的:
public function testLeftCheck_nothingToTheLeft_placeObject():void {
var box222:Box222 = new Box222();
box222.itemsFromLeft = null;
placeObject(box222);
assertTrue(box222.width == SINGLE_BOX;);
}
public function testLeftCheck_somethingToTheLeft_combineObject():void {
var box222:Box222 = new Box222();
box222.itemsFromLeft = [new Box222()];
placeObject(box222);
assertTrue(box222.width == TWO_BOX_WIDTH;);
}