5

グラフィックにいくつかの関数を描画できるアプリケーションを設計しています。各関数は、このグラフィッククラスに渡す一連のポイントから描画されます。

ポイントにはさまざまな種類があり、すべてMyPointクラスから継承されます。ある種のポイントについては、そのまま画面に印刷するだけで、他のポイントは無視でき、他のポイントは追加されるため、複雑になる可能性のあるロジックが関連付けられています。

ここでは、実際にグラフィックを描画する方法は主要な問題ではありません。気になるのは、このGraphicMakerクラスがいわゆる神オブジェクトにならないようにコードロジックを作成する方法です。

次のようなものを作成するのは簡単です。

class GraphicMaker {
    ArrayList<Point> points = new ArrayList<Point>();

    public void AddPoint(Point point) {
        points.add(point);
    }

    public void DoDrawing() {
        foreach (Point point in points) {
            if (point is PointA) {
                //some logic here
            else if (point is PointXYZ) {
                //...etc
            }
        }
    }
}

このようなことをどのように行いますか?正しい方法は、各Pointオブジェクトに描画ロジックを配置することだと思います(したがって、Pointの各子クラスはそれ自体を描画する方法を知っています)が、2つの問題が発生します。

  1. 自分自身を描画する方法を知るために、GraphicObjectクラスに存在する他のすべてのポイントを知る必要がある種類のポイントがあります。
  2. グラフィッククラスから多くのメソッド/プロパティを公開できるので、すべてのポイントがグラフィッククラスへの参照を持ち、必要に応じてすべてのロジックを作成できますが、それほど大きな代償はありません。神のクラスを持ちたいですか?
4

2 に答える 2

4

私はあなたが提案したように行い、各ポイントがそれ自体を描画する責任を負い、他のポイントの配列をそれに渡します:

interface ICanDraw {
    void Draw(ArrayList<Point> allPoints);
}

public abstract class Point : ICanDraw {
    ...
}

public PoniePoint : Point {
    public void Draw(ArrayList<Point> allPoints) {
        // do drawing logic here
    }
}

グラフィックメーカーの場合:

public void DoDrawing() {
    foreach (Point point in points) {
        point.Draw(points);
    }
}

(私の Java は少し錆びているので、構文的に 100% 正しい Java ではないかもしれませんが、私の提案を伝えていると思います)。

于 2010-04-07T03:07:38.667 に答える
3

Point の各サブクラスには、基本 Point クラスの描画メソッドをオーバーライドする独自の描画メソッドが必要です。

描画メソッドは、グラフィックス オブジェクトへの参照を取得する必要があります。これには、描画メソッドの一部が必要とするものの 1 つである場合は、ポイントのリストを含む、ポイント描画メソッドで使用する必要があるすべてのパブリック メソッド/プロパティが必要です。 .

グラフィックス クラスでパブリック メソッドを作成することについて、なぜ懸念しているのですか? コードが大きくなると、すべてを実行する 1 つの巨大なメソッドよりも、いくつかの追加の可視メソッドの方が混乱しにくくなります。

于 2010-04-07T03:09:05.387 に答える