2014-10-22 76 views
-2

我已经有了我所需要的程序框架,只要我被告知我需要的方法。但是,除此之外,我无法确定如何开始编写此程序。详情如下。 我并不是要求为我完成我的程序,实际上我只是对如何开始感到困惑。我知道我需要阅读用户输入来获取文本文件,我们在我的大学使用扫描仪,但我不知道是否需要在构造函数中,主要方法或其他方法中。如何从这些细节开始

  1. 接受一个命令行参数 - 即一个包含行的文本文件分隔字符串对列表。这些String对将表示依赖图中的边。例如,一行代码如下: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. 公共地图getNameIdMap() - 返回从字符串到唯一的整数 标识符的映射。整数标识符表示给定字符串的相邻矩阵和闭包矩阵的索引。注意:在Python中,返回值必须是带有对的字典,其中键是字符串,值是整数。

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

  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() - 假设我们要并行化编译这些文件时,我们需要识别不会触发其他文件编译的文件;这些是依赖图中的叶子。此方法识别可以并行编译的文件,打印该文件列表并将其从图中删除。该方法应该重复这个过程,直到所有文件被“编译”。

+3

欢迎来到StackOverflow。我们很乐意为您提供具体的问题,但我们不会从规范中做功课,我们也不是指导服务。请阅读关于如何提出一个好问题的指导原则:http://stackoverflow.com/help,并在您有一个很好的问题时回来。如果你不知道如何开始编写程序,你还没有准备好在这里提问。 – GreenAsJade 2014-10-22 05:19:54

回答

0

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

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

    1. 良好的命名策略和以下约定。

    2. 使用像Maven或Ant这样的构建工具。

    3. 做文档和正确的测试。

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

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

最良好的祝愿。