2010-08-13 43 views
3

我正在創建一個小型益智遊戲,就像一個愛好項目一樣,但是項目現在已經達到了有相當多代碼(大約1500行)的程度。儘管我試圖阻止它,但代碼變得混亂。我一定要清理代碼,並使其更易於維護和可讀,而我仍然可以。關於在Java中正確使用封裝的建議

有3類處理關於我的遊戲拼圖行動:

class PieceController{ 
    private arrayOfPieces; 
    private selectedPiece; 
    //actions like select a piece, dropa piece 
} 

class Piece{ 
    private pieceID 
    private ArrayOfPieceStates 
    //handles the initial creation of pieceStates and returns the current state 
} 

class PieceState{ 
    private stateDimensions 
    // the particular rotation of a piece, aware of it's dimensions. 
} 

想必這種結構應該重新設計爲一個整體,但是讓我們假設它的確定只是現在。

問題:還有一個JPanel負責處理圖形,它需要知道當前拼圖的PieceState來繪製它。面板的繪製方法然後得到的尺寸與像一個請求:

PuzzleController.getPiece().getState().getDimensions() 

這似乎是不好的做法,因爲它打破封裝完全因爲我現在已經學習。當我希望重新設計拼圖塊結構時,這些吸氣鏈會打破;

然後我想我可能會遵循「告訴不問」的原則爲繪圖:

PieceController.drawPiece(drawingInfo) // called by the graphics Panel 
Piece.drawPiece(drawingInfo) // called by PieceController 
PieceState.drawState(drawingInfo) // called by Piece, now here we are aware of piece dimensions so drawing can take place. 

(不是drawingInfo在acutal代碼的論點,即繪製方法需要一個行)

在某種程度上,我已經實現了封裝,因爲第一個drawPiece方法是所有圖形面板的需求,它不需要擔心這些塊如何進一步結構化。但現在感覺就像我只是扭轉了信息依賴性,並沒有取得很大的進展。

首先是:繪圖方法需要當前puzzlePiece狀態的尺寸信息繪製。 現在它已變成:puzzlePiece的狀態需要關於圖形環境的信息來執行繪圖操作(例如,在屏幕上繪製該部分的地方)。

現在,當PieceState的繪圖方法需要額外的不同輸入並且此方法的聲明發生變化時(可能需要更多信息),對繪圖方法的調用必須一直改變。

結論和實際問題 所以基本上問題是:舊的情況下違反封裝,新的形勢不是也似乎可能不會像固體一樣實現的封裝原則。所以我的問題是:你有什麼想法來改進這種設計?你將如何實現拼圖,他們的狀態和繪製操作?

回答

3

建立一個PieceDrawer知道如何繪製一個Piece。我強烈建議如下分隔:

  • 模型類:保留並允許訪問和修改內部應用程序狀態,但不知道它們將如何被操縱或表示。你的Piece/PieceContoller/PuzzleController類應該屬於這裏。據我所見,PieceState應該被合併爲Piece(因爲它將不再包含那麼多的數據)。你的PuzzleController現在只知道如何修改模型類的狀態,但沒有關於用戶輸入。
  • 視圖+控制器類:嚴格用於UI。通過模型的高級方法訪問模型,但是儘可能地將實際的遊戲委託給模型。你的PieceDrawer和GamePanel(一個JPanel)類將落入這個類別。 GamePanel將負責收集用戶輸入並在PuzzleController中執行移動,然後用PieceDrawer繪製每一塊。

這個設置唯一難看的地方是PieceDrawer和Pieces之間的耦合。另一方面,你在一個地方擁有所有的聯繫,並且對於所有的作品,作品可能都是相似的。通過替換GamePanel和PieceDrawer,您可以將整個應用程序轉換爲基於文本的應用程序,而無需觸摸任何模型類。或者爲用戶提供片段表示的選擇(使PieceDrawer成爲一個界面,有幾個類實現它們)...

+0

有點晚了,但非常感謝這個制定良好的答案!我做了這樣的事情,現在模型和繪圖的邏輯更好地分開了。然而,我現在所擁有的可能仍然不是一個乾淨的MVC框架實現。 – Erik1984 2010-08-19 23:01:01

1

PieceState應該可能是Piece的內部類。然後DrawPiece可以使用PieceState來確定自己繪製的對象。

+0

感謝您的快速回復,抱歉我遲到的答案。 – Erik1984 2010-08-19 23:02:08