我对这个序列图有一些怀疑,我在网上没有找到类似的例子,所以我不能比较我的解决方案.

本练习需要使用序列图对Directory类的listAllFiles方法的调用进行建模.

这是Java代码:

public class Directory { 
         public List<File> listAllFiles(String path) { 
                List<File> all = newArrayList<File>(); 
                File[] list = new File(path).listFiles(); 
                if(list != null) { 
                   for (File f:list) { 
                       if(f.isDirectory()) { 
                       
                           all.addAll(listAllFiles(f.getAbsolutePath())); 
                           
                       } else { 
                       
                            all.add(f.getAbsoluteFile()); 
                       }
                   } 
                } 
                  return all; 
           } 
}

这是我的序列图:

enter image description here

我按照回复中的建议修改了我的解决方案:

enter image description here

推荐答案

推荐

制作有用的序列图的第一个建议是 Select right level of abstraction.事实上,该图的价值在于以一种简单的方式显示了一些复杂的交互,这些交互在仅仅阅读代码时很难理解.

不幸的是,这里恰恰相反:当我们阅读代码时,我们会立即理解它.所有这一切主要是关于一个类的方法,使用标准的库元素,如FileList.但将其显示为序列图会使其看起来非常复杂.此外,想象一下维护代码时的挑战:您的图表将很快失go 同步,变得毫无用处.

简而言之:don't use UML for graphic programming.这并不是统一建模语言规范所禁止的,但它真的不值得这么做.

为了这项工作,尽管提出了上述建议

根本性的改善

生命线应该对应于对象,而不是类别.如果将其保持在类级别,则很难区分所循环的File数组和单个File.try 使用以下生命线::Directory(即类Directory的匿名对象)、all:List<File>list:File[]f:File.

如果您想要显示独立于对象的静态操作的用法,也可以使用FileArrayList<File>,但这会使图表比创建对象所需的更加复杂.相反,我建议以图形方式显示每个本地对象的create message,直接从创建者到生命线的头部,将对象直观地分配到正确的作用域.为了避免歧义,您还应该显示delete message(或至少显示X),特别是对于范围有限的对象,如f.

使用从消息开始的生命线头部的Create消息,您将特别清楚,某些对象仅在迭代期间存在.这将极大地提高对你意图的理解.事实上,如果我们看不到代码,我们就不能理解它.

小的改进

alt个后卫中,只放条件或else,但绝不放if.

您可以很好地显示消息的参数和返回结果的名称,但这不是强制的,在这里不会显著提高可理解性.

Java相关问答推荐

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

有关手动创建的包的问题

S的字符串表示是双重精确的吗?

Spring Boot Maven包

Mapstruct不能正确/完全映射属性

Java:使用Class.cast()将对象转换为原始数组

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

Javadoc在方法摘要中省略方法

如何将其他属性引用到log4j2 yaml配置中?

我怎样才能让IntelliJ标记toString()的任何实现?

使用正则表达式从字符串中提取多个值

将关闭拍卖的TimerService

错误:不兼容的类型:Double不能转换为Float

为什么在下面的Java泛型方法中没有类型限制?

在JDK Flight Recorder中只记录单个线程

如何在ApacheHttpClient 5中为单个请求设置代理?

java 11上出现DateTimeParseException,但java 8上没有

ExecutorService:如果我向Executor提交了太多任务,会发生什么?

如何使用命令行为Java应用程序生成烟雾测试用例

Jackson YAML:支持锚点扩展/覆盖