以不会成为"上帝对象"的方式设计课程

dev*_*ium 5 c# java oop design-patterns god-object

我正在设计一个允许我在图形上绘制一些函数的应用程序.每个函数都将从我将传递给此图形类的一组点中提取.

有不同类型的点,都是从MyPoint类继承的.对于某种点,它只是将它们按原样打印在屏幕上,其他点可以被忽略,其他的则被添加,因此存在某种与它们相关的逻辑可能变得复杂.

如何实际绘制图形不是这里的主要问题.困扰我的是如何使代码逻辑使得这个GraphicMaker类不会成为所谓的God-Object.

制作这样的东西会很容易:

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你会怎么做这样的事情?我有一种感觉,正确的方法是将绘图逻辑放在每个Point对象上(因此Point中的每个子类都知道如何绘制自己),但会出现两个问题:

  1. 有些点需要知道GraphicObject类中存在的所有其他点才能知道如何绘制自己.
  2. 我可以从Graphic类公开制作很多方法/属性,这样所有的点都可以引用Graphic类,并且可以根据需要制作所有的逻辑,但这不是一个很大的代价.想要上神课吗?

Mic*_*ins 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
    }
}
Run Code Online (Sandbox Code Playgroud)

对于您的图形制作者:

public void DoDrawing() {
    foreach (Point point in points) {
        point.Draw(points);
    }
}
Run Code Online (Sandbox Code Playgroud)

(我的 Java 有点生疏,所以这可能不是 100% 语法正确的 Java,但我认为它传达了我的建议)。

  • 请查看现有系统以获取灵感。在 Swing 中,每个组件都有自己的 Paint(),并传递一个 Grapics 对象。容器/布局/组件方法允许某些组件影响其他(包含的)组件。不过,我不会将列表传递给 Point's Draw。我将向 GraphicsObject 添加一个查询,该查询返回其他点的列表。比如具有某种类型、一定距离内、相同颜色的点等。 (3认同)