2014-03-30 55 views
0

因此,我設法創建一個簡單的fla,並設法將其上傳到http://wonderfl.net/c/unNZ,所以如果任何人喜歡幫助我,他會很容易。(我確實想過在這裏發佈代碼,但我沒有認爲脂肪酶會讀300個多行代碼,之後幫我不知道什麼視覺上我迄今所做的和我想要的)如何正確優化

所以長話短說 - >中的鏈接代碼做到這一點:

- 查看我們想要放置對象的網格單元格是否可用 - 如果是,我們可以將其放置在其中。 - 檢查當前對象(Box)左側的單元格是否被佔用 - 如果是,檢查其中的對象是否小於當前的1 - 如果它們連接在一起/如果不是什麼都不做(只是放置它)

- 組合複雜的對象(如添加一個對象,其中有2個框(或更多)在其中有2個或更多框的另一個對象)。

然而,我已經完成編碼的方式並不是很有效率。有很多事情我認爲不是可能需要的,但我可以再次爲目標設定nt think of a better solution that would in the end work and show what I

的問題不在於我不是滿意的代碼,我到目前爲止,問題是,當我加入檢查,看是否右/上/下細胞邏輯(目前我只有檢查LEFT細胞邏輯)它會變得非常荒謬/混亂,甚至現在我不知道我是否會設法做到這一點。

所以有人會幫助我做到這一點。

回答

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或測試驅動設計重構代碼。這將允許你通過編寫測試來解決你的算法。你自然會得到更小的函數,並且能夠知道某些更改是否意外地破壞了用例。例如,您現在有左側檢查工作。但是如果當你寫下你的RIGHT檢查時,你在左邊打破了什麼?除非你使用單元測試,否則你不會真的知道,直到太遲。

單元測試的一個例子是這樣的:

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;); 
    } 
+0

好你說的第一個方法情理之中的事情和沒有開始做,現在,但我從來沒有聽說過這個TDD方式。你能指出一些很好的例子/鏈接嗎? – GregorII

+1

@GregorII這是假設你正在使用FlashBuilder:http://www.adobe.com/devnet/flex/articles/flashbuilder4_tdd.html 也有#2的許多問題媒體鏈接:) http://stackoverflow.com/questions/4909959/unit-testing-as3-code-for-flash – Bob

+1

另外,這裏是關於TDD和單元測試的一個很好的問題/答案,來自gamedev。 http://gamedev.stackexchange.com/questions/14528/best-practices-for-unittesting-heavy-flash-game-clients-and-libraries – Bob