回答編集履歴

3 説明追記

shiracamus

shiracamus score 3335

2020/01/21 19:21  投稿

直接の回答ではないですが、私もリファクタリングしてみました。
オブジェクトには役割を持たせましょう。生徒役、先生役。先生が生徒に成績を伝える。平均点は生徒が計算する。  
何か参考になることがあれば幸いです。
```Student.java
public class Student {
   private String number;
   private String name;
   private int english;
   private int literature;
   private int mathematics;
   public void setNumber(String number) {
       this.number = number;
   }
   public String getNumber() {
       return this.number;
   }
   public void setName(String name) {
       this.name = name;
   }
   public String getName() {
       return this.name;
   }
   public void setEnglish(int score) {
       this.english = score;
   }
   public int getEnglish() {
       return this.english;
   }
   public void setMathematics(int score) {
       this.mathematics = score;
   }
   public int getMathematics() {
       return this.mathematics;
   }
   public void setLiterature(int score) {
       this.literature = score;
   }
   public int getLiterature() {
       return this.literature;
   }
   public double average() {
       return (this.english + this.mathematics + this.literature) / 3.0;
   }
}
```
```WriteGradeToFile.java
//package grade6;
import java.io.*;
import java.util.*;
//import grade4.*;
public class WriteGradeToFile {
   private BufferedReader ui = new BufferedReader(new InputStreamReader(System.in));
   private List<Student> students = new ArrayList<Student>();
   private int readInt() throws IOException {
       return Integer.parseInt(ui.readLine());
   }
   void input() throws IOException {
       while (true) {
           Student student = new Student();
           System.out.print("番号=>");
           student.setNumber(ui.readLine());
           if (student.getNumber().equals("."))
               break;
           System.out.print("名前=>");
           student.setName(ui.readLine());
           System.out.print("英語=>");
           student.setEnglish(readInt());
           System.out.print("国語=>");
           student.setLiterature(readInt());
           System.out.print("数学=>");
           student.setMathematics(readInt());
           students.add(student);
       }
       System.out.println(students.size() + "人のデータを入力しました。");
   }
   public void displayGrade(Student student) {
       System.out.println("番号 = " + student.getNumber());
       System.out.println("名前 = " + student.getName());
       System.out.println("英語 = " + student.getEnglish());
       System.out.println("国語 = " + student.getLiterature());
       System.out.println("数学 = " + student.getMathematics());
       System.out.println("平均 = " + student.average());
   }
   public void displayGrade() {
       students.forEach(this::displayGrade);
   }
   public void save(PrintWriter pw) throws IOException {
       for (Student student: students) {
           pw.println(student.getNumber());
           pw.println(student.getName());
           pw.println(student.getEnglish());
           pw.println(student.getLiterature());
           pw.println(student.getMathematics());
           pw.println(student.average());
           pw.flush();
       }
   }
   public void save(String filename) throws IOException {
       var pw = new PrintWriter(new BufferedWriter(new FileWriter(filename, true)));
       save(pw);
       pw.close();
       System.out.println(filename + "へ書き出しました。");
       System.out.println();
   }
   public static void main(String[] args) throws IOException {
       if (args.length != 1) {
           System.out.println("エラー:出力ファイル名を1つ与えてください。");
           System.out.println("使い方:$ java grade4.WriteGradeTofile.dat");
           System.exit(1);
       }
       var teacher = new WriteGradeToFile();
       teacher.input();
       teacher.displayGrade();
       teacher.save(args[0]);
   }
}
```
```ReadGradeFromFile.java
//package grade6;
import java.io.*;
import java.util.*;
//import grade4.*;
public class ReadGradeFromFile {
   private List<Student> students = new ArrayList<Student>();
   private static int readInt(BufferedReader file) throws IOException {
       return Integer.parseInt(file.readLine());
   }
   public void load(BufferedReader file) throws IOException {
       while (true) {
           String number = file.readLine();
           if (number == null) {
               return;
           }
           Student student = new Student();
           student.setNumber(number);
           student.setName(file.readLine());
           student.setEnglish(readInt(file));
           student.setLiterature(readInt(file));
           student.setMathematics(readInt(file));
           file.readLine(); // drop out average
           students.add(student);
       }
   }
   public void load(String filename) throws IOException {
       var file = new BufferedReader(new FileReader(filename));
       System.err.println(filename + "から読み込みます。");
       load(file);
       System.out.println(students.size() + "人のデータを読み込みました。");
       System.err.println(filename + "の読み込みが終了しました。");
   }
   public void displayGrade(Student student) {
       System.out.println("番号 = " + student.getNumber());
       System.out.println("名前 = " + student.getName());
       System.out.println("英語 = " + student.getEnglish());
       System.out.println("国語 = " + student.getLiterature());
       System.out.println("数学 = " + student.getMathematics());
       System.out.println("平均 = " + student.average());
   }
   public void displayGrade() {
       students.forEach(this::displayGrade);
   }
   public static void main(String[] args) throws IOException {
       if (args.length != 1) {
           System.out.println("エラー:入力ファイル名を1つ与えてください。");
           System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名");
           System.exit(1);
       }
       var teacher = new ReadGradeFromFile();
       teacher.load(args[0]);
       teacher.displayGrade();
   }
}
```
2 コード変更

