pi-13. カプセル化、MVCモデル、オブジェクトのマッピング

829 Views

January 05, 22

スライド概要

Java の基本
URL: https://www.kkaneko.jp/cc/pi/index.html

profile-image

金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

pi-13. カプセル化、MVCモデル、 オブジェクトのマッピング (Java の基本) URL: https://www.kkaneko.jp/cc/pi/index.html 金子邦彦 1

2.

アウトライン 番号 項目 説明時間の 目安 13-1 13-2 カプセル化 MVC モデル 9分 13-3 Java での MVC モデル 9分 13-4 MVC モデルの応用 4分 13-5 オブジェクトのマッピング 7分 13-6 Java でのオブジェクトのマッピング 9分 6分 各自、資料を読み返したり、課題に取り組んだりも行う この授業では、Java を用いて基礎を学び、マスターする 2

3.

今回の内容 • カプセル化 Java では、public, private の指定により,属性やメ ソッドへのアクセス制御を行う • MVC 「モデル」、「ビュー」、「コントローラー」のこ と • マッピング Java のオブジェクトを、データベースや DOM オ ブジェクトにマッピングできる 3

4.

j13-1. カプセル化 Java を基礎から学びた い人へ(入門者向け) 金子邦彦 4

5.

カプセル化とは • オブジェクトは、属性と、メソッドを持つ • 必要な属性とメソッドのみ、他のオブジェクトに 公開する 5

6.

クラス • クラスは,同じ種類のオブジェクトの集まりと考 えることができる 人間 学生 学生でもあり人間でもある 人間だが、学生ではない 6

7.

ソースコード ・クラス定義 ・オブジェクト生成など プログラムの起動 オブジェクトが生成され、互いに連携 しながら動作する 7

8.

クラスB クラスB クラスA クラスC すべてのオブジェクトはカプセル化されている。 • 必要な属性とメソッドのみ、他のオブジェク トに公開する • 何を公開し、何を公開しないかは、クラス単 位で指定可能 8

9.

Java でのカプセル化 • 公開 public • 非公開 private 9

10.

まとめ • カプセル化 Java では、public, private の指定により,属性やメ ソッドへのアクセス制御を行う 10

11.

j13-2. MVC モデル Java を基礎から学びた い人へ(入門者向け) 金子邦彦 11

12.

モデルとビューとコントローラ モデル 更新 ビュー ユーザに見せる データの保持 更新 表示 ユーザ操作 受け付け、 モデル更新 コントローラ ユーザから受け付ける 12

13.

モデルとビューとコントローラ • オブジェクト指向では、 アプリ(Webアプリなど)は、 さまざまなオブジェクトの集まり • モデル、ビュー、コントローラーに分けて、 プログラムを設計、製作、テストすることで、 プログラムを見通し良く作成可能 (私の見解) 13

14.

MVC の例 名簿を作るとき モデルの例 • Person クラス: オブジェクトは1人の人間 • Meibo クラス: オブジェクトは名簿全体 ビューの例 表やフォーム形式で、名簿データを表示 コントローラーの例 フォーム記入内容をもとに、モデルを更新 14

15.

j13-3. Java での MVC モデル Java を基礎から学びた い人へ(入門者向け) 金子邦彦 15

16.

今から行うこと • モデル部分: Person クラス,Meibo クラス • コントローラー部分: Main クラス ※ ビューは考えないことにする 16

17.

オンライン開発環境 GDBonline • プログラミングを行える Web サービス https://www.onlinegdb.com • ウェブブラウザを使う • たくさんの言語を扱うことができる Python3, Java, C/C++, C#, JavaScript, R, アセンブリ言語,SQL など オンラインなので、「秘密にしたいプログラム」を 扱うには十分な注意が必要 17

18.

Online GDB で Java を動かす手順 ① ウェブブラウザを起動する ② 次の URL を開く https://www.onlinegdb.com 18

19.

③ 「Language」のところで,「Java」を選ぶ 19

20.

実行ボタン エディタ画面 プログラムを 書き換えること ができる 20

21.

① プログラム (モデル部分) 21

22.

プログラムの続き(モデル部分) 22

23.

プログラムの続き(コントローラー部分) 23

24.

④ 実行し結果を確認 24

25.

次に行うこと • モデル部分: Person クラス,Meibo クラス • コントローラー部分: • ビュー部分: Main クラス View クラス(新しく追加) 25

26.

次のプログラムを書き加える 26

27.

