2014-10-22 4 views
-2

У меня уже есть скелет того, что мне нужно для программы, насколько мне было сказано, что мне нужно. Однако, кроме этого, мне трудно понять, как начать кодирование этой программы. Подробности следующие. Я не прошу, чтобы моя программа была сделана для меня, буквально я просто путаюсь, как начать. Я знаю, что мне нужно читать входные данные пользователя, чтобы получить текстовый файл, мы используем сканер в моем колледже, но я не знаю, должно ли это быть в конструкторе, в основном или в другом методе.Как начать с этих деталей

  1. принимает один параметр командной строки, а именно - текстовый файл, который содержит строку с разделителями списка пара строк. Эти пары String будут представлять ребра в графике зависимости. Например, строка, которая гласит: A.java B.java представляет собой границу зависимости от A.java до B.java. Файл, представляющий график выше, может выглядеть так: Main.java A.java A.java B.java

  2. Отображает каждую из строк, считанных из файла, уникальными целыми идентификаторами. Это сопоставление упростит превращение имени файла в индекс массива.

  3. Карты каждого из уникальных идентификаторов целого числа (сверху) возвращаются к исходной строке.

  4. Вычисляет матрицу смежности, представляющую зависимости между строками.

  5. Выполняет транзитивную операцию закрытия на матрице смежности для создания новой матрицы замыкания, которая представляет транзитивные зависимости между строками. Простым подходом к выполнению этой операции является алгоритм Флойда-Варшалла - вы можете сделать некоторые исследования по этой теме.

  6. Ваш выход должен соответствовать формату, показанному в примере выходного файла на веб-сайте курса. На веб-сайте курса приведен пример входного файла и соответствующего выходного файла. В этом примере ваш вывод должен иметь тот же формат. Цель состоит в том, чтобы иметь выходную информацию в привлекательном, читаемом формате, который ясно показывает, что каждый из перечисленных ниже методов работает правильно.

  7. Метода с частными типами возвратного поля, такими как getNameIdMap, getIdNameMap, getRoots и т.д., а , чем возвращение изменяемой части внутреннего состояния нашего класса, что копия (клон) этой карты, список должен быть возвращена. Таким образом, вызывающий объект получает полностью используемый объект (например, список или карту), не влияя на внутреннее состояние класса.

Ваша программа должна также предоставить следующие методы:

  1. общественность Карта getNameIdMap() - возвращает отображение строки к уникальному целому идентификатору. Целочисленный идентификатор представляет индекс в матрицы смежности и замыкания для данной строки. Примечание. В Python возвращаемое значение должно быть словарем с парами с ключами, которые являются строками, а значениями являются ints.

  2. public Map getIdNameMap() - возвращает сопоставление от уникального целочисленного идентификатора назад к исходной строке. Примечание. В Python возвращаемое значение должно быть словарем с парами с ключами, которые являются ints, а значениями являются строки.

  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. Открытый брандмауэр (String node) - вычисляет «брандмауэр класса» указанного файла. В разработке программного обеспечения концепция брандмауэра класса гласит, что при проведении технического обслуживания в системе необходимо повторно тестировать только измененные классы и классы, затронутые изменением. Примечание. В Python возвращаемое значение также является списком строк. Для этого метода вы должны повторно тестировать классы, которые косвенно и напрямую затрагиваются. Например, если класс A зависит от класса B, а класс B зависит от класса C, и вы меняете класс C, то вы должны повторять тесты классов A и B.

  9. public void printParallelGroups() - Предполагая, что мы хотели распараллелить компиляции файлов, нам нужно будет идентифицировать файлы, которые не будут запускать компиляцию других файлов; это листья в графе зависимостей. Этот метод идентифицирует файлы, которые могут быть скомпилированы параллельно, распечатать список файлов и удалить их из графика. Метод должен повторять этот процесс, пока все файлы не будут «скомпилированы».

+3

Добро пожаловать в StackOverflow. Мы хотели бы помочь вам с конкретными вопросами, но мы не делаем домашнее задание из спецификации, и мы не являемся наставничеством. Пожалуйста, прочитайте инструкции о том, как задать хороший вопрос: http://stackoverflow.com/help, и вернитесь, когда у вас есть хороший вопрос. Если вы не знаете, как начать писать программу, вы еще не готовы задавать вопросы. – GreenAsJade

ответ

0

Я сталкивался с подобными ситуациями много раз, начиная писать какую-то часть кода. Я думаю, у вас есть неплохая идея о вашей проблеме. Вы можете сделать образец текстового файла (даже на листе бумаги) с 2-3 значениями и попытаться больше думать о том, как вы хотите. Вы знаете, что должен быть основной метод, который принимает ваше имя файла. Вы можете использовать сканер в основном или в конструкторе или любым другим способом. Это зависит от дизайна, который вы используете. Если вам нужна очень простая программа, вы можете объявить ее в основном методе и продолжить. Но я предлагаю вам использовать другой метод для ввода ввода из файла, например readInputFromText(), где вы объявляете локальный объект сканера. Вы также можете сделать это и другими способами. Некоторые основные правила я следую являются:

  1. Есть отдельные методы для каждой задачи. Чтобы открыть файл, у меня есть fileOpener, чтобы закрыть его, у меня есть другой метод и т. Д. Каждый метод должен выполнять только одну задачу. Все функции, связанные с файлом, будут помещены в один класс, скажем, FileUtil. Это служебная задача, а не ваша основная задача, поэтому вы храните все эти классы использования, такие как FileUtilities, StringUtilities, DatabaseUtilites и т. Д. В пакете Util.

    1. Хорошие стратегии именования и последующие соглашения.

    2. Использование инструмента построения, такого как Maven или Ant.

    3. Выполнение документации и надлежащее тестирование.

Я не знаю, если это действительно отвечает на ваш вопрос как-нибудь. Но имейте это в виду и начинайте свою программу. Испытайте на каждом этапе и сделайте основную версию. Сохраните улучшения для последующих версий.

Если у вас есть конкретные вопросы, большое сообщество ждет вас :)

С наилучшими пожеланиями.

Смежные вопросы