2015-11-13 62 views
-1

查找下面的命令行式風格的代碼:這種命令式編碼風格的等效Scala代碼是什麼?

private boolean placePieceOnBoard(Results results, 
            ChessLayout chessLayout, 
            List<ChessPiece> piecesToPlace, 
            int pieceIndex, 
            int startOffset) { 
    if(pieceIndex == piecesToPlace.size()) { 
     results.addLayout(chessLayout); 
     return true; 
    } 
    else { 
     ChessPiece chessPiece = piecesToPlace.get(pieceIndex); 
     int offset = startOffset; 
     while(offset < chessLayout.getBoardLength()) { 

      int placedOffset = chessLayout.placePieceInNextAvailablePosition(chessPiece, offset); 
      if(placedOffset == ChessLayout.NULL_OFFSET) 
       break; 
      else { 
       logger.debug("piece {} ({}) moved", pieceIndex, chessPiece); 

       placePieceOnBoard(results, chessLayout.clone(), piecesToPlace, pieceIndex + 1, placedOffset + 1); 

       chessLayout.removeChessPiece(chessPiece); 
       offset = placedOffset + 1; 
      } 
     } 
     return false; 
    } 
} 

在這裏,我想知道如何作出一個功能性的方式在循環中的偏移量的變化轉換,如何從循環等

+0

結果與ChessLayout看怎麼樣? –

+1

請將您的代碼片段首先轉換爲Scala,這是您至少可以做到的!在函數式編程中,您不會中斷,您可以讓函數終止/返回。該策略必須創建一個將偏移量作爲參數並返回新偏移量值的函數。 – jmelanson

回答

1
做早點休息

這是Scala強大優勢之一 - 從命令式Java代碼到功能代碼的逐步,輕鬆遷移。

要轉換爲斯卡拉,你不需要去100%的功能,立竿見影。你可以很容易地轉換你必須斯卡拉如下:

def placePieceOnBoard(results: Results, 
         chessLayout: ChessLayout, 
         piecesToPlace: List[ChessPiece], 
         pieceIndex: Int, 
         startOffset: Int) { 
    if (pieceIndex == piecesToPlace.size()) { 
     results.addLayout(chessLayout) 
     true 
    } 
    else { 
     val chessPiece = piecesToPlace.get(pieceIndex) 
     var offset = startOffset 
     while(offset < chessLayout.getBoardLength) { 

      val placedOffset = chessLayout.placePieceInNextAvailablePosition(chessPiece, offset) 
      if(placedOffset == ChessLayout.NULL_OFFSET) 
       break 
      else { 
       logger.debug("piece {} ({}) moved", pieceIndex, chessPiece) 

       placePieceOnBoard(results, chessLayout.clone(), piecesToPlace, pieceIndex + 1, placedOffset + 1) 

       chessLayout.removeChessPiece(chessPiece) 
       offset = placedOffset + 1 
      } 
     } 
     false 
    } 
} 

報告中,我們已經在冗長一些小的改進:沒有更多的; S,沒有多餘的類型簽名,轉化爲常量如果可能的話,消除return語句可變的變量和功能括號。注意:我改變了piecesToPlace參數類型的階列表,你需要使用scala-java converters在調用點,使這個編譯。

接下來,我們可以開始做這個功能更強大......但是,這個功能可能不是你應該開始,因爲你是在幾個地方呼叫狀態,變異函數的地方。例如,您可以用ChessLayout開始:

chessLayout.removeChessPiece(chessPiece) 

val placedOffset = chessLayout.placePieceInNextAvailablePosition(chessPiece, offset) 

這些方法變異ChessLayout,這是不實用的風格。你可以修改removeChessPiece與片取出返回一個新ChessLayoutplacePieceInNextAvailablePosition可以返回的(ChessLayout, Int)的元組。一旦你停止了從變異狀態調用placePieceOnBoard的任何函數,就可以將其轉換爲函數樣式。

+0

謝謝@jazmit – Anand

+0

不客氣。 – jazmit