我正在創建一個小型益智遊戲,就像一個愛好項目一樣,但是項目現在已經達到了有相當多代碼(大約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的繪圖方法需要額外的不同輸入並且此方法的聲明發生變化時(可能需要更多信息),對繪圖方法的調用必須一直改變。
結論和實際問題 所以基本上問題是:舊的情況下違反封裝,新的形勢不是也似乎可能不會像固體一樣實現的封裝原則。所以我的問題是:你有什麼想法來改進這種設計?你將如何實現拼圖,他們的狀態和繪製操作?
有點晚了,但非常感謝這個制定良好的答案!我做了這樣的事情,現在模型和繪圖的邏輯更好地分開了。然而,我現在所擁有的可能仍然不是一個乾淨的MVC框架實現。 – Erik1984 2010-08-19 23:01:01