Методы поискового модуля


Конструктивная критика необходима для 2-х способов ниже. Я пытаюсь развить лучшие навыки ОО.

 // Set up scanner to allow for searching of modules 
public static String searchModule() {
    Scanner scan;
    System.out.print("Search module code: ");
    scan = new Scanner(System.in);
    String searchModule = scan.nextLine().trim();
    return searchModule;
}

// Search modules and return all students enrolled on it 
public static void moduleStudentSearch(Set<Module> modules, Set<Student> students) {
    String searchModule = searchModule();

    for (Module module : modules) {
        if (searchModule.equalsIgnoreCase(module.getName())) {
            Iterator it = students.iterator();
            while (it.hasNext()) {
                Student student = (Student) it.next();
                if (student.getModules().contains(module)) {
                    System.out.printf("%s ", student.getName());
                }
            }
        }
    }
}


438
4
задан 5 декабря 2011 в 11:12 Источник Поделиться
Комментарии
4 ответа


  1. Я бы переименовать searchModule метод readModuleName поскольку это не поиск, это просто читает имя искомого модуля.

  2. Вместо итераторов используйте новый цикл foreach (как вы уже используете его для модулей):

    for (Student student: students) {
    ...
    }

  3. Если вы используете итераторы установите параметр типа, который делает литье ненужное:

    final Iterator<Student> it = students.iterator(); // type parameter here
    while (it.hasNext()) {
    Student student = it.next(); // no casting here
    ...
    }

  4. Объявлять переменные при первом использовании:

    Scanner scan = new Scanner(System.in);

  5. Не забудьте закрыть на сканер, Это был плохой совет, так как он закрывает систему.в тоже. См. также: закрыть сканер привязано к системе.в

  6. Разделить moduleStudentSearch способ, он делает четыре вещи:


    • прочитайте искали имя модуля

    • поиск модуля по имени

    • студенческий поисковый модуль

    • печатать результаты

    Каждая функция должна иметь отдельный метод:

    public static void moduleStudentSearch(final Set<Module> modules, final Set<Student> students) {

    final String searchedModuleName = readModuleName();
    final Module module = searchModule(searchedModuleName, modules);
    if (module == null) {
    printNoModuleFound(searchedModuleName);
    return;
    }
    final Set<Student> studentsWithModule = getStudentsWithModule(students, module);
    printStudents(studentsWithModule);
    }

    private static void printNoModuleFound(String searchedModuleName) {
    System.out.println("No module found with name: " + searchedModuleName);
    }

    public static String readModuleName() {
    System.out.print("Search module code: ");
    final Scanner scan = new Scanner(System.in);
    try {
    final String searchModule = scan.nextLine().trim();
    return searchModule;
    } finally {
    scan.close();
    }
    }

    // you could return a list/set here if there are more than one results
    public static Module searchModule(final String searchedModuleName, final Set<Module> modules) {
    for (final Module module: modules) {
    final String moduleName = module.getName();
    if (searchedModuleName.equalsIgnoreCase(moduleName)) {
    return module;
    }
    }
    return null;
    }

    public static Set<Student> getStudentsWithModule(final Set<Student> students, final Module module) {
    final Set<Student> result = new LinkedHashSet<Student>();
    for (final Student student: students) {
    if (student.hasModule(module)) {
    result.add(student);
    }
    }
    return result;
    }

    private static void printStudents(final Set<Student> students) {
    for (final Student student: students) {
    System.out.print(student.getName());
    System.out.print(" ");
    }
    }


  7. Я хотел создать StudentManager и ModuleManager осуществляет классе. searchModule должны быть в ModuleManager осуществляет , и она должна использовать свои внутренние комплект модули поле вместо метода параметр. То же самое верно для getStudentsWithModule способ: это должно быть внутри StudentManager класс и он должен использовать свой внутренний набор студенты поле вместо метода параметр. Это результаты высокой сплоченности.

    Если у вас есть эти классы, снимите статический модификатор методов.


  8. Проверьте свой входной сигнал: проверка на значение nullс пустой строкойи т. д. и выбрасывают соответствующие исключения (обычно исключение NullPointerException или IllegalArgumentException) с полезное сообщение:

    public static Set<Student> getStudentsWithModule(final Set<Student> students, final Module module) {
    if (students == null ) {
    throw new NullPointerException("students cannot be null");
    }
    if (module == null) {
    throw new NullPointerException("module cannot be null");
    }
    ...
    }

