Могут ли наследование и полиморфизм сделать мой код менее избыточным? - PullRequest
0 голосов
/ 03 октября 2018

общедоступный класс Студент

   private String name;
   private String id;
   private static double grade;
   private Midterm midtermScore;
   private FinalExam finalExamScore;

   public Student() {
      super();
   }

   public Student(String name, String id, Midterm midtermScore, FinalExam 
      finalExamScore) {
      this.name = name;
      this.id = id;
      this.midtermScore = midtermScore;
      this.finalExamScore = finalExamScore;
   }

   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }

   public double getGrade() {
      grade = midtermScore.getMidtermScore() + 
      finalExamScore.getTotalScore();
      return grade;
   }

общедоступный класс Midterm

    private int numberOfQuestions;
    private int numberOfQuestionsCorrect;
    private final double WEIGHT = 0.4;
    private double midtermScore;

    public Midterm(int numberOfQuestions, int numberOfQuestionsCorrect) {
        super();
        this.numberOfQuestions = numberOfQuestions;
        this.numberOfQuestionsCorrect = numberOfQuestionsCorrect;
    }

    public int getNumberOfQuestions() {
        return numberOfQuestions;
    }
    public void setNumberOfQuestions(int numberOfQuestions) {
        this.numberOfQuestions = numberOfQuestions;
    }
    public int getNumberOfQuestionsCorrect() {
        return numberOfQuestionsCorrect;
    }
    public void setNumberOfQuestionsCorrect(int numberOfQuestionsCorrect) {
        this.numberOfQuestionsCorrect = numberOfQuestionsCorrect;
    }

    public double getMidtermScore() {
        this.midtermScore =(numberOfQuestionsCorrect*100)/numberOfQuestions;
        return midtermScore * WEIGHT;
    }

общедоступный класс FinalExam

    private double grammarScore;
    private double spellingScore;
    private double lengthScore;
    private double contentScore;

    private final double GRAMMARWEIGHT = 0.3;
    private final double SPELLINGWEIGHT = 0.2;
    private final double LENGTHWEIGHT = 0.2;
    private final double CONTENTWEIGHT = 0.3;

    private final double WEIGHT = 0.6;
    private double totalScore;

    public FinalExam(double grammarScore, double spellingScore, double 
                     lengthScore, double contentScore) {
        super();
        this.grammarScore = grammarScore;
        this.spellingScore = spellingScore;
        this.lengthScore = lengthScore;
        this.contentScore = contentScore;
    }

    public FinalExam(FinalExam[] finalScores) {
        this.finalScores = finalScores;
    }
    public double getGrammarScore() {
        return grammarScore;
    }
    public void setGrammarScore(double grammarScore) {
        this.grammarScore = grammarScore;
    }
    public double getSpellingScore() {
        return spellingScore;
    }
    public void setSpellingScore(double spellingScore) {
        this.spellingScore = spellingScore;
    }
    public double getLengthScore() {
        return lengthScore;
    }
    public void setLengthScore(double lengthScore) {
        this.lengthScore = lengthScore;
    }
    public double getContentScore() {
        return contentScore;
    }
    public void setContentScore(double contentScore) {
        this.contentScore = contentScore;
    }

    public double getTotalScore() {
        this.totalScore = (grammarScore*GRAMMARWEIGHT) + 
        (spellingScore*SPELLINGWEIGHT) + (lengthScore*LENGTHWEIGHT) + 
        (contentScore*CONTENTWEIGHT);
        return totalScore*WEIGHT;
    }

Основной класс