shiracamus

shiracamus score 3335

2020/01/21 19:17  投稿

直接の回答ではないですが、私もリファクタリングしてみました。
何か参考になることがあれば幸いです。
```Student.java
public class Student {
   private String number;
   private String name;
   private int english;
   private int literature;
   private int mathematics;
   public void setNumber(String number) {
       this.number = number;
   }
   public String getNumber() {
       return this.number;
   }
   public void setName(String name) {
       this.name = name;
   }
   public String getName() {
       return this.name;
   }
   public void setEnglish(int score) {
       this.english = score;
   }
   public int getEnglish() {
       return this.english;
   }
   public void setMathematics(int score) {
       this.mathematics = score;
   }
   public int getMathematics() {
       return this.mathematics;
   }
   public void setLiterature(int score) {
       this.literature = score;
   }
   public int getLiterature() {
       return this.literature;
   }
   public double average() {
       return (this.english + this.mathematics + this.literature) / 3.0;
   }
}
```
```WriteGradeToFile.java
//package grade6;
import java.io.*;
import java.util.*;
//import grade4.*;
public class WriteGradeToFile {
   private BufferedReader ui = new BufferedReader(new InputStreamReader(System.in));
   private List<Student> students = new ArrayList<Student>();
   private int readInt() throws IOException {
       return Integer.parseInt(ui.readLine());
   }
   void input() throws IOException {
       while (true) {
           Student student = new Student();
           System.out.print("番号=>");
           student.setNumber(ui.readLine());
           if (student.getNumber().equals("."))
               break;
           System.out.print("名前=>");
           student.setName(ui.readLine());
           System.out.print("英語=>");
           student.setEnglish(readInt());
           System.out.print("国語=>");
           student.setLiterature(readInt());
           System.out.print("数学=>");
           student.setMathematics(readInt());
           students.add(student);
       }
       System.out.println(students.size() + "人のデータを入力しました。");
   }
   public void displayGrade(Student student) {
       System.out.println("番号 = " + student.getNumber());
       System.out.println("名前 = " + student.getName());
       System.out.println("英語 = " + student.getEnglish());
       System.out.println("国語 = " + student.getLiterature());
       System.out.println("数学 = " + student.getMathematics());
       System.out.println("平均 = " + student.average());
   }
   public void displayGrade() {
       students.forEach(this::displayGrade);
   }
   public void save(PrintWriter pw) throws IOException {
       for (Student student: students) {
           pw.println(student.getNumber());
           pw.println(student.getName());
           pw.println(student.getEnglish());
           pw.println(student.getLiterature());
           pw.println(student.getMathematics());
           pw.println(student.average());
           pw.flush();
       }
   }
   public void save(String filename) throws IOException {
       var pw = new PrintWriter(new BufferedWriter(new FileWriter(filename, true)));
       save(pw);
       pw.close();
       System.out.println(filename + "へ書き出しました。");
       System.out.println();
   }
   public static void main(String[] args) throws IOException {
       if (args.length != 1) {
           System.out.println("エラー:出力ファイル名を1つ与えてください。");
           System.out.println("使い方:$ java grade4.WriteGradeTofile.dat");
           System.exit(1);
       }
       var teacher = new WriteGradeToFile();
       teacher.input();
       teacher.displayGrade();
       teacher.save(args[0]);
   }
}
```
```ReadGradeFromFile.java
//package grade6;
import java.io.*;
import java.util.*;
//import grade4.*;
public class ReadGradeFromFile {
   private List<Student> students = new ArrayList<Student>();
   private static int readInt(BufferedReader file) throws IOException {
       return Integer.parseInt(file.readLine());
   }
   public boolean load(BufferedReader file) throws IOException {
       String number = file.readLine();
       if (number == null) {
           return false;
       }
       Student student = new Student();
       student.setNumber(number);
       student.setName(file.readLine());
       student.setEnglish(readInt(file));
       student.setLiterature(readInt(file));
       student.setMathematics(readInt(file));
       file.readLine(); // drop out average
       students.add(student);
       return true;
   public void load(BufferedReader file) throws IOException {
       while (true) {
           String number = file.readLine();
           if (number == null) {
               return;
           }
           Student student = new Student();
           student.setNumber(number);
           student.setName(file.readLine());
           student.setEnglish(readInt(file));
           student.setLiterature(readInt(file));
           student.setMathematics(readInt(file));
           file.readLine(); // drop out average
           students.add(student);
       }
   }
   public void load(String filename) throws IOException {
       var file = new BufferedReader(new FileReader(filename));
       System.err.println(filename + "から読み込みます。");
       while (load(file));
       load(file);
       System.out.println(students.size() + "人のデータを読み込みました。");
       System.err.println(filename + "の読み込みが終了しました。");
   }
   public void displayGrade(Student student) {
       System.out.println("番号 = " + student.getNumber());
       System.out.println("名前 = " + student.getName());
       System.out.println("英語 = " + student.getEnglish());
       System.out.println("国語 = " + student.getLiterature());
       System.out.println("数学 = " + student.getMathematics());
       System.out.println("平均 = " + student.average());
   }
   public void displayGrade() {
       students.forEach(this::displayGrade);
   }
   public static void main(String[] args) throws IOException {
       if (args.length != 1) {
           System.out.println("エラー:入力ファイル名を1つ与えてください。");
           System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名");
           System.exit(1);
       }
       var teacher = new ReadGradeFromFile();
       teacher.load(args[0]);
       teacher.displayGrade();
   }
}
```
1 コード修正