次のように書き換える(ビューを使うように) 27

28.

実行し結果を確認 28

29.

モデルとビューの分離 • モデルの中のデータを,全て見せる必要がない(す べてを見せたくない)場合などに有効となる考え方 • 「プログラムが作成しやすくなる」(私の見解) 例)「『表示にこだわりたい』という場合, モデルとビューを分離しておけば, ビューのプログラムに集中できる」 という考え方も 29

30.

j13-4. MVC モデルの 応用 Java を基礎から学びた い人へ(入門者向け) 金子邦彦 30

31.

• フレームワーク:アプリケーションの土台となる ソフトウエア • MVC モデルに適する Java 言語フレームワークも 多数ある Struts JSF (Java Server Faces) Spring Framework Java の標準機能外であるが、インストールは簡単 31

32.

Struts 2 https://struts.apache.org/getting-started/hello-worldusing-struts2.html • Web アプリケー ションのワーク • HTML, Java の組 み合わせでアプリ ケーションを作成 32

33.

j13-5. オブジェクトの マッピング Java を基礎から学びた い人へ(入門者向け) 金子邦彦 33

34.

マッピング モデル データベース データベースシステム内 マッピング DOM オブジェクト ビュー ユーザに見せる コント ローラ ユーザから受け付ける 34

35.

情報システムのアーキテクチャ ネットワーク接続 サーバ (コンピュータ) データのやり取り データベース プログラム配信 DOMオブジェクトと のマッピング データベースとの マッピング デジタルデバイス ・画面表示 ・画面,マウス, キーボードでの操作 35

36.

オブジェクトのマッピングを行う理由 ① データベースとのマッピング Java オブジェクトを,データベース(リレーショ ナルデータベースシステム内)にマッピング リレーショナルデータベースのデータ検索結 果などを Java で簡単に扱えるように ② DOM オブジェクトとのマッピング Java オブジェクトを,DOMオブジェクト(Web ブ ラウザと相性が良い)にマッピング Web プログラムのダイナミック化 36

37.

マッピングのための技術 • Java 言語 ① データベース向け: SQL Alchemy など ② DOM 向け:DOM, SAX など(いずれも Java の標 準) • Python 言語 ① データベース向け: SQLAlchemy など ② DOM 向け:dom パッケージなど 37

38.

j13-6. Java でのオブ ジェクトのマッピング Java を基礎から学びた い人へ(入門者向け) 金子邦彦 38

39.

トピックス • リレーショナルデータベースとのマッピング • XML, HTML, DOM • DOM オブジェクトとのマッピング 39

40.

Spring JDBC のマッピングの例 Java オブジェクト マッピングを 行う Java プログラム リレーショナル データベースの テーブル Spring JDBC のライブラリ 40

41.
[beta]
Spring JDBC のマッピングの例
Java
オブジェクト
・リストオブジェクト
・要素は Employee オブ
ジェクト.属性は,id,
name ,salary, joined

マッピングを
行う Java プログラム

リレーショナル
データベースの
テーブル
id

name

salary

joined

List<Employee> employeeList = jdbcTemplate.query(
"SELECT * FROM Employee",
(rs, rowNum) -> {
int id = rs.getInt("id");
String name = rs.getString("name");
BigDecimal salary = rs.getBigDecimal("salary");
LocalDate joined = rs.getDate("joined").toLocalDate();
return new Employee(id, name, salary, joined); } );

・テーブルを丸ごと読み込んで Java のリストオブジェクト化
・「SELECT ・・・」のところには条件を指定可能
※ 記事をアップしています https://www.kkaneko.jp/pro/jdbc/springjdbc.html

41

42.

XMLとは • XML とは eXtensible Markup Language のこと • タグ,属性を使い文書を書く <items> <item id="001">XX</item> <item id="002">YY</item> </items> item, items はタグ id は属性 42

43.

DOMとは • DOM とは Document Object Model のこと • DOM では,ノードが階層構造をなすと考える items ノード itemノード itemノード DOM 化 <items> <item id="001">XX</item> <item id="002">YY</item> </items> item, items はタグ id は属性 43

44.

HTMLをプログラムで扱う理由 • Webブラウザでの表示をダイナミックに変えたい とき,プログラムを書く • そのとき,DOM オブジェクトを使うのは良い方針 44

