私はオンラインチェスゲームを設計しようとしています(必要なクラスを構成しています)。移動を検証するためのより良いオプションを選択するためのいくつかの提案が必要です。だから、言っておきましょう、私はクラスの下にいます
オプション1:私の最初の思考プロセスは、バリデーターファクトリーを定義し、各ピースに固有のバリデーターのセットを持つことでした。
Public class Game{
private String id;
private Player player1;
private Player player2;
private GameStatus status;
private Board board;
private Color currentTurn ; //who have to make move now?
private static Map<PieceType , List<IValidate>> validators;
static {
validators = initialize_the_appropriate_validators
}
public boolean makeMove(Move move){
PieceType type = move.getPiece().getType() ;
for(Ivalidate validator : validators.get(type)){
if(!validator.validate())
throw new InvalidMoveException("Move not allowed!");
}
.............
}
}
public class KnightMovesValidator implements Ivalidate{
public boolean validate(Move){
//TODO: vlidate if it is proper move based on the piece
}
}
public class Box{
private int x ;
private int y ;
private Piece piece;
}
public Board{
private Box [][] boxes;
}
public class Move{
private Box src;
private Box dest;
private Piece piece;
private Player player;
}
public enum PieceType{
KINGHT , ROOK , KING , QUEEN .......
}
public enum color{
BLACK,WHITE
}
public class Piece{
private PieceType type;
private Color color;
private boolean isKilled;
}
オプション2:実装を検証するためにインターネットで検索したとき。いろいろなところに以下のデザインを見つけました。
Public Knight extends Piece{
public boolean canMove(Box src , Box dest) {
//TODO : implement
}
}
アイデアは、外部バリデーターを持つ代わりにです。各ピースは、要求された移動が可能かどうかを示しています。それは私のデザインよりも私によく聞こえます。しかし、まだ質問があります... Boxはピースを保持しているため、ピースクラスを認識しています。
ピースはボックス(その場所)を認識している必要がありますか?ピースはBoxから独立していてはいけませんか?
これはPOJOを設計する正しい方法ですか?その背後にある思考プロセスは何ですか?少し光をください。
ありがとう。
あなたが本当にオブジェクト指向を練習したいなら、ここで従うのは完全に簡単なルールです:
ゲッターを持っていない!
これにより、設計は実際の責任を強制的に割り当て、ほぼ確実に デメテルの法則 、教えないでください、およびオブジェクト指向の他の重要な原則に従います。
物事は無生物なので行動を起こすことができないと人々に言わせないでください。オブジェクト指向では、すべてのものが生きます。すべてのオブジェクトには動作、プライバシー、および独自の機能があります。オブジェクト指向で物事を擬人化することは望ましいです。
この時点でのデザインはこれとはほど遠いので、かなりの作業が必要になりますが、不正行為を行わずにうまく管理できた場合(このルールを不正行為する方法があります:)、率直に言って、多くの人が持っていないオブジェクト指向の経験。