タイプチェックはしないでください.
チェスタスクを行う過程で,タイプチェックと鋳造コードを記述した.
私がコードを書くときもよく分からないので、コメントを受けたいのですが、このコメンテーターは
組織を管理するオブジェクトは、タイプチェックによって組織のタイプを決定し、アップグレード可能性を返します.
Boardは器物のアップグレード性とアップグレード性を管理する責任を負いすぎた.
最終的に、タイプチェックの目的は、タイプチェック結果のアクションを決定および実行することです.
もしそうであれば、タイプチェックを実行するオブジェクトは、結果によっていくつかの操作を実行します.
適切な責任配分を行わずに、そのオブジェクトに過剰な責任を集中します.
さらに重要なのは、以下のように、各器物管理記号です.
器物に情報を送るのはカプセル化したほうがいいと思います.
分岐ゲートは、動物種情報が必要なすべての場所に追加する必要があります.また,分岐文が多くなり,コードの複雑さも増す.
逆に、instanceofを使用しない場合は、機能をAnimalに抽象化し、サブオブジェクトにその機能を実装させることができます.
新しい動物オブジェクトを作成するだけです.
上記の問題があるので、instanceofは避けて抽象的に使用したほうがいいと思います.
にこにこ
私がコードを書くときもよく分からないので、コメントを受けたいのですが、このコメンテーターは
타입 체크 및 캐스팅은 객체지향적이지 않다
のコメントをくれました.なぜタイプチェックやキャラクター選択が対象ではないのか知りたいです.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は避けて抽象的に使用したほうがいいと思います.
にこにこ
Reference
この問題について(タイプチェックはしないでください.), 我々は、より多くの情報をここで見つけました https://velog.io/@byeongju/타입-체크를-지양하자テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol