有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

c#设计一个类,使其不会成为“上帝对象”

我正在设计一个应用程序,可以在图形上绘制一些函数。每个函数都将从我将传递给这个图形类的一组点中绘制

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

如何实际绘制图形不是这里的主要问题。困扰我的是如何使代码逻辑,这样GraphicMaker类就不会成为所谓的God对象

制作这样的东西很容易:

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的每个子类都会知道如何绘制自己),但会出现两个问题:

  1. 有些点需要知道GraphicObject类中存在的所有其他点,才能知道如何绘制它们自己
  2. 我可以公开Graphic类中的很多方法/属性,这样所有的点都有一个Graphic类的引用,并且可以按照他们的意愿进行所有的逻辑,但是不想拥有一个God类,这不是一个很大的代价吗

共 (2) 个答案

  1. # 1 楼答案

    Point的每个子类都应该有自己的绘图方法,覆盖基点类中的绘图方法,这是正确的

    绘图方法应参考图形对象,图形对象应具有点绘图方法中需要使用的任何内容的公共方法/属性,包括点列表(如果这是某些绘图方法需要的内容之一)

    你为什么担心在图形课上公开方法?一旦代码增长,几个额外的可见方法比一个完成所有事情的巨大方法要简单得多

  2. # 2 楼答案

    我会按照你的建议做,让每个点负责绘制自己,并将其他点的数组传递给它:

    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
        }
    }
    

    对于GraphicMaker:

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

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