DIAECOR Webサイト企画

1
モデリングからテストまで自分自身で体験
2
講座の目的
オブジェクト指向とJavaが何となくわかる
オブジェクト指向の概要をつかみたい
Javaを勉強する前の予備知識をつけたい
いまさら部下にJavaについて聞けない
SIerが言っていることを理解したい
Java開発の現場を理解したい
3
これだけは覚えよう!
今回の講座ではいろいろな専門用語が登場しますが、以下に示すものだけ
は覚えて帰るようにしてください。
クラス
インスタンス
属性、インスタンス変数
振る舞い、メソッド
関連、集約、汎化
継承
テキストP2
4
冷蔵庫は見えるか?
システムのことは一切忘れて以下に書かれている冷蔵庫を目に見えるよう
にしてください。
冷蔵庫は2ドアで冷凍室と冷蔵室がある。
冷凍室にアイスクリームが1つ入っている。
冷凍室には製氷皿があり氷ができている。
冷蔵室にはチーズが入っている。
冷蔵庫にはドアポケットがあり、ビールが3本入っている。
テキストP3
5
冷蔵庫を書いてみた
冷蔵庫を書くのに苦労したこと。
実際に物を入れてみてスケッチ。
なかなか上手に書けない。
書き上げるまでにアイスクリームがと
けてしまった。
美的センスに左右される
6
別の方法で書いてみた
冷蔵庫を書くのに注意したこと。
簡単に素早くかける。
美的センスを必要としない。
実際の物を見なくても書ける。
アイスクリームをとかさない。
思いを見えるようにすること、
これがモデリング
7
2つの共通点
見ている視点は同じ
物が最小の単位で書かれる
物と物の関係が書かれる
物を中心にモデリング = オブジェクト(物)指向
8
オブジェクト指向とは
オブジェクト指向とは、良いシステム作りのアプローチ方法であり、2つの技
術要素を持っています。
モデリング
技術
プログラミング
技術
良いシステムを効率よく開発
9
オブジェクト指向とは
2つの技術は同じ物ではありません、それぞれを構成する要素も異なります。
そして、目的にしているのは、汎用機時代に一般的に使用された構造化手
法と同じです。
モデリング
技術
見えないシステムを見えるようにする
プログラミング
保守性の高いプログラムを素早くつくる
技術
10
モデリングの基本は物と関係
オブジェクト指向で言うところのモデリングの基本はオブジェクト(物)を洗い
出し、これに関係線を付ける所から始まります。
例えば「上司は部下に命令して仕事をさせる」ことをモデリングすると以下の
ようになります。
上司
部下
要件の名詞をオブジェクトとして
抽出し、関係を結ぶ
11
物と物の関係を示すクラス図
物と物との間の関係を現す図をクラス図と言います。
関係にはいくつかの種類がありますが、3つ知っていれば充分です。
分類
書き方
意味
関連
A
B
AとBは意味的なつながりがある。
例)AはBの上司
集約
A
B
BはAを構成する一部である。
例)社員Bは会社Aを構成する一部
汎化
A
B
AはBの一般的(抽象的)なものである。
例)部長Bも課長B’も社員Aである
12
冷蔵庫をモデリング
説明したクラス図で冷蔵庫をモデリングしてください。
冷蔵庫は2ドアで冷凍室と冷蔵室がある。
冷凍室にアイスクリームが1つ入っている。
冷凍室には製氷皿があり氷ができている。
冷蔵室にはチーズが入っている。
冷蔵庫にはドアポケットがあり、ビールが3本入っている。
オブジェクトの候補をみつけ関係線をひく
テキストP4
13
冷蔵庫をモデリング
クラス図にでてくる四角をクラスと言い、要件の名詞より抽出できます。
冷蔵庫は2ドアで冷凍室と冷蔵室がある。
冷凍室にアイスクリームが1つ入っている。
冷凍室には製氷皿があり氷ができている。
冷蔵室にはチーズが入っている。
冷蔵庫にはドアポケットがあり、ビールが3本入っている。
オブジェクト候補
14
冷蔵庫をモデリング
冷蔵庫本体をモデリングする。
冷蔵庫
冷蔵室
ドアポケット
冷凍室
製氷皿
冷蔵庫の部品は集約
15
冷蔵庫に中身を追加
冷蔵庫本体に中身を追加してみましょう。
冷蔵庫
冷蔵室
ドアポケット
1
1
1
3
チーズ
ビール
冷凍室
製氷皿
1
1
1
1
アイス
氷
16
冷蔵室・冷凍室の取り扱い
冷蔵庫の冷蔵室、冷凍室は冷やす温度が違うだけで概念的には同じもです。
冷蔵庫
冷蔵室
1
冷やす温度が3〜5℃なら冷蔵室
1..*
格納室
冷やす温度が0℃以下なら冷凍室
冷凍室
概念として同じ物は汎化として表現できる
17
汎化と継承
汎化の状態にあるものを、オブジェクト指向では継承関係にあると言います。
A
 Aをスーパークラスと呼ぶ
 Bをサブクラスと呼ぶ
 BはAが持つ性質をすべて引継ぐ