shiracamus

shiracamus score 3335

2020/01/21 19:12  投稿

直接の回答ではないですが、私もリファクタリングしてみました。
何か参考になることがあれば幸いです。
```Student.java
public class Student {
   private String number;
   private String name;
   private int english;
   private int literature;
   private int mathematics;
   public void setNumber(String number) {
       this.number = number;
   }
   public String getNumber() {
       return this.number;
   }
   public void setName(String name) {
       this.name = name;
   }
   public String getName() {
       return this.name;
   }
   public void setEnglish(int score) {
       this.english = score;
   }
   public int getEnglish() {
       return this.english;
   }
   public void setMathematics(int score) {
       this.mathematics = score;
   }
   public int getMathematics() {
       return this.mathematics;
   }
   public void setLiterature(int score) {
       this.literature = score;
   }
   public int getLiterature() {
       return this.literature;
   }
   public double average() {
       return (this.english + this.mathematics + this.literature) / 3.0;
   }
}
```
```WriteGradeToFile.java
//package grade6;
import java.io.*;
import java.util.*;
//import grade4.*;
public class WriteGradeToFile {
   private BufferedReader ui = new BufferedReader(new InputStreamReader(System.in));
   private List<Student> students = new ArrayList<Student>();
   private int readInt() throws IOException {
       return Integer.parseInt(ui.readLine());
   }
   void input() throws IOException {
       while (true) {
           Student student = new Student();
           System.out.print("番号=>");
           student.setNumber(ui.readLine());
           if (student.getNumber().equals("."))
               break;
           System.out.print("名前=>");
           student.setName(ui.readLine());
           System.out.print("英語=>");
           student.setEnglish(readInt());
           System.out.print("国語=>");
           student.setLiterature(readInt());
           System.out.print("数学=>");
           student.setMathematics(readInt());
           students.add(student);
       }
       System.out.println(students.size() + "人のデータを入力しました。");
   }
   public void displayGrade(Student student) {
       System.out.println("番号 = " + student.getNumber());
       System.out.println("名前 = " + student.getName());
       System.out.println("英語 = " + student.getEnglish());
       System.out.println("国語 = " + student.getLiterature());
       System.out.println("数学 = " + student.getMathematics());
       System.out.println("平均 = " + student.average());
   }
   public void displayGrade() {
       students.forEach(this::displayGrade);
   }
   public void save(PrintWriter pw) throws IOException {
       for (Student student: students) {
           pw.println(student.getNumber());
           pw.println(student.getName());
           pw.println(student.getEnglish());
           pw.println(student.getLiterature());
           pw.println(student.getMathematics());
           pw.println(student.average());
           pw.flush();
       }
   }
   public void save(String filename) throws IOException {
       var pw = new PrintWriter(new BufferedWriter(new FileWriter(filename, true)));
       save(pw);
       pw.close();
       System.out.println(filename + "へ書き出しました。");
       System.out.println();
   }
   public static void main(String[] args) throws IOException {
       if (args.length != 1) {
           System.out.println("エラー:出力ファイル名を1つ与えてください。");
           System.out.println("使い方:$ java grade4.WriteGradeTofile.dat");
           System.exit(1);
       }
       var teacher = new WriteGradeToFile();
       teacher.input();
       teacher.displayGrade();
       teacher.save(args[0]);
   }
}
```
```ReadGradeFromFile.java
//読み込み用クラス  
 
//package grade6;
import java.io.*;
import java.util.*;
//import grade4.*;
public class ReadGradeFromFile {
   private List<Student> students = new ArrayList<Student>();
   private static int readInt(BufferedReader file) throws IOException {
       return Integer.parseInt(file.readLine());
   }
   public boolean load(BufferedReader file) throws IOException {
       String number = file.readLine();
       if (number == null) {
           return false;
       }
       Student student = new Student();
       student.setNumber(number);
       student.setName(file.readLine());
       student.setEnglish(readInt(file));
       student.setLiterature(readInt(file));
       student.setMathematics(readInt(file));
       file.readLine(); // drop out average
       students.add(student);
       return true;
   }
   public void load(String filename) throws IOException {
       var file = new BufferedReader(new FileReader(filename));
       System.err.println(filename + "から読み込みます。");
       for (int n = 1; load(file); n++) {
       }
       while (load(file));
       System.out.println(students.size() + "人のデータを読み込みました。");
       System.err.println(filename + "の読み込みが終了しました。");
   }
   public void displayGrade(Student student) {
       System.out.println("番号 = " + student.getNumber());
       System.out.println("名前 = " + student.getName());
       System.out.println("英語 = " + student.getEnglish());
       System.out.println("国語 = " + student.getLiterature());
       System.out.println("数学 = " + student.getMathematics());
       System.out.println("平均 = " + student.average());
   }
   public void displayGrade() {
       students.forEach(this::displayGrade);
   }
   public static void main(String[] args) throws IOException {
       if (args.length != 1) {
           System.out.println("エラー:入力ファイル名を1つ与えてください。");
           System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名");
           System.exit(1);
       }
       var teacher = new ReadGradeFromFile();
       teacher.load(args[0]);
       teacher.displayGrade();
   }
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る