45.
[beta]
HTML も DOM に準拠しつつある
<!DOCTYPE html>
<html lang="ja">
<head>
<meta content="text/html; charset=utf-8"
http-equiv="Content-Type">
<meta content="width=device-width, initialscale=1.0, maximum-scale=1.0, minimumscale=1.0" name="viewport">
<title>サンプル</title>
</head>
</body>

Web ブラウザで表示

<h1>サンプル</h1>
</body>
</html>

HTML ファイル

45

46.

DOM でのマッピングの例 (Java 言語) DOM オブジェクト Java DOMオブジェクトの 読み出し,書き込み を行うプログラム JDBC の標準ラ イブラリ <items> <item id="ID">VALUE</item> </items> 書き込まれた DOMオブジェ クト Document d = new XMLDocument(); Element r = document.createElement("items"); d.appendChild(r); Element e = d.createElement("item"); r.appendChild(e); Text t = d.createTextNode("VALUE"); e.appendChild(t); e.setAttribute("id", "ID"); 書き込みの例 46

47.
[beta]
DOM でのマッピングの例 (Python 言語)
Python

DOM
オブジェクト
DOMオブジェクトの
読み出し,書き込み
を行うプログラム

<items>
<item id="001">XX</item>
<item id="002">YY</item>
</items>

import xml.etree.ElementTree as ET
all = ET.Element('items')
x = ET.SubElement(all, 'item', {'id':'001'})
x.text = 'XX'
y = ET.SubElement(all, 'item', {'id':'002'})
y.text = ‘YY'
ET.dump(all)

書き込みの例

47

48.

まとめ • リレーショナルデータベースや、DOMオブジェク トは、Java オブジェクトへのマッピング可能 • リレーショナルデータベースや、DOMオブジェク トを、ふつうの Java オブジェクトと同じ感覚で 扱える 48

49.
[beta]
13-1
import java.util.*;
class Circle {
double x;
double y;
double r;
String color;
public Circle(double x, double y, double r, String color) {
this.x = x;
this.y = y;
this.r = r;
this.color = color;
}
public void printout() {
System.out.printf("%f %f %f %s\n", this.x, this.y, this.r, this.color);
}
}
public class Main {
public static void main(String[] args) throws Exception {
Circle x = new Circle(2, 4, 3, "green");
Circle y = new Circle(8, 10, 1, "blue");
x.printout();
y.printout();
}
}

49

50.
[beta]
13-3
import java.util.HashMap;
import java.util.Iterator;
import java.util.ArrayList;
class Person {
String name;
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
public void printout() {
System.out.printf("%s %s\n", this.name, this.address);
}
}
class Meibo {
HashMap<Integer, Person> m;
public Meibo(HashMap<Integer, Person> m) {
this.m = m;
}
public void add(int id, String name, String address) {
m.put(id, new Person(name, address));
}
public void printout() {
for(Integer i : this.m.keySet()) {
System.out.printf("%d, ", i);
this.m.get(i).printout();
}
}
}
public class Main {
public static void main(String[] args) throws Exception {
HashMap<Integer, Person> m = new HashMap<Integer, Person>();
Meibo a = new Meibo(m);
a.add(1, "XX", "Fukuyama");
a.add(2, "YY", "Okayama");
a.printout();
}
}

50

51.
[beta]
13-3
import jav a.util.HashMap;
import jav a.util.Iterator;
import jav a.util.Array List;
class Person {
String name;
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
public v oid printout() {
Sy stem.out.printf("%s %s\n", this.name, this.address);
}
}
class Meibo {
HashMap<Integer, Person> m;
public Meibo(HashMap<Integer, Person> m) {
this.m = m;
}
public v oid add(int id, String name, String address) {
m.put(id, new Person(name, address));
}
public v oid printout() {
f or(Integer i : this.m.key Set()) {
Sy stem.out.printf("%d, ", i);
this.m.get(i).printout();
}
}
}
class View {
Array List<Person> v ;
public View() {
}
public v oid update(Meibo meibo) {
this.v = new Array List<Person>();
f or(Integer i: meibo.m.key Set()) {
v .add(meibo.m.get(i));
}
}
public v oid printout() {
f or(Person p: this.v ) {
Sy stem.out.printf("%s %s\n", p.name, p.address);
}
}
}
public class Main {
public static v oid main(String[] args) throws Exception {
HashMap<Integer, Person> m = new HashMap<Integer, Person>();
Meibo a = new Meibo(m);
a.add(1, "XX", "Fukuy ama");
a.add(2, "Y Y ", "Okay ama");
View v = new View();
v .update(a);
v .printout();
}
}

51