B
継承はオブジェクト指向3大要素の1つ
18
冷蔵庫のモデル
以上で冷蔵庫のモデリングは終了です。
これは、システム開発では要件定義〜基本設計で目にする業務モデルに相
当します。
冷蔵庫
1
1..*
格納室
冷蔵室
ドアポケット
1
1
1
3
チーズ
ビール
冷凍室
製氷皿
1
1
1
1
アイス
氷
19
ここまでのまとめ
オブジェクト指向モデリングの基本は、機能(処理)に着目するのではなく、
問題領域(ドメイン)を構成する物や概念に着目し、その関係を示すことにあ
ります。
ドメインに対する視点を明確にする。
ドメインが対象とする物をモデリングの対象とする。
書き方ではなく、モデルの質を重視する。
処理の流れや順序はいったん忘れる。
20
いよいよ実践、設計からテストまで!
21
三菱電機新型冷蔵庫とは?
2XXX年、三菱電機は野菜を傷つけることなく野菜の収穫日を測定する新し
いセンサーを開発しました。三菱電機は、この新型センサーを利用した「野
菜の賞味期限がわかる」野菜室専用冷蔵庫を発表しました。
私たちはこの新型冷蔵庫「MX−2010」のシステム開発を担当することにな
りました。
テキストP5
22
要件はユースケースで
オブジェクト指向では要件をユースケース図として取りまとめます。
ユースケース図はシステムが持つ機能を、それに関わる外部からの視点で
整理したものです。
ユースケース図はオブジェクト指向的考えを必要としません。
システム化対象範囲
・システムが外部に公開する機能
・内部的な機能は記載しない
ユースケース
アクター
・ユースケースに影響を与える物
・ユースケースの恩恵を受ける物
・人間である必要はない
・システム化の対象となる範囲
・枠の外側にユースケースが
ある場合はシステム化の対象外
テキストP6
23
新型冷蔵庫のモデル
ユースケース図をもとに、新型冷蔵庫に求められる要件を整理して概念クラ
ス図を作成してください。
なお、概念クラス図には冷蔵庫と野菜の関係も記載することとします。
新型冷蔵庫は野菜室専用1ドア冷蔵庫
野菜の収穫日で賞味期限がわかる
庫内にはセンサーがあり野菜の情報を読み込む
ディスプレイには消費者の操作で賞味期限が表示される
ディスプレイに表示されるのは野菜の名前、賞味期限
テキストP7
24
新型冷蔵庫の概念クラス図
ディスプレイ
冷蔵庫
野菜室
MX-2010
冷蔵庫
MX-2010
野菜室
既に存在する冷蔵庫と野菜室を
継承している
センサー
野菜
25
継承を使用した共通化
構造化手法では共通化は共通処理をサブルーチンとして切り出す方法が用
いられますが、オブジェクト指向では共通的なクラスに異なる部分を拡張す
る方法が用いられます。
野菜室
格納室には野菜を出し入れして保持する機能がもとから備
わっている。
MX-2010
野菜室
新型冷蔵庫の野菜室では、センサを保持し、収穫日を読み
込めるようにすればよい。
継承は共通化には欠かせない
26
オブジェクトの内部を設計
オブジェクト指向ではオブジェクト(物)が持つ属性(データ)と振る舞い(処
理)を「ひな形」として規定し、これの実態をオブジェクトとして取り扱います。
この2つをクラスとインスタンスの関係と呼びます。
ひな形(クラス)
社員
名前
入社日
仕事をする
実態(インスタンス)
山田太郎
2000年4月1日
システム開発をする
27
クラス内部の表現方法
先ほどの社員の例をクラス図で表すと以下のようになります。
オブジェクト指向では属性と振る舞いを1つのクラスにまとめて管理します。
<書き方>
<社員の例>
クラス名
社員
属性
名前
入社日
振る舞い
仕事をする
28
クラスとカプセル化
クラスに定義されたデータ(属性)と処理(振る舞い)を1つで管理することを
カプセル化と言います。
属性と振る舞いにはアクセス修飾を付けることができる
外部に公開する必要のないデータ、処理を保護できる
外部に公開する範囲を決められる
安全なプログラムが作成できる
カプセル化はオブジェクト指向3大要素の1つ
29
新型冷蔵庫の詳細クラス図
冷蔵庫と野菜室の関係をクラス図で表すと以下のようになります。
その他の部分の詳細な
冷蔵庫
野菜室
クラス図を作成しましょう。
メーカー
製品名
格納室
野菜リスト
入れる(野菜)
取出す(名前)
ディスプレイ
冷蔵庫
野菜室
MX-2010
冷蔵庫
MX-2010
野菜室
センサー
野菜
※本講習ではアクセス修飾子は省略しています。
テキストP8
30
新型冷蔵庫の詳細クラス図
新型冷蔵庫の詳細クラス図を完成させてください。
クラス図を考える
テキストP9
31
新型冷蔵庫の詳細クラス図
詳細クラス図からは徐々に実装が意識されるようになります。
テキストP9
32
オブジェクトの相互作用
ここまでで作成したクラス図はシステムの静的な状態を表す物であるため、
システム全体としての流れを整理する必要があります。
オブジェクト指向ではオブジェクトにメッセージを送ることで、メッセージに即
した振る舞いが実行されます。
鳴け
ワン
<メッセージ>
<人クラス>
<犬クラス>
33
シーケンス図
オブジェクト間のメッセージのやり取りを整理するのがシーケンス図です。
犬に鳴けと命令するクラス図とシーケンス図を見てみましょう。
イメージとしては相手の振る舞いを呼び出すことになります。
<クラス図>
人
<シーケンス図>
人
犬
メッセージ
鳴く
犬
名前
+鳴く
活性期間
(動いている)
生存期間
(存在する)
テキストP11
34
新型冷蔵庫のシーケンス図
シーケンス図は、作成したクラス図全体の整合性を見る上でも役に立ちます。
シーケンス図を考える
テキストP12
35
シーケンス図で表現
テキストP13
36
Javaプログラムにする
ここまでで、クラスの属性(データ)と振る舞い(処理)とそのクラス間のメッ
セージ(関係)を明確にしたので、詳細設計ができたことになります。
これをJavaプログラムのソースコードに置き換えていけばプログラムは出来
上がりです。
属性は変数になります。
振る舞いはメソッドになります。
メッセージはメソッドの呼び出しになります。
37
人間と犬のプログラム
人間と犬のJavaプログラムを見てみます。
人クラスはプログラムの入り口である「main」メソッドを持っています。
<クラス図>
人
<ソースコード>
クラスを定義。
public class 人 {
/**
* プログラムが一番最初に呼び出される main メソッド.
* @param args パラメータなし
最初に実行されるメソッドは
*/
「main」です。
public static void main(String[] args) {
// 犬クラスの生成(名前を設定)
犬クラスのインスタンスを
犬 ポチ = new 犬("ポチ");
newで生成。
// 生成した犬に「鳴く」を指示する。
// 鳴き声が返却されるので、取得する。
String 鳴き声 = ポチ.鳴く();
犬クラスの鳴くメソッドを
// 鳴き声変数の値をコンソールに出力する。
呼び出す。
System.out.println(鳴き声);
}
}
結果をコンソールに表示します。
テキストP14
38
人間と犬のプログラム
犬クラスは「鳴く」と言うメソッドを持っています。
属性とメソッドの表現に注意してください。
<クラス図>
犬
名前
鳴く
<ソースコード>
public class 犬 {
/** 犬の名前を保持します。*/
属性である名前の定義。
private String 名前;
/** 犬の名前を取得します。
* @param 名前引数 犬の名前
*/
クラス名と同じ名前のメソッドはコンス
public 犬(String 名前引数) {
トラクタと呼ばれ、インスタンス生成時
this.名前 = 名前引数;
に実行されます。
}
/** 鳴くと指示されたら、鳴き声を返却します。
* @return 犬の鳴き声
鳴くメソッド
*/
public String 鳴く() {
return "ワン";
}
呼び出し元に戻す=return
}
テキストP14
39
冷蔵庫をプログラムで表現
見えなくなっている部分のソースプログラムを考えてみましょう。
テキストP15
40
隠されたコード(野菜クラス)
package 野菜グループ;
public class 野菜 {
private String 名前;
private String 収穫日;
public 野菜(String 名前引数, String 収穫日引数) {
this.名前 = 名前引数;
this.収穫日 = 収穫日引数;
}
public String 名前を公開する() {
return this.名前;
}
public String 収穫日を公開する() {
return this.収穫日;
}
①
シーケンス図①
野菜クラスのコンストラクタ
引数を属性にセットする。
②
シーケンス図⑦
属性である収穫日をメソッドの戻り値と
して返却する。
}
テキストP16
41
隠されたコード(センサークラス)
package 冷蔵庫グループ;
import 野菜グループ.野菜;
public class センサー {
protected String 賞味期限を調べる(野菜 野菜引数) {
String 収穫日 = 野菜引数.収穫日を公開する();
String 日付 = 収穫日.substring(8,10);
int day = Integer.parseInt(日付);
day += 10;
return 収穫日.substring(0,8) + day;
}
}
③
シーケンス図⑦
引数で受け取った野菜クラスのインス
タンスの「収穫日を公開する」メソッドを
呼び出します。
戻り値は、String(文字列型)で収穫日
です。
テキストP16
42
隠されたコード(人間クラス)
import java.util.Calendar;
import 冷蔵庫グループ.MX2010冷蔵庫;
import 冷蔵庫グループ.MX2010野菜室;
import 野菜グループ.野菜;
public class 人間 {
public static void main(String[] args) {
野菜 かぼちゃ = new 野菜("かぼちゃ", "2010/02/05");
MX2010冷蔵庫 冷蔵庫変数 = new MX2010冷蔵庫("三菱電機", "MX-2010",
new MX2010野菜室());
冷蔵庫変数.格納室.入れる(かぼちゃ);
冷蔵庫変数.賞味期限ボタンを押す();
冷蔵庫変数.格納室.取り出す("かぼちゃ");
}
}
④
シーケンス図⑩
冷蔵庫が持つ格納室(野菜室のインスタンス)の「取り出す」メソッドを呼び出す。
テキストP16
43
Javaの開発環境
Javaの開発環境にはEclipseを利用するのが一般的です。
オープンソース
Java以外の開発にも利用可能(C++,PHP,COBOLなど)
コード編集、デバッガ、バージョン管理など標準装備
独自にプラグインを開発することで機能拡張が可能
UML、DB連携など通常開発に必要なプラグインを提供
開発プロセスに合わせた
独自の開発環境を作り上げることが可能
44
冷蔵庫プログラムを実行
テキストP17
45
プログラムのデバッグ
変数の中を覗いてみる。
プログラムを途中で止める。
実機デモ
46
コードのテスト
作成したプログラムはテスト仕様に基づき開発者(テスター)がテスト仕様書
通りに動作することを確認します。
ただし、この方法にはいくつかの問題もあります。
テスト内容、方法が曖昧になる
プログラムの問題の発見が遅れる
バグなどによる回帰テストに時間がかかる
デグレードを見落としやすい
人間が思い込みでテストすることの限界
47
テストのためのコード
Javaの開発では、このような問題を解決するための「プログラムをテストす
るプログラム」の作成が一般的となりつつあります。
import junit.framework.TestCase;public
class 犬Test extends TestCase {
/**
* ポチという犬の鳴き声テスト
*/
public void test鳴く01() {
犬 犬変数 = new 犬("ポチ");
String 鳴き声変数 = 犬変数.鳴く();
assertEquals("ワン", 鳴き声変数);
}
}
テストケースをメソッドとして
定義します。
戻り値が期待通りか
評価します。
メソッドの呼び出し結果の期待値を設計し
プログラムで評価する
テキストP18
48
テストの実行
テスト結果が表示される。
テキストP19
実機デモ
49
冷蔵庫のテストコード
センサークラスの「賞味期限を調べる」メソッドは野菜を引数にもらうことで、
賞味期限を計算します。(シーケンス図⑥)
テストコードを作成してください。
public class センサーテスト extends TestCase {
public void test01() {
// テストに使用する野菜オブジェクトを生成
野菜 テスト野菜 = new 野菜();
テスト野菜.生成("テスト野菜", "2009/12/10");
// センサーテスト
センサー センサー変数 = new センサー();
String 賞味期限 = センサー変数.賞味期限を調べる(テスト野菜);
テストコードを考える
// 戻り値の評価
assertEquals("2009/12/20", 賞味期限);
}
}
テキストP20
50
冷蔵庫のテストコード
public class センサーテスト extends TestCase {
public void test01() {
野菜のインスタンスを生成
// テストに使用する野菜オブジェクトを生成
野菜 テスト野菜 = new 野菜("テスト野菜", "2009/12/10");
// センサーテスト
センサーのインスタンスを生成
センサー センサー変数 = new センサー();
String 賞味期限 = センサー変数.賞味期限を調べる(テスト野菜);
// 戻り値の評価
assertEquals("2009/12/20", 賞味期限);
}
}
賞味期限の取得
10日加算した値となっているか評価
テキストP21
51
冷蔵庫のテストコードの実行
エラーがあればトレース情報が表示される
・エラーの内容
・プログラムの行数が表示される
テキストP22
実機デモ
52
テストファーストのすすめ
テストは「バグを取るため」に行うのではなく「仕様通りであるか」を目的とす
るべきです。この点で、早期に「テストコードを書く」テストファーストは有効で
す。
テストコードを作成する過程で問題が発見できる
曖昧さを排除できる
回帰テストの自動化が可能となる
DBなど外部データに依存するテストには注意が必要
コーディング前にテストコードを作成
53
どうする非機能要件の検証
システムの構築では業務機能を満たすことを中心にテストが実施されます
が、性能や資源効率性など「非機能要件」を満たしているかの試験も重要と
なります。Javaでは様々な非機能評価ツールがOSSで公開されています。
性能評価ツール
JMeter
HTTPリクエストを操作して
システムに高い負荷をかけ
ることや、レスポンスタイ
ムを測定することが可能で、
測定結果はグラフとして表
示することが可能。
Webシステムの性能評価
ツールとして最もよく使用
されるOSSである。
54
保守を容易にする
JavaAPIのマニュアルはすべてJavaDocというもので書かれています。
これは、ソースコードに書かれたコメントからドキュメントを生成したものです。
テキストP23
55
Javaはオブジェクト指向言語
Javaはオブジェクト指向言語であり、Javaのメリットを最大限に引き出すには
オブジェクト指向は不可欠です。
Javaはオブジェクト指向言語
Javaはマルチプラットフォームで動作
Javaは基本的にインタプリタで実行
Javaはネットワークに強い
Javaは本来組み込み用言語として開発
その後ターゲットをWebに変更
現在ではサーバ処理記述言語の中心
56
ここまでのまとめ
これまでの手続き型言語(COBOLやC)とJavaの大きな違いは、プログラミン
グ言語の範囲にとどまらず、各種ツールや開発方法論に大きな関連を持っ
ていること、そして変化のスピードが早いことです。
良い設計はオブジェクト指向に依存
設計と実装の境目が曖昧に
開発環境・ツールはOSSが当たり前
実装量は年々減る方向
日々進化する技術動向に注目!
57
技術は複合かつ拡大の方向に!
58
オブジェクト指向の拡大
オブジェクト指向は、プログラミング技術から発展し、モデリング、プロセスへ
と多くの物を巻き込んでいます。
デザイン
パターン
OSS
オブジェクト指向
表現方法
開発
プロセス
59
表現方法
オブジェクト指向では、世界的にその表現方法を統一するための言語があり
ます。これがUMLと言われる設計書の書き方の規則です。
実際のシステム開発はUMLに100%準拠するドキュメントが作成されることは
少なく、これまでのやり方にUMLの良いところを取り入れることが多いようで
す。
ダイアグラム
今回の講座で使用した図
構造図
パッケージ
図
クラス図
コンポジット
構造図
配置図
振る舞い図
コンポー
ネント図
オブジェクト
図
アクティビ
ティ図
ユースケース
図
ステート
マシン図
相互作用図
相互作用
概要図
シーケンス
図
タイミング
図
コミュニ
ケーション図
60
OSS(オープンソース)
今やJavaを利用したシステム開発で、オープンソースを全く使わないで開発
を行うことは皆無です。Java自身もオープンソースです。
開発
フレームワーク・ライブラリ
ミドル
Java SDK
Struts
JUnit
Tomcat
Eclipse
Log4J
Cactus
JBoss
Swing
JMeter
PostgreSQL
Hibernate
今回の講座で使用したOSS
61
プロセス
オブジェクト指向では、システムの捉え方を機能中心から、物中心へと変え
たことで、システム開発に対するアプローチも変わりました。
結果、オブジェクト指向開発をターゲットとしたプロセスも生まれています。
RUP
ユースケースを基準とする
表現方法はUMLを使用する
反復開発で行う
アーキテクチャを明確にする
XP
軽量な手法
変更を受け入れる
反復開発で行う
行動のルールを明確にする
実際の開発に大きな参考になる
62
デザインパターン
オブジェクト指向が実際の開発に使われていく中で、成熟したソフトウェアの
構造は同じパターンに集約されると言われます。
これを、まとめたのがデザインパターンです。
GoFのデザインパターンが有名
パターンの種類は23種類
バブルソートや二分探索のように定番となりつつある
開発者のコミュニケーションをスムーズにする
デザインパターンは再利用性を高める
63
加速する自動化
オブジェクト指向の関連技術が進化することで、今後ますますシステム開発
の自動化が進むと思われます。
UMLは設計書からのソース自動生成を目指している
決められた手順は自動化を行いやすくする
OSS(フレームワーク)はパラメータで動作する
システムはデザインパターンの組み合わせ
開発の自動化が行いやすい環境が
オブジェクト指向技術で整ってきた!
64
無理にオブジェクト指向を使わない
オブジェクト指向とは、依存関係の少なく、再利用しやすいプログラムを作る
ための道具です。どのように優れた道具でも利用する側が使い方を誤れば
正しい結果は得られません。
書籍などではオブジェクト指向を使うとあたかも誰もが「良いシステムを素早
く構築できる」かのように書かれていますが、それは間違いです。
間違った方法でオブジェクト指向を利用するくらいなら、利用しない方がいい
と思います。Javaでも構造化プログラムはできます。
効果を出せないオブジェクト指向は
問題を招きます
65
参考サイト
オブジェクト指向やJavaの参考サイトを記載しますので、勉強の参考にしてく
ださい。
 オカピプロジェクト:Web初心者向け