public static void main(String[] args) {

    Student[] students = new Student[5];
    String[] names = new String[5];
    String[] ids = new String[5];
    String[] letterGrades = new String[5];

    Midterm m1 = new Midterm(50, 40);
    FinalExam f1 = new FinalExam(100, 90, 100, 80);
    Student s1 = new Student("Alan", "111", m1, f1);
    names[0]=s1.getName();
    ids[0]=s1.getId();

    Midterm m2 = new Midterm(40, 26);
    FinalExam f2 = new FinalExam(75, 80, 100, 60);
    Student s2 = new Student("Bill", "222", m2, f2);
    names[1]=s2.getName();
    ids[1]=s2.getId();

    Midterm m3 = new Midterm(45, 39);
    FinalExam f3 = new FinalExam(89, 94, 85, 89);
    Student s3 = new Student("Cate", "333", m3, f3);
    names[2]=s3.getName();
    ids[2]=s3.getId();

    Midterm m4 = new Midterm(35, 30);
    FinalExam f4 = new FinalExam(90, 45, 40, 68);
    Student s4 = new Student("Dave", "444", m4, f4);
    names[3]=s4.getName();
    ids[3]=s4.getId();

    Midterm m5 = new Midterm(100, 73);
    FinalExam f5 = new FinalExam(45, 56, 48, 62);
    Student s5 = new Student("Frank", "555", m5, f5);
    names[4]=s5.getName();
    ids[4]=s5.getId();

    students[0] = s1;
    students[1] = s2;
    students[2] = s3;
    students[3] = s4;
    students[4] = s5;

    String letterGrade;
    int i = 0;
    for(Student s : students) {
        if(s.getGrade() >= 90.0) {
            letterGrade = "A";
        }else if(s.getGrade() >= 80.0) {
            letterGrade = "B";
        }else if(s.getGrade() >= 70.0) {
            letterGrade = "C";
        }else if(s.getGrade() >= 60.0) {
            letterGrade = "D";
        }else
            letterGrade = "F";
        letterGrades[i] = letterGrade;
        i++;
    }

    int i = -1;
    for(++i; i<=4; i++) {
        if(i==4)
            System.out.print(String.format("%s%4s %5s%s %5s%s %11s", "|", 
                             names[i], "|", ids[i], "|", letterGrades[i], 
                             "|"));
        else
            System.out.print(String.format("%s%4s %6s%s %5s%s %11s", "|", 
                             names[i], "|", ids[i], "|", letterGrades[i], 
                             "|"));
        System.out.println();
    }

}

Прежде всего, я прошу прощения, если мой код не отформатирован правильно, пожалуйста, не стесняйтесь редактировать мой формат, и я постараюсь изменить его соответствующим образом.

Недавно я начал программировать на Java и закончил задание по программированию на этой неделе.Задача попросила жестко закодировать информацию 5 учащихся (имя, идентификатор, промежуточный класс и итоговый класс).Затем программа должна была вывести имя и идентификатор студента с буквенной оценкой, которая представляла их gpa.

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

Я думаю, что проблема сводится к практике, и, поскольку мой опыт крайне ограничен, кто-нибудь может предложить какие-либо предложения о том, как я могу улучшить свой код?будь то наследование, полиморфизм или любой другой метод, который я могу практиковать?

Когда у меня будет больше времени и практики, я смогу лучше понять язык, и я решил, что одним из способов стать лучше, попросив отзыв о моем коде, я уверен, что есть место для улучшения.

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

1 Ответ

0 голосов
/ 03 октября 2018

У вас есть немного избыточного кода.

Я не буду писать код для вас, но я укажу несколько вещей, которые я видел сразу.

И Среднесрочный, и ОкончательныйЭкзамен - это тип теста, возможно, тест или экзамен могут быть хорошим классом или интерфейсом?Я уверен, что вы могли бы просто спросить сам тест, каков счет, и вместо того, чтобы вычислять счет в конце программы, рассчитать счет для каждого объекта.

Вместо сохранения только результатапромежуточный и итоговый экзамен у студента.Я бы порекомендовал на самом деле хранить объекты промежуточного и итогового экзаменов у студента.

Затем вы могли бы напрямую спросить студента о его итоговой оценке.Затем студент будет использовать объекты промежуточного и финального экзаменов для расчета итоговой оценки.

Я бы рекомендовал НЕ использовать массивы String[] names = new String[5];, String[] ids = new String[5]; и String[] letterGrades = new String[5];.При распечатке учеников и их оценок переходите непосредственно к объекту ученика и вызывайте getName(), getId() и т. Д. *

Вместо массива для учеников, вы можете рассмотреть возможность использования Collection, как ArrayList или Hashset .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...