10
ответ дан 5 декабря 2011 в 12:12 Источник Поделиться


  1. Поскольку вы говорите, что вы хотите улучшить свой ОО, почему методы статические?

  2. Если в документации написано, что это безопасный способ, чтобы использовать сканер, лучше предположить, что это может закончится-читайте в кэше и создавать проблемы. Создать один сканер вокруг системы.а затем повторно использовать его.

  3. Учитывая то, как вы используете модули , он должен ясно представлять карте вместо. Аналогично, учитывая то, как вы используете студентам кажется, что каждый модуль должен иметь набор.

  4. Используйте для ученика (студента : студенты) , а не итератор, если вам нужно удалить. (И хотя это время, так как я использовал Java и много, не итератор универсальный?)

5
ответ дан 5 декабря 2011 в 11:12 Источник Поделиться

От просто глядя на него, не зная, каковы ваши намерения, я бы сократить первый способ:

public static String searchModule() {
System.out.print("Search module code: ");
Scanner scanner = new Scanner(System.in);
return scanner.nextLine().trim();
}

Второй способ плохо им, может, что-то вроде searchStudentModules. Я также не уверен, почему вы не должны использовать цикл foreach, как вы делали для модулей.

public static void moduleStudentSearch(Set<Module> modules, Set<Student> students) {
String searchModule = searchModule();

for (Module module : modules) {
if (searchModule.equalsIgnoreCase(module.getName())) {
for (Student student : students) {
if (student.getModules().contains(module)) {
System.out.printf("%s ", student.getName());
}
}
}
}
}

Кроме того, использование javadoc является всегда предпочтительнее.

Но и послушать Питер Тейлор, который имеет некоторые действительные пункты.

1
ответ дан 5 декабря 2011 в 11:12 Источник Поделиться

Я предлагаю иметь три класса.


  1. Студент - это студент. Имеет имя и набор модулей.

  2. Модуль - представляет собой модуль. Имеет имя и набор учеников.

  3. Зачисление - это управляющий набор учеников и набор модулей.

Пример использования

Student jack = new Student("Jack");
Student jill= new Student("Jill");

Module english = new Module("English");
Module math = new Module("Math");

Enrollment enrollment = new Enrollment();
enrollment.addStudent(jack);
enrollment.addStudent(jill);

enrollment.addModule(english);
enrollment.addModule(math);

enrollment.enroll(jack, english);

enrollment.enroll(jill, math);
enrollment.enroll(jill, english);

Теперь вы должны задать себе следующие вопросы:


  • если у меня студент Джек, Джек знает, что модули/классы он берет? Другими словами, студент знать своих модулей?

  • аналогичные приведенным выше, но в противоположном направлении: не модуля знаю своих студентов?

Ваш ответ на эти вопросы будет вести свой дизайн. Будьте осторожны, так как некоторые варианты могут делать вещи ужасно сложный код, так что вы захотите пересмотреть ваш дизайн :)

Я хотел быть в состоянии сделать следующее:


  1. Создать студент. Студент может иметь 0 или одна модулей; ака студент может существовать с 0 модули определены/созданы.

  2. Создать модуль. Модуль может иметь 0 или одним учащимся; модуль ака может существовать с 0 учащихся определены/созданы.

  3. Выполнять запросы, например, сколько студентов в модуле "математика"? сколько модулей студент 'Джек' зачислены. Поэтому я создал класс регистрации.

1
ответ дан 5 декабря 2011 в 09:12 Источник Поделиться