-2

就我被告知我需要的方法而言,我已经有了该程序所需的框架。但是,除此之外,我在弄清楚如何开始编写这个程序时遇到了麻烦。详细情况如下。 我不是要求为我完成我的程序,实际上我只是对如何开始感到困惑。我知道我需要读取用户输入来获取文本文件,我们在我的大学使用扫描仪,但我不知道这是否需要在构造函数中、main 中或其他方法中。

  1. 接受单个命令行参数 - 即包含行分隔的字符串对列表的文本文件。这些字符串对将表示依赖图中的边。例如,读取为:A.java B.java 的行表示从 A.java 到 B.java 的依赖边。表示上图的文件可能如下所示: Main.java A.java A.java B.java

  2. 将从文件中读取的每个字符串映射到唯一的整数标识符。这种映射将使将文件名转换为数组索引变得容易。

  3. 将每个唯一整数标识符(从上面)映射回原始字符串。

  4. 计算表示字符串之间依赖关系的邻接矩阵。

  5. 对邻接矩阵执行传递闭包操作以生成表示字符串之间传递依赖关系的新闭包矩阵。执行此操作的一种简单方法是 Floyd-Warshall 算法 - 您可能想对这个主题进行一些研究。

  6. 您的输出必须遵循课程网站上示例输出文件所示的格式。课程网站上有一个示例输入文件和相应的输出文件。在此示例中,您的输出必须具有相同的格式。目标是使输出信息具有有吸引力、可读的格式,清楚地表明下面列出的每个方法都可以正常工作。

  7. 具有私有字段返回类型的方法,例如 getNameIdMap、getIdNameMap、getRoots 等,而不是返回我们类的内部状态的可变部分,即应该返回该映射的副本(克隆)列表。这样,调用者就可以得到一个完全可用的对象(例如,列表或地图),而不会影响类的内部状态。

您的程序还应提供以下方法:

  1. public Map getNameIdMap() - 返回从字符串到唯一整数标识符的映射。整数标识符表示给定字符串的邻接矩阵和闭包矩阵的索引。注意:在 Python 中,返回值必须是一个字典,其中键是字符串,值是整数。

  2. public Map getIdNameMap() - 返回从唯一整数标识符到原始字符串的映射。注意:在 Python 中,返回值必须是一个字典,其中键是整数,值是字符串。

  3. public int[][] getDependenceGraph() - 返回表示文件之间依赖关系的邻接矩阵。

  4. public int[][] getTransitiveDependenceGraph() - 在应用传递闭包操作后返回依赖图。

  5. public List getRoots() - 返回一个字符串列表,这些字符串对应于没有其他文件依赖的文件(例如,上面示例中的 Main)。注意:在 Python 中,返回值也是一个字符串列表。

  6. public List getLeaves() - 返回一个字符串列表,这些字符串对应于不依赖其他文件的文件(例如,上例中的 B)。注意:在 Python 中,返回值也是一个字符串列表。

  7. public void removeLeaf(String leaf) - 从邻接和传递闭包矩阵中删除一个叶子。这意味着如果 X 依赖于 Y 并且 Y 是被移除的叶子,那么 X 对 Y 的依赖也会被消除。这可能会或可能不会使 X 成为新的叶子。考虑在矩阵中使用一个特殊的数字(即,除了 0 和 1)来表示该文件已被逻辑删除。

  8. public List firewall(String node) - 计算指定文件的“类防火墙”。在软件工程中,类防火墙概念指出,当对系统进行维护时,只有更改的类和受更改影响的类需要重新测试。注意:在 Python 中,返回值也是一个字符串列表。对于此方法,您应该重新测试间接和直接受影响的类。例如,如果 A 类依赖于 B 类,B 类依赖于 C 类,而你更改了 C 类,那么你应该重新测试 A 类和 B 类。

  9. public void printParallelGroups() - 假设我们想要并行编译文件,我们需要识别不会触发其他文件编译的文件;这些是依赖图中的叶子。此方法识别可以并行编译的文件,打印该文件列表,并将它们从图中删除。该方法应重复此过程,直到所有文件都已“编译”。

4

1 回答 1

0

在开始编写一些代码时,我多次遇到类似的情况。我认为,您对您的问题有一个很好的了解。您可以制作一个包含 2-3 个值的示例文本文件(甚至在一张纸上),并尝试更多地考虑您想要的东西。您知道需要有一个 main 方法来获取您的文件名。您可以在 main 或构造函数或任何其他方法中使用扫描仪。这取决于您使用的设计。如果你想要一个非常基本的程序,你可以在 main 方法中声明它并继续。但我建议您应该使用另一种方法从文件中获取输入,例如 readInputFromText(),您可以在其中声明本地扫描仪对象。你当然也可以通过其他方式做到这一点。我遵循的一些基本规则是:

  1. 每个任务都有单独的方法。要打开文件,我有一个 fileOpener,要关闭它,我有另一种方法等。每种方法都应该只执行一项任务。所有与文件相关的函数都将放在一个类中,例如 FileUtil。这是一个实用程序任务,而不是您的主要任务,因此您将所有这些实用程序类(如 FileUtilities、StringUtilities、DatabaseUtilites 等)保存在 Util 包中。

    1. 良好的命名策略和遵循约定。

    2. 使用 Maven 或 Ant 等构建工具。

    3. 做文档和适当的测试。

我不知道它是否真的以某种方式回答了你的问题。但是请记住这些并开始您的程序。在每个阶段进行测试并制作一个主要版本。保留后续版本的改进。

如果您有具体问题,一个大社区正在等着您:)

最好的祝愿。

于 2014-10-22T05:54:16.023 回答