http://www.pkapiproject.com
 Javaの道:Java全般
http://www.javaroad.jp
 サンマイクロ:Java本家
http://www.java.com/ja/
 オブジェクト指向倶楽部:オブジェクト指向全般
http://www.objectclub.jp/
66
参考書
オブジェクト指向やJavaの入門書については、個人が読みやすい物が良い
と思いますが、後半の2冊はJavaエンジニアであれば一度は読んでおくべき
書籍です。
やさしいJava
初心者向けJava入門書
Java言語で学ぶデザインパターン入門
Javaは理解してより再利用性の高いプログラムを作りたい人
Javaの格言
Javaのスキルをさらにのばしたい人
67
教材のダウンロード
今回の講座で使用したテキスト、スライド、ソースはエクスウェアのサイトより
ダウンロードすることができます。
講座の復習や社内での学習に活用してください。
http://www.xware.co.jp/learn/
68
エクスウェアのご紹介
エクスウェアはJavaを得意とし、「システムコンサルティング」、「技術支援」、
「システム開発」を行うシステムインテグレータです。
また、エンジニアの新人教育や若手研修もおこなっております。
システム開発やエンジニア教育など、ご要望がございましたら
お気軽に下記までお問い合わせください。
エクスウェア株式会社
URL:www.xware.co.jp
東京都品川区北品川1−11−1寿ビル4階
TEL :03-3474-0760
Mail:[email protected]
担当:滝本(タキモト)