Java 我的UML图对于所附代码正确吗?

Java 我的UML图对于所附代码正确吗?,java,uml,Java,Uml,我的教授给了我们这个程序,但根本没有向我们解释UML,我想知道我是否正确地绘制了这个图表 代码: p1包; 公共类MyProg{ 静态积分i=5; 私有整数j=新整数(10); 受保护双k=2.5; 公共MyProg(){} 公共静态void main(字符串[]args){ MyProg mp=新的MyProg(); } void m1(){ System.out.println(“你好,世界!”); } 空m1(字符串str,int n){ 对于(int k=0;k

我的教授给了我们这个程序,但根本没有向我们解释UML,我想知道我是否正确地绘制了这个图表

代码:

p1包;
公共类MyProg{
静态积分i=5;
私有整数j=新整数(10);
受保护双k=2.5;
公共MyProg(){}
公共静态void main(字符串[]args){
MyProg mp=新的MyProg();
}
void m1(){
System.out.println(“你好,世界!”);
}
空m1(字符串str,int n){
对于(int k=0;k

我自己从来没有太过执着于UML的细节(我肯定看到过设计会议深入讨论UML的细节,而不是设计本身),但有几个小问题:

  • 您通常不希望在类图上包含私有变量、方法等,因为这是一个实现细节(而不是设计细节)编辑:这一点可能在某种程度上取决于图表的目的-有些人会认为,在某些情况下(例如,如果您的主要目的是传达您的实现而不是设计),包含这些内容是可以接受的
  • 其中一些方法(例如,
    double getK()
    )缺少访问修饰符。虽然从技术上讲,依赖默认值是合法的,但最好明确说明您的意图
在您的图表上:

  • 如前所述,i和j不是字符串
  • 在主操作args中,参数是某种数组,因此缺少多重性指示器(在结束圆括号之前的方括号中为星号)。因此,行应该看起来像
    +main(在args:String[*])
    。当然
  • 在m1操作中,n应具有未指定的类型
  • 初始值应如注释中所述指定
  • 您可以在MyProg操作中使用标准原型将其标记为构造函数。一些书籍建议不要对构造函数建模,除非它是非标准的(即需要一些参数)
  • 我会非常小心参数的in-vs-inout指示器。在Java中,对象默认通过引用传递,这意味着参数是inout,而不是In。在C++中,相反的情况是,参数通过值传递,即在.
  • 中。
      最好将所有答案粘贴到一个答案中

      • 在程序中,您使用
        Integer
        String
        Double
        (我猜是类),有时还混合使用
        int
        ,而在类图中,您使用所有小写(原语)并始终使用
        Integer
        。这应该是一致的

      在我的观点中:1.在我的观点中:1。您不必将参数名添加到类图中。(你的主语是args和m1的str和n)2。您的主方法参数类型不正确(它是String[],而不是String)3。这里很难说in或out参数,因为它应该来自设计视图,而不是代码。您也可以在UML中详细说明初始值:i:int=5i和j不是字符串,而是int和Integer。UML中的基本类型是整数、字符串、布尔、实数和无限制自然数(参见UML规范21.2),因此我不知道如何指出UML中Java类型int和Integer之间的区别。Java中的默认可见性是“package”,但UML中的默认可见性是“public”(UML规范7.8.12.5)。要在UML中表示“包”可见性,请使用波浪号(~)。是否显示私有属性取决于图表的级别。据我所知,任务是对实际代码进行建模(记录),在这种情况下,使用私有属性是完全可以的。此外,您可能希望显示某些信息已存储但未公开,或者某些行为甚至在建模级别内部存在,然后您也将此类属性建模为私有属性。@www.admiralit.nl似乎在9.5.4中列出了可见性“+”、“-”、“#”和“~”,但没有定义任何地方,直到现在我还没有在任何地方发现瓷砖。EA似乎使用了一个破折号,就像用于private一样。@ThomasKilian,我在UML规范中也找不到符号的定义。我已经检查了EA 9和EA 12,它们都使用瓷砖作为可见性“包”。如果你放大,你可以看到它。@Ister:7.8.24.3节没有说“+”表示公共,“-”表示私人等等。第二个项目符号不太正确。args参数的字符串数组类型可以在UML中指定如下:+main(在args中:string[*])@www.admiralit.nl您是对的。谢谢你的提醒。我已经相应地更正了答案,并添加了一个示例来说明问题。非常感谢大家的帮助!
      package p1;
      public class MyProg {
          static int i = 5;
          private Integer j = new Integer(10);
          protected double k = 2.5;
          public MyProg() {}
      
          public static void main(String[] args) {  
              MyProg mp = new MyProg();  
          }
      
          void m1(){
              System.out.println("Hello World!");
          }
      
          void m1(String str, int n){
              for(int k = 0; k < n; k++)
                  System.out.println(str);
          }
      
          public static int getI(){   
              return MyProg.i;  
          }
      
          protected Integer getJ(){   
              return new Integer(j);
          }
      
          double getK(){  
             return new Double(k);   
          }
      }