タイプチェックはしないでください.


チェスタスクを行う過程で,タイプチェックと鋳造コードを記述した.
私がコードを書くときもよく分からないので、コメントを受けたいのですが、このコメンテーターは타입 체크 및 캐스팅은 객체지향적이지 않다のコメントをくれました.なぜタイプチェックやキャラクター選択が対象ではないのか知りたいです.


1.過剰な責任

Piece : Board야 그거 내가 할 일 같은데 왜 니가해?
Board : 그니까 힘들어죽겄어;;
器物(Piece)に「販促してもらえますか?」聞くのではなく、
組織を管理するオブジェクトは、タイプチェックによって組織のタイプを決定し、アップグレード可能性を返します.
Boardは器物のアップグレード性とアップグレード性を管理する責任を負いすぎた.
最終的に、タイプチェックの目的は、タイプチェック結果のアクションを決定および実行することです.
もしそうであれば、タイプチェックを実行するオブジェクトは、結果によっていくつかの操作を実行します.
適切な責任配分を行わずに、そのオブジェクトに過剰な責任を集中します.

2.カプセル化障害

private static final Map<Class<? extends Piece>, String> symbolsByPiece = Map.of(
        King.class, "k", Queen.class, "q",
        Bishop.class, "b", Knight.class, "n",
        Rook.class, "r", Pawn.class, "p"
);

private void printPieceSymbol(final Piece piece) {
	final String symbol = symbolsByPiece.get(piece.getClass());
	System.out.print(symbol);
}
記号は、各機関ではなく外部で管理されます.
さらに重要なのは、以下のように、各器物管理記号です.
器物に情報を送るのはカプセル化したほうがいいと思います.
public class King {

	private static final String SYMBOL = "k";

	public String getSymbol() {
		return SYMBOL;
	}
}

public class Queen {

	private static final String SYMBOL = "q";

	public String getSymbol() {
		return SYMBOL;
	}
}
private void printPieceSymbol(final Piece piece) {
	final String symbol = piece.getSymbol();
	System.out.print(symbol);
}

3、国境が弱い。

public abstract class Animal {
		
}

public class Tiger extends Animal {

}

public class Bear extends Animal {

}

public class Giraffe extends Animal {

}
public void getSpecies(final Animal animal) {
	if (animal instanceof Tiger) {
		return "tiger";
	} else if (animal instanceof Bear) {
		return "bear";
	}
	return "giraffe";
}
以上のようにinstanceofで論理を実現する場合、他の動物を追加するとどうなりますか?
分岐ゲートは、動物種情報が必要なすべての場所に追加する必要があります.また,分岐文が多くなり,コードの複雑さも増す.
逆に、instanceofを使用しない場合は、機能をAnimalに抽象化し、サブオブジェクトにその機能を実装させることができます.
新しい動物オブジェクトを作成するだけです.
public abstract class Animal {
	String getSpecies();
}

public class Tiger extends Animal {

	public String getSpecies() {
		return "tiger"
	}
}

public class Bear extends Animal {

	public String getSpecies() {
		return "bear"
		
}

public class Giraffe extends Animal {

	public String getSpecies() {
		return "giraffe"
	}
}

//새로운 동물을 작성하기만 하면된다.
public class Giraffe extends Animal {

	public String getSpecies() {
		return "giraffe"
	}
}
public void getSpecies(final Animal animal) {
	final String species = animal.getSpecies();
}
実際、この文章を書く過程で、私はなぜinstanceofを使うのかを考えました.
上記の問題があるので、instanceofは避けて抽象的に使用したほうがいいと思います.
にこにこ