我接到了一项作业,其中我必须实现一个小程序来模拟一个太阳系,该太阳系有一个太阳和行星围绕,并且行星必须有卫星围绕行星运行。我已经成功地实现了动画,但为了获得完整的信用,我们需要使用以下 UML:


我知道该框架有一个 Sun 的实例,并且 Sun 实现了接口(interface) Orbit 中的方法,并且有一个使用 OrbitingBody 构造函数创建的 Planet 实例,等等......我不理解的是 UML 中的关系在接口(interface) Orbit 和抽象类 OrbitingBody 之间。

/****************************************************************/
import java.awt.*;

@SuppressWarnings("serial")
public class Sun implements Orbit {
    private Dimension dim;
    private OrbitingBody earth;
    private OrbitingBody mars;
    //Other vars

    public void init(Dimension dim) {
        // CODE irrelevant for the question
    }

    public void setPlanetPosition() {
        // CODE irrelevant for the question
    }

    public int calX(int distance, int angle){
        // CODE irrelevant for the question
    }
    public int calY(int distance, int angle){
       // CODE irrelevant for the question
    }

    public void draw(Graphics g) {
        // CODE irrelevant for the question
    }
}


/****************************************************************/
import java.awt.*;

@SuppressWarnings("serial")
public class Planet extends OrbitingBody implements Orbit {
    private Moon moon;
    private Moon eris;


    Planet(int x, int y, Color color) {
        super.x = x;
        super.y = y;
        moon = new Moon();
        eris = new Moon();
        this.color = color;
    }

    public int calX(int distance, int angle){
        // CODE irrelevant for the question
    }
    public int calY(int distance, int angle){
        // CODE irrelevant for the question
    }
}



/****************************************************************/
  public interface Orbit {
    int calX(int distance, int angle);
    int calY(int distance, int angle);
}



/****************************************************************/
   import java.awt.*;

public abstract class OrbitingBody {
    protected Color color;
    protected int x, y;
    protected int radius = 25;

    void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void draw(Graphics g) {
        // CODE irrelevant for the question
    }
}

最佳答案

我能理解你的困惑。
我自己无法理解 UML 图的目的(我以此为生)。
UML 图的问题

  • 每个关联使用 聚合 (关联末尾的空心菱形)。聚合表示整体部分关系。我在图表上的任何关联中都没有看到这一点。 PlanetSun 部分或 MoonPlanet 部分如何?
  • «Orbit»{Orbiting Body} 的 UML 符号是错误的。我猜 Orbit 是一个接口(interface)?在这种情况下,正确的表示法是使用 Lollipop 表示法,或者在名称前使用关键字 «interface» 的标准框。至于 Orbiting Body ,大括号仅在 UML 中用于表示约束。我又在猜测你的老师打算指出一个 抽象 类?在这种情况下,正确的做法是使用斜体作为名称,因此 Orbiting Body
  • 'Orbiting Body' 和 'Orbit' 之间的聚合没有任何意义。正如现在所写, OrbitOrbiting Body 的一部分。我可以理解 Orbiting BodyOrbit 之间是否存在正常关联
  • 'Orbiting Body and 'Orbit 之间的关联方向与 SunPlanet 以及 PlanetMoon 之间的关联方向相反。我认为实现 OrbitOrbiting Body 的类之间的关联将是对该关联的某种重新定义,但在这种情况下,方向需要相同。 (并且还需要指明重新定义)。
    按照现在的设计,应该有两个关联,您需要实现 SunPlanet 之间的关联以及 PlanetMoon 之间的关联。每个方向一个。

  • 我建议你忽略实际 UML 图的细节,因为它的不一致并使用你自己的判断。程序员应该不仅仅是一个在代码中翻译 UML 的无意识的代码猴子。您应该自己思考并(如果可能)挑战和/或改进分析。
    您的代码中的问题:
  • 考虑如何实现 Orbiting Bodies ( Planet , Moon ) 和 Orbits ( Sun , Planet ) 之间的关系。
  • 在哪个方向你需要那个?
  • 你是在一般层面需要它还是只在具体层面需要它

  • 为什么在 Moon 类上有两个 Planet 类型的属性?。一个 Planet 不能有超过 2 个 Moon 吗?我期待某种 Moon s
  • 列表
  • Sun 相关的 Planet 类的相同注释。
  • 关于java - UML 中的接口(interface)和抽象类聚合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49567460/

    10-09 22:20