プログラミング実習Ⅰ

プログラミング実習Ⅰ
第6回 3・4時限
配布物
•  ホームページからダウンロードしてください.
•  h#p://www.info.kindai.ac.jp/ProJI/ •  Testなんとか.javaをtestDriveパッケージに含めてく
ださい. •  data.csvは~/Documents/workspace/pm1に入れて
ください. •  以降で説明するクラスはgradeManageパッケージ
に含めてください. 課題6-­‐2(要件)
•  成績データをファイルから読み込み保管するクラス
GradeManagerを作成する。
•  成績は教科クラスSubject毎に、各個人の成績クラス
GradeのオブジェクトをArrayList<Grade>で保持して
いる。
•  教員クラスTeacherと学生クラスStudentがある。
•  Teacherは担当している科目の科目毎の成績一覧を
GradeManagerに表示してもらうことができる
•  また、Teacherは担当している科目のすべての成績
一覧もGradeManagerに表示してもらうことができる
•  Studentは履修している科目をGradeManagerに表示
してもらうことができる
課題6-­‐2(GradeManager)
•  2時限目で説明した様式のSingletonパターンで実
装すること
•  Singletonパターンで実装する理由を推測してレポ
ートに記述すること
•  Singletonパターンで要するフィールド以外のフィ
ールドに以下のものがある(アクセス修飾子は
private)
–  final String FNAME = “data.csv”;
–  ArrayList<Subject> subjects;
–  ArrayList<Student> students; –  ArrayList<Teacher> teachers;
課題6-­‐2(GradeManager)
•  コンストラクタ
–  ArrayListを初期化する
–  コンストラクタのアクセス修飾子は。。。分りますよね?
•  メソッドgetInstance()
–  2時限目に倣って作ること
•  void addStudent(Student student)
–  引数をフィールドstudentsに追加
•  void addTeacher(Teacher teacher)
–  引数をフィールドteachersに追加
課題6-­‐2(GradeManager)
•  メソッドloadData()
–  CSVファイルからデータを読み込む
–  CSVファイルは「科目名,教員名,学生名,点数」
となっている。
–  ファイルの操作は実装済みである。
–  String lineBufferには各行のデータが入る
•  以下の項目を追加すること
–  lineBufferを『,』で分解して、文字列の配列
String[]にする。
課題6-­‐2(GradeManager)
–  文字列の配列の2番目の要素(教員名)がフィ
ールドteachersに無ければ、「%s の教員オブジ
ェクトは生成されていません」と表示し、CSVの
次の行の処理に進む。%sは教員名が入る
–  3番目の要素(学生名)も教員名と同様の処理
を行う。
–  文字列の配列の先頭の要素(科目名)がフィール
ドsubjectsに無ければ、クラスSubjectのオブジ
ェクトを生成し、subjectsに追加する
–  クラスGradeのオブジェクトを生成し、対応する
科目のオブジェクトに追加する
課題6-­‐2(GradeManager)
–  loadData()の冒頭で、学生オブジェクトまたは教員オ
ブジェクトがフィールドに登録されていないときは、そ
れぞれ、「学生オブジェクトが生成されていないとファ
イルを読み込めません」または「教員オブジェクトが
生成されていないとファイルを読み込めません」と表
示し、メソッドの処理を終了する。
•  メソッドfind(): 「generics メソッド Java」で調べてください
。引数nameをもつオブジェクトを返します。無ければnull
を返します。
private <T extends IData> T find(ArrayList<T> arg, String name) {
for (T data: arg) {
if (name.equals(data.getName())) return data;
}
return null;
}
課題6-­‐2(GradeManager)
•  query(Subject subject), query(Teacher teacher),
query(Student student), 引数の科目、教師名、学生
名にマッチする成績を表示する。
–  教師名にマッチする成績が無ければ、「 %s の担当科目は
未登録です」と表示する。ただし、%sには教師名が入る
–  学生名にマッチする成績が無ければ、「 %s の成績は未登
録でした」と表示する
–  戻り値の型はvoid
•  ArrayList<Subject> getSubjects(Teacher teacher)
–  引数にマッチする科目をArrayListにして返す
•  query(), getSubjects(), addStudent(), addTeacher()の
アクセス修飾子は省略(UMLのpackage)にすること 課題6-­‐2(インタフェース IData)
public String getName()が定義されているだけ。。。
課題6-­‐2(Subject)
•  インタフェースIDataを実装
•  フィールドは以下のとおり
–  String name
–  Teacher teacher
–  ArrayList<Grade> grades
–  アクセス修飾子はprivate
•  コンストラクタではnameとteacherについては、引数を
代入する。gradesについてはArrayListのオブジェクト
を生成する
•  すべてのフィールドについてゲッターをつけること
•  void addGrade(Grade grade)では引数gradeで得られ
た成績をフィールドに追加すること
課題6-­‐2(Grade)
•  フィールドは以下のとおり
–  Student student
–  Subject subject
–  int point // studentの成績が入る
–  アクセス修飾子はprivate
•  コンストラクタでは、すべてのフィールドについて引数
を代入する。
•  すべてのフィールドについてゲッターをつけること
課題6-­‐2(Student)
•  インタフェースIDataを実装
•  フィールドは以下のとおり
–  String name
–  GradeManager gradeManager
–  アクセス修飾子はprivate
•  コンストラクタでは、以下の処理を行う
–  フィールドnameについて引数を代入する。
–  gradeMangerについてはオブジェクトを取得する
–  gradeMangerに対してaddStudent()を呼び出し自身のオブジ
ェクトを追加してもらう
•  フィールドnameについてゲッターをつけること
課題6-­‐2(Student)
•  メソッドshowGrades()では、自身のオブジェクトを引数
として、gradeManagerに対してquery()を呼び出す。
課題6-­‐2(Teacher)
•  インタフェースIDataを実装
•  フィールドは以下のとおり
–  String name
–  GradeManager gradeManager
–  アクセス修飾子はprivate
•  コンストラクタでは、以下の処理を行う
–  フィールドnameについて引数を代入する。
–  gradeMangerについてはオブジェクトを取得する
–  gradeMangerに対してaddTeacher ()を呼び出し自身のオブ
ジェクトを追加してもらう
•  フィールドnameについてゲッターをつけること
課題6-­‐2(Teacher)
•  メソッドshowGrades()では、自身のオブジェクトを引数
として、gradeManagerに対してquery()を呼び出す。
•  メソッドshowGrades(String subjectName)では、次の
処理を行う
–  引数subjectNameにマッチする科目を担当していれば、そ
の科目のオブジェクトを引数として、gardeManagerに対して
query()を呼び出す。
–  なければ「%s は %s を 担当していません」を表示する。なお
、一個目の%sはnameを2個目の%s はsubjectNameを表す。
課題6-­‐2(DataVisualizer)
•  クラスメソッドprintGrade(Grade grade)が定義されている。
•  「科目: %s, 教員: %s, 学生: %s, 得点: %d」をprinU()で表
示 •  せっかく習ったので。。。
課題6-­‐2(作成手順:クラス図)
•  プログラムを作成する前にクラス図を書くこと!! •  クラス図はレポート(PDFファイル)に含めてください •  後で勘違いが判れば修正すればいいので、とりあえ
ず理解した範囲で書けるだけ書いておくこと!!! •  次ページ以降の作成手順では、すべてのメソッドに
ついて記述していないので、適時必要となったメソッ
ドを追加すること
課題6-­‐2(作成手順:Grade)
•  空のクラスを作成しておく public class Student { public Student(String name) { } } public class Subject { public Subject(String name, Teacher teacher) { } } public class Teacher { public Teacher(String name) { } } •  クラスGradeを作成 •  TestGrade.javaを実行し、動作を確認する 課題6-­‐2 (作成手順:StudentとGradeManagerの一部)
•  インタフェースIDataを作成 •  GradeManagerの一部(Singletonパターンのところと
addStudent())を作成 –  コンストラクタ –  メソッドgetInstance() –  メソッドaddStudent() •  クラスStudentを作成 –  showGrades()の中身の処理は書かなくてよい –  テスト用にgetGradeManager()を作成する •  TestStudent.javaを実行し、動作を確認する 課題6-­‐2(作成手順:Subject)
•  クラスSubjectを作成 •  TestSubject.javaを作成し、動作を確認する •  TestSubject.javaは提出不要であるが、レポートのPDF
ファイルには含めること。 •  フィールドがセットされているかだけでなく、値が正し
いかもテストするプログラムを作成すること •  レポートでは、どのような項目をテストしたかったのか
を明記し、その上でTestSubject.javaのソースコードを
示し解説すること。 •  また、 TestSubject.javaの実行結果を示し、Subject.jav
aが機能していることを示すこと。 課題6-­‐2(作成手順:Teacher)
•  クラスTeacherを作成 –  getSubjects() とshowGrades()とshowGrades(String subjectName)は中身がなくてもよい。 •  TestTeacher.javaを実行し、動作を確認する •  GradeManagerのteachersに要素が追加されているこ
とも確認しておくこと。 課題6-­‐2(作成手順:メソッドloadData())
•  クラスDataVisualizerを作成 •  クラスGradeManagerのメソッドloadData()を作成 –  以下のコードをloadData()に一時的に追加しておく for (Subject subject: subjects) { for (Grade grade: subject.getGrades()) { DataVisualizer.printGrade(grade); } } •  TestGradeManagerLoadData.javaを実行し、動作を確
認する 課題6-­‐2(残りの部分を作成)
•  機能単位で作成し、その都度テストを行うこと 動作確認
課題6-­‐2 (動作確認)
•  TestGradeManager.javaを実行し,結果が以下と同
じかどうかを確かめる.
教員・学生オブジェクト生成前はファイルを読み込めない 学生オブジェクトが生成されていないとファイルを読み込めません 教員・学生オブジェクト生成後はファイルを読み込める 守屋 の教員オブジェクトは生成されていません 小野妹子 の学生オブジェクトは生成されていません 小野妹子 の学生オブジェクトは生成されていません 守屋 の教員オブジェクトは生成されていません 守屋 の教員オブジェクトは生成されていません 武者小路実篤 の成績: 科目: オブジェクト指向設計, 教員: 半田, 学生: 武者小路実篤, 得点: 48 科目: 自然言語処理, 教員: 山本, 学生: 武者小路実篤, 得点: 72 26
科目: 人工知能, 教員: 半田, 学生: 武者小路実篤, 得点: 65 課題6-­‐2 (動作確認)
つづき
平清盛 の成績: 科目: オブジェクト指向設計, 教員: 半田, 学生: 平清盛, 得点: 92 豊臣秀吉 の成績: 豊臣秀吉 の成績は未登録でした 徳川家康 の成績: 科目: オブジェクト指向設計, 教員: 半田, 学生: 徳川家康, 得点: 82 科目: 自然言語処理, 教員: 山本, 学生: 徳川家康, 得点: 93 科目: 人工知能, 教員: 半田, 学生: 徳川家康, 得点: 90 オブジェクト指向設計 の成績: 科目: オブジェクト指向設計, 教員: 半田, 学生: 武者小路実篤, 得点: 48 科目: オブジェクト指向設計, 教員: 半田, 学生: 平清盛, 得点: 92 科目: オブジェクト指向設計, 教員: 半田, 学生: 徳川家康, 得点: 82 27
課題6-­‐2 (動作確認)
つづき
山本 は オブジェクト指向設計 を 担当していません 半田 の評価: 科目: オブジェクト指向設計, 教員: 半田, 学生: 武者小路実篤, 得点: 48 科目: オブジェクト指向設計, 教員: 半田, 学生: 平清盛, 得点: 92 科目: オブジェクト指向設計, 教員: 半田, 学生: 徳川家康, 得点: 82 科目: 人工知能, 教員: 半田, 学生: 武者小路実篤, 得点: 65 科目: 人工知能, 教員: 半田, 学生: 徳川家康, 得点: 90 山本 の評価: 科目: 自然言語処理, 教員: 山本, 学生: 武者小路実篤, 得点: 72 科目: 自然言語処理, 教員: 山本, 学生: 徳川家康, 得点: 93 森山 の評価: 28
森山 の担当科目は未登録です 本日の提出物
•  課題6-­‐2: ファイル名:14-­‐0999-­‐6-­‐2.zip –  DataVisualizer.java, Grade.java, GradeManager.java,
IData.java, Student.java, Subject.java, Teacher.java •  課題6-­‐2: ファイル名:14-­‐0999-­‐6-­‐2.pdf –  Singletonパターンを用いた理由を考察せよ –  TestSubject.javaのテスト項目・ソースコードの解説・動
作報告を説明しなさい –  TestGradeManager.javaの30行目のshowGrades()の1回
目の呼び出しについてシーケンス図を作成して動作を
説明しなさい –  34行目のshowGrades()の呼び出しについてもシーケン
ス図を作成して動作を説明しなさい –  従来通りのクラス分析やプログラムの詳細も説明すること