目次

Similar documents
オブジェクト指向開発論

PowerPoint プレゼンテーション

Microsoft PowerPoint - 04_01_text_UML_03-Sequence-Com.ppt

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

PowerPoint プレゼンテーション

PowerPoint Presentation

プログラミング基礎I(再)

Microsoft PowerPoint - swing3.ppt

2. 目的 1RationalRose を利用する場合にプログラム仕様書としての最低限必要な記述項目を明確にする 2 プログラム仕様書として記載内容に不足がない事をチェックする 3UML の知識があるものであれば 仕様書の内容を理解できること 4Rose にて入力した内容を SoDaWord を利用

Java言語 第1回

Microsoft PowerPoint - UML1_2009.ppt

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

C#の基本

ガイダンス


メソッドのまとめ

UML は次のように表記を拡張して 利用しやすくすることができる ステレオタイプ クラス図などで モデル要素の意味を拡張するもの ギルメット << >> によるラベル表記と アイコン表記がある <<actor>> <<interface>> ステレオタイプ一覧 UML 表記の拡張 ATM 利用者 ス

ガイダンス

V8.1新規機能紹介記事

Prog2_12th

ガイダンス

PowerPoint Presentation

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint - OOP.pptx

GEC-Java

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

ボタンイベントアプリイベント処理を含むアプリとして, ボタンをもち, ボタンを押すと文字列を表示するアプリを作る. このアプリは,HelloWorld アプリを改造して作成するため, アプリ作成の途中からの手順を示す. 1. ボタンの設置 (1) レイアウトにボタンを追加するパレットの フォーム ウ

PowerPoint プレゼンテーション

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

科学的モデリング 2 回 継承 2 無断転載 & 無断配布を禁じます 第 2 回 : 科学的モデリング 継承 2 継承される特性( プロパティ ) 第 2 回の話題 継承は何を継承するのか? 今回のコラムの話題は 継承される特性 ( プロパティ ) についてです そもそもサブクラスはスーパークラスか

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

プログラミング入門1

リファレンス,配列 例外処理

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

第1章 ビジュアルプログラミング入門

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

Microsoft PowerPoint - prog09.ppt

Java知識テスト問題

Microsoft PowerPoint - prog09.ppt

もくじ

JAVA入門

クラス図とシーケンス図の整合性確保 マニュアル

Javaプログラムの実行手順

基本情報STEP UP演習Java対策

Microsoft PowerPoint - se06-UML(UseCase)_2.ppt [互換モード]

もくじ

ガイダンス

ソフトウェア開発方法論2

PowerPoint プレゼンテーション

プレポスト【問題】

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

手書認識 グラフ描画 Step2-2 手書認識 : 認識結果を PaintPanel で描画する < 属性付き文字列 AttributedString> 標準出力では分かりにくいうえに認識結果を使えないので 認識するごとに PaintPanel に文字を描画することにする ここで 数式はただの文字列

JavaプログラミングⅠ

Java言語 第1回

以下に java.awt.graphics クラスの主なメソッドを示す (Graphics クラスの ) メソッド drawline(int x1, int y1, int x2, int y2) drawrect(int x, int y, int width, int height) fillr

Prog2_6th

Microsoft PowerPoint - se05-ER&OOAD&UML.ppt [互換モード]

Microsoft PowerPoint - OOP.pptx

もくじ

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog12.ppt

もくじ

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

2

デザインパターン第一章「生成《

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

GEC-Java

ガイダンス

ガイダンス

テキストファイルの入出力1

PowerPoint プレゼンテーション

Microsoft PowerPoint - swing2.ppt

Delphi/400でFlash動画の実装

Prog2_6th

GUIプログラムⅣ

Microsoft Word - VB.doc

Microsoft PowerPoint ppt

<4D F736F F F696E74202D AC C8899E D834F E >

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

Assignment_.java /////////////////////////////////////////////////////////////////////// // 課題 星の画像がマウスカーソルを追従するコードを作成しなさい 次 ///////////////////

教材ドットコムオリジナル教材 0から始めるiアプリ (4) 0 から始める i アプリ (4) i アプリをプログラミングする際に必要なのは Java というプログラミング言語の基礎知識です 独自の命令や駆使してプログラミングをするわけですが Java というベースになっている言語を知らないでプログ

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Jude を DSL エディタとして使う -Jude API 活用法 年 11 月 14 日稚内北星学園大学東京サテライト校浅海智晴 本日のテーマ Why Jude API What Jude API How Jude API 1

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

【手引き】完了時の手続について

Prog2_9th

GUI プログラミング第 4 Graph ~ 手書認識と関数グラフ描画 ~ マウスで数式を書いて認識し 関数グラフを描画する < 手書認識とグラフ描画のステップ> ステップ 1_1 フレームの作成 ステップ 1_2 マウスで自由に線を書く ステップ 2-1 手書認識認識結果を標準出力する ステップ

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010

目次

JavaプログラミングⅠ

プログラミング実習I

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

Sort-of-List-Map(A)

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

Transcription:

ソフトウェア工学 2020 年 10 月 19 日 海谷治彦 1

モデリングの視点復習 目次 クラス図 インタフェースに関する補足も含む シーケンス図 実例 2

復習 モデリングの代表的な側面 構造的側面 現実世界のどんなモノが当面コンピュータで行いたいことに関係するか, それらの ( 静的な ) 関係は何かを明確にする. 通常, クラス図を利用. 機能的側面 現実世界の事象 ( コンピュータへの入力 ) に対して, コンピュータは何を起こすかを明確にする. 通常, ユースケースモデルを利用. 振る舞い的側面 機能の実行順序をモデル化. 通常, ステートマシン図, アクティビティ図, シーケンス図を利用. 3

クラスとは? オブジェクト指向のプログラムでの基本単位. 形式的には, データ ( 属性 ) 群と, それに対する操作 ( メソッド, 関数 ) 群のセットとなっている. 意味的には, 特定の役割を担うモノ ( 名詞 ) をあらわしている. 役割 ( 一般 ) を表記しているものであり, 個々の具体的な事例を示しているわけではない. クラスとインスタンスの違い Java や C# 等の場合, モデリングでのクラスが, ほぼそのまま, プログラムのクラスとなる. 4

復習 ICONIX の全体手順 5

クラス図作成の input は何か? ドメインモデル 基本, 名詞概念がクラスになる場合が多い. ユースケース記述 システムと利用者の対話を書いている. この対話中から, 利用者, インタフェース, データに相当する概念を抜き出しクラス候補とする. 本来は, ロバストネス分析というのをやらないといけないが, 時間の都合で省略. ユースケース記述を, アクター, バウンダリ, コントロール, エンティティという概念に整理しなおす. 6

参考 MVC について Model-View-Controller の略. アプリケーションを作る際に上記の三つに分けて設計すると良いという指針. Model アプリで扱う業務や活動のみを扱う部分. ショッピングサイトの業務なら商品, 注文, 顧客等がコレに相当. 基本, システムとは関係ない業務依存の部分. 主に普通のクラスや JavaBeans 等で実現される. View システムとしてユーザーと相互作用する部分. 入出力. ウエブアプリならウエブページに相当し, 主に JSP が担当. Controller Model と View を関連付け, 業務の進行を制御する部分. 主に Servlet が担当. 7

参考 MVC のメリット 特に Model と他を分離することで, 実現方法を簡単に変更できる. 例えば, ウエブアプリをやめて, アンドロイドの専用アプリを作ろうという時にも,Model はそっくりそのまま流用できる.(Java の場合, 特に ) Model で表現される業務は往々にして類似したものが多いので, 再利用ができる. 我々が想像する以上に業務というのはワンパターン アマゾンも楽天もやってることはほぼ同じ. 吉野家, 松屋, すき家もほぼ同じ. アプリケーションフレームワーク等. 8

参考 CRUD + I Create, Read, Update, Delete の接頭語 (Acronym). データに対する最も一般的な処理群を表す. これに加えて, 一覧 (Index) の処理も実装する場合がある. 9

クラス図の表記 既に出てきているが, 箱を三分割した表記をとる. 上の区画がクラスの名前, 中が属性群, 下がメソッド群となる. トランプの手札 - カード群 : トランプのカード [] + カードを抜く () : トランプのカード + カードを追加する ( 追加分 : トランプのカード ) : void + 重複番号カードを抜く () : トランプのカード [] + シャッフルする () : void 10

属性とメソッドの命名 名前の付け方は実用的には非常に重要. 人は名前で意味をくみ取るため. 属性 名詞か名詞句 メソッド 動詞か動詞句 主語は, そのクラス以外を想定してつける. 11

メソッドの主語は主語以外! あるクラスのメソッドは, そのクラス以外が呼び出すことが多い. よって, そのような想定の意味を反映する動詞等がよい. 例 : 銀行口座のクラス 銀行口座 - 残高 : int + 参照する () : void + 設定する () : void 良い. 属性に対してget/setという操作をつけるのは一般的. BankAccount getter, setter と呼ばれる - balance : int + getbalance() : int + setbalance() : void 銀行口座 - 残高 : int + 提供する () : void + 更新する () : void 良くない, 特に, 提供する は銀行口座の目線のため BankAccount - balance : int + providebalance() : int + updatebalance() : void 12

クラス図 クラス間の関連を付記したクラス群の図. 関連を線で書く. 線でつながっているクラス間で, メソッドの呼び出しを行うことができる. 自身への関連は特別な場合以外はかかない. 方向性を書くこともある, その場合, メソッド呼び出しは一方的. 13

メッセージ vs メソッド呼び出し オブジェクト指向は, 本来, オブジェクト ( クラス ) 間で, メッセージを送りあうことでオブジェクトが情報交換をするという考え方だった. Smalltalk, objective-c, Ruby にはメッセージがあるらしい. Java や C# 等のオブジェクト指向言語にはメッセージという概念は無い. 基本,C 言語から進化したからだと思う. そこで,Java 等では, メッセージの代わりに, メッセージを送る先のオブジェクトのメソッドを呼び出すという形で, 情報交換を実現している. 14

クラス図の例 Player Master - name : String + receivecard(card : Card) : void + player(nextplayer : Player) : void + showhand() : Hand * progress 1 + declarewin(winner : Player) : void + preparegame(cards : Hand) : void + startgame() : void + registerplayer(player : Player) : void own own dispose 1 - table 1 Table + disposecard(card : Card[]) : void 1 Hand + addcard](card : Card) : void + pickcard() : Card + findsamenumbercard() : Card[] + getnumberofcards() : int + shuffle() : void compose - hand * Card - number : int - suit : int + getnumber() : int 15

クラス図 vs オブジェクトのイメージ クラス図 ( クラス レベル ) オブジェクト図 ( インスタンス レベル ) 16

多重度 1 対 1, 多対一等の対応を示す. 1 が一 * はゼロ以上 17

誘導可能性 navigable 関連に方向性がある場合, 頭を書く. 尾から頭に向けて参照できる. 尾が頭の参照を持っている. 18

関連名 関連の意味に名前をつける. 後述の関連端名 ( ロール名 ) と区別するために をつける. 19

関連端名 ( ロール名 ) 名がついてない方から見て, 名がついてる方にどうかかわるかを記述. 20

+ と - + は public - は private 21

集約 Aggregation 部分 - 全体関係 全体が消えても部分は消える必要はない. 22

コンポジション Composition 全体が消えれば部分も消える関係. 23

定義説明 クラスや関連には説明書きが書ける. 意味不明にならないように書いておこう. Java ソースを生成するとコメント文に入る. 24

汎化 継承 で書きます. 一般 - 特殊の関係 Javaでいうところの extends 車両 鉄道 トラム 自動車 モーターバイク 自転車 電車 機関車 ガソリン車ディーゼル車電気自動車 25

インタフェースの実装 と点線で書く. インタフェース側は <<interface>> というステレオタイプを付けないといけない. ステレオタイプ : クラス等の種類の分類タグと思えばよい. 26

Interface あるクラスの多面性 ( ま, 別に一面でもいいけど ) を明示的に記述したもの. あるクラスで interface を実装することで, そのクラスは interface で定義されたメソッドを提供することを保障する. interface の意味通り,(interface を実装した ) クラスを使う ( 他の ) クラスのための接点を提供するもの. ユーザーインタフェースとは関係ない. 27

サッカー選手であって, サッカーする. 例 ( というか比喩 ) ある人 ( インスタンス ) 大学生であって, 勉強する. 実験する. 家庭教師であって, 教える. 28

interface の記述 public interface FootballPlayer{ public void select(game g); } public interface Student{ public void teach(field f); } public interface PrivateTeacher{ public void learn(); public void invite(); public void emply(pupil p); } 29

interface の実装 class Gakusei implements FootballPlayer, Student, PrivateTeacher{ public void select(game g){ // 実際あるゲーム g への参加選抜をされる際の処理をかく } public void teach(field f){ // 実際にある分野 f を教わる場合の処理を書く } public void employ(pupil p){ // 実際にある生徒 p に雇われる際の処理を書く } public void learn(){ // 実際に雇われている生徒が学ぶ際の処理を書く } } 30

interface の効用 ( 前述のように ) あるクラスの持っている側面に明示的に名をつけて区別することができる. クラスを使う側からすれば, クラスではなくインタフェースを指定することで, クラス間の関連を低くすることができる. あるインタフェースを実装したクラスなら, なんでも使えるような汎用性の高いクラスを書ける. 31

家庭教師を雇う方にすれば, その機能を提供するものなら誰でも良い ( はず ). class Pupil {... educate(privateteacher pt){ pt.employ(this); pt.invite(); pt.lean(); } } Interface で指定 class Woman implements PrivateTeacher, HouseWife{... } class Jisan implements PrivateTeacher, Niwashi{... } class Gakusei implements FootballPlayer, Student, PrivateTeacher{... } 32

クラス図で書いてみると <<interface>> FootballPlayer <<interface>> Studnet <<interface>> PrivateTeacher employ(pupil) invite() learn() Pupil Gakusei Jisan Woman 33

現実的な interface Java の標準 API (Application Programming Interface, 標準的に利用できるクラスライブラリのこと ) には, 多数の interface と多数の interface を実装したクラスがある. 34

Interface Serializable java.io パッケージ内に定義 この interface が実装されているクラスのインスタンスは, ファイルにしまったり, ネットワーク上にデータとして転送できたりする. 逆にこれが実装されていないクラスのインスタンスはファイル保存等ができない. String, Vector, Integer 等, データ指向のクラスでは大抵実装されている. 35

Interface Runnable run + able すなわち 実行可能 を示す interface. スレッド ( プログラム内の並行処理の 1 つ ) を実現するためには, このインタフェースに, 処理ループを書くのが普通. public void run() メソッドの実装を指示. 36

MouseListener GUI においてマウスの動作に伴い発生するデータ (event) を拾い, それに反応するためのクラスは大抵, コレを実装している. ボタン等は, 通常, 特定の MouseListener を実装したクラスが結びついているが, その結びつきを変えることで, 簡単にボタンを押した際の振る舞いを変えることができる. 37

例 : リスナを使ったイベント駆動 イベントリスナ : 発生したイベントに対応してある処理をする部品 イベントソース : イベントを発生する部品 この例では, ボタンを押すとラベルの数値が増える, という単純なもの. 38

import java.applet.*; import java.awt.*; import java.awt.event.*; public class ButtonListen extends Applet{ } public void init(){ Button b=new Button("Up"); MSLabel ms=new MSLabel(0); b.addmouselistener(ms); this.add(b); this.add(ms); } } 例 : ソースコード class MSLabel extends Label implements MouseListener{ private int; MSLabel(int initn){ n=initn; settext(n+""); } public void mouseclicked(mouseevent e){ n++; settext(n+""); } public void mouseentered(mouseevent e){} public void mouseexited(mouseevent e){} public void mousepressed(mouseevent e){} public void mousereleased(mouseevent e){} ボタン b のイベントをラベル ms が聞くように指示 ボタン系のイベントに対応して行う処理を, ラベル ( リスナー ) 内に実装. 39

クラス図 Component addmouselistener(mouselistener) <<interface>> MouseListener mouseclicked() mouseentered()... Label Button MSLabel 40

Interface の TIPS Class よりむしろ Interface のほうが役割という意味に近い. 視点 と考えてもよい. インスタンスは実装されている Interface で参照できる. Interface で参照するとアクセス可能なメソッドは減る可能性がある. Class を使うことを想定せず,Interface を使うことを想定したクラスのほうが柔軟. 41

インタフェースは振舞は規定しない オブジェクトに対する操作方法と, それに対応する振る舞い を規定と解説する本もある. 操作法は規定している. 振る舞いは規定されているとは言えない. メソッドの名前から直感的な振る舞いはわかる. しかし, そのメソッドが直感的な振る舞い通り実装されているかをインタフェースは保障できない. 詳細は反例 Calcable にて 42

反例 Calcable /** おかしな振る舞いの整数 */ public class FunnyInt implements Calcable { private int v=0; /** 計算可能な者とみなせるものが持つべき機能を規定 */ public interface Calcable{ /** 足し算 */ public Calcable add(calcable b); /** 引き算 */ public Calcable sub(calcable b); /** 値を文字列で返す */ public String value(); } public FunnyInt(int x){ v=x; } /** 名前に反して引き算結果を返す */ public Calcable add (Calcable b){ int y=integer.parseint(b.value()); return new FunnyInt( v-y ); } /** 名前に反して足し算結果を返す */ public Calcable sub (Calcable b){ int y=integer.parseint(b.value()); return new FunnyInt( v+y) ; } 以下, 略 43

TIPS 多重度,Nabigability, Aggregation, Composition 等は面倒なら記載しなくてもよい. 重要なのはクラスとその関連をちゃんとつけること. クラスや関連の名前は意味にあったものを選ぶこと. 44

具体例 : ばば抜き のモデリング 参考図書 なぜ Java からの引用. プレーヤーの人数 プレイヤーは 2 人以上とする. ゲームの準備 進行役は, ジョーカー 1 枚を含む 53 枚のトランプをよくシャッフルし, 参加するすべてのプレイヤーに等しく配る. プレイヤーは配られたカードを手札に加える. このとき, 手札の中に同じ数の組み合わせがある場合, その組み合わせのカードをテーブルに捨てることができる. ゲームの開始 進行役はプレイヤーを順に指名する. 指名されたプレイヤーは隣のプレイヤーの手札から任意の 1 枚を引き, 自分の手札へ加える. このとき, 手札の中に同じ数の組み合わせがある場合, その組み合わせのカードをテーブルに捨てることができる. これを繰り返し, 手札をすべてなくしたプレイヤーが上がりとなる. 最終的にジョーカーを残したプレイヤーが負けとなる. 45

クラス図 se03_6d.asta Player Master - name : String + receivecard(card : Card) : void + player(nextplayer : Player) : void + showhand() : Hand * progress 1 + declarewin(winner : Player) : void + preparegame(cards : Hand) : void + startgame() : void + registerplayer(player : Player) : void own own dispose 1 - table 1 Table + disposecard(card : Card[]) : void 1 Hand + addcard](card : Card) : void + pickcard() : Card + findsamenumbercard() : Card[] + getnumberofcards() : int + shuffle() : void compose - hand * Card - number : int - suit : int + getnumber() : int 46

シーケンス図とは? 実際にクラス間のメソッド呼び出し関係の例を書いた図. あるシーケンスの例に過ぎず, 個々のシーケンス図は, 全ての流れを網羅してはいないし, 網羅するのはよくない. 次回, 話すがシーケンス図を書きながら, クラス間の関連の有無 クラスの持つべきメソッド を決めてゆくのが普通. 最終的には, クラス図をもとに, あらゆるメソッドの呼び出し関係を網羅できないといけない. そーじゃないと, 漏れのあるプログラムとなってしまう. 47

シーケンス図じゃんけんの例 田中 : Judge 山田 : Player 鈴木 : Player 1: gethand() : Hand 2: gethand() : Hand 3: notifyresult(result:boolean) : void 4: notifyresult(result:boolean) : void 何故 Java には reply メッセージ ( 逆方向の点線矢印 ) があるが, 省略してよい. 48

reply メッセージを書きたい場合 49

トランプを配るシーケンス master : Master : Hand : Player : Hand : Table 1: shuffle() 2: pickcard() 3: receivecard(card) 3.1: addcard](card) 3.2: findsamenumbercard() 3.3: disposecard(cards) se03_6d.asta より 50

前ページは以下をもとにしている Player Master - name : String + receivecard(card : Card) : void + player(nextplayer : Player) : void + showhand() : Hand * progress 1 + declarewin(winner : Player) : void + preparegame(cards : Hand) : void + startgame() : void + registerplayer(player : Player) : void own own dispose 1 - table 1 Table + disposecard(card : Card[]) : void 1 Hand + addcard](card : Card) : void + pickcard() : Card + findsamenumbercard() : Card[] + getnumberofcards() : int + shuffle() : void compose - hand * Card - number : int - suit : int + getnumber() : int 51

活性区間は気にしなくてよい astah を使うと必ず 活性区間 という矩形がかかれれてしまいます. コレの長さや, 存在は気にしないでください. master : Master : Hand : Player : Hand : Table 1: shuffle() 2: pickcard() 3: receivecard(card) 3.1: addcard](card) 3.2: findsamenumbercard() 3.3: disposecard(cards) 活性区間 52

デモ もとになるクラス図は se03sample.zip にある se03_6d.asta を参照してください. トランプゲームのものです. これをもとにシーケンス図を色々かけます. 想定されるシーケンスがかけない場合, クラス, メソッドが不足している. 関連が不足している. のどちらかです. 53

その他, 例題 問題とクラス図, シーケンス図は, http://www.sci.kanagawa-u.ac.jp/info/kaiya/se/ の第 3 回のところからダウンロードしてください. 生命保険会社の業務支援システム 薬局の販売支援システム パソコン上の音楽ファイル再生アプリ astah を調べてみたらクラスは 5 千個以上だった! 設計しないと破綻するゾ. 54

いままでの ICONIX の苦労は? もし, いきなりクラス図を作れるのであれば, ユースケース, ドメインモデル, ロバストネス図等の苦労は不要である. カードゲームやじゃんけん等の簡単な教室での例題なら, おそらく, いきなりクラス図を書くことも可能. しかし, 現実の業務アプリ等のクラス図を何の準備も無く書くのは不可能. すくなくとも, 漏れや抜けがあとから, ぼろぼろ出てくる. よって,ICONIX の苦労は, 現実の開発では必要である. 55

次の話題へ 56

目次 クラス図の再考 ICONIXにおいて シーケンス図を書く理由 シーケンス図を書く場合のガイドライン 事例 57

クラス図 -- そもそもの目標 ソフトウェア開発の主たる目標は実行できるコードを作ることである. Java や C# 等のオブジェクト指向言語を想定する場合, クラスとクラス間の関連 ( クラス図 ) を決めることが, コードの骨組み ( 仕様 ) を決めることである. もし, いきなりクラス図が書けるなら, いままでのロバストネス図等のお絵かきは不要となる. クラス図に入れるべき情報を漏れなく集めるために, 仕方無く, なんとか図を書いているのである. 58

クラス図ができたら 基本, クラス毎にコードを書けばよい. 各クラスが持つべきメソッドと, その意味は仕様化されているので, それにしたがって, コードを書く. 必要に応じて属性を追加してゆく. 後の改造や機能追加を見越して, クラス図の構造を修正する. 等 59

シーケンス図とその役割 シーケンス図そのものについては, 前のほうのスライド参照. シーケンス図を書く理由は, クラス毎に必要なメソッドを識別してゆくことである. 60

シーケンス図の例 P211.asta 61

シーケンス図の登場人物は? 基本, ロバストネス図におけるアクター, バウンダリ, エンティティがライフラインを構成する. ユースケース記述に出てくる, 人, インタフェース, モノだと思ってくれてよい. コントロールは, 上記どれかのメソッドとなる場合が多い. コントロールは, ユースケース記述における 動詞 だと思ってくれてよい. コントロールもクラスとなりライフラインを構成する場合もある. 62

シーケンス図ガイドライン 1/2 1. なぜシーケンス図を書くか良く理解してかきなさい. 2. すべてのユースケースに対して, 基本, 代替, 例外のシーケンス図を一つのシーケンス図に書きなさい. 3. シーケンス図の作成は, バンダリ, エンティティ, アクターそしてロバストネス分析の結果を反映したユースケース記述から始めなさい. 4. シーケンス図はユースケース図の振る舞い ( すなわちコントローラー ) をオブジェクトがどのように達成するかを示す道具として使いなさい. 5. ユースケース記述が, シーケンス図上でやり取りされるメッセージと対応付けられるかどうかを確認しなさい. 記述とメッセージのやり取りとを並べてみるとよいでしょう. 63

ガイドライン 2/2 6. 活性区間に対する検討に長時間費やさないでください. 7. メッセージを書くことによって, 操作をクラスに割り当てなさい. 8. 全ての操作が正しいクラスに割り当てられるように, 操作の割り当てを行っている間はクラス図を繰り返しレビューしなさい. 9. コーディングを始める前に, シーケンス図上に描かれた設計をプレファクタリングしなさい. 10. 詳細設計のレビューを行う前に, 静的モデルを整理しなさい. 64

1. シーケンス図を書く理由 クラスに責務を割り当てること コントローラーに相当する機能を, どのクラスが実施するかを明確にする. 一つのコントローラーを一つのクラスが責任を持つとは限らない. あるユースケース中にクラス間がどのように相互作用するか明確にすること クラスに操作を割り当てる 誰が誰に対して何をするか? を明確にする. 結果として, クラスメソッドクラスの関係が明確になる. Java や C# にはメッセージの概念が無いので, メッセージを操作呼び出しに翻訳する感じ. 65

2. 基本, 代替, 例外全て詰まったシーケンス図 基本, 代替, 例外を別のシーケンス図には描かない. 全て詰まったシーケンス図が巨大になった場合, むしろ, もとのユースケースを分割すべき. 個人的には異論がある 66

プレファクタリングとは? メソッドの命名変更, メソッドの他のクラスへの移動, メソッドをクラスに置き換える, 条件記述の統合等をシーケンス図上で行うこと. これをコードを書き始めてからやることを, リファクタリングと呼ぶ. 一般にリファクタリングのほうがコストがかからない. 67

前頁の手順を実際にみてゆく 例題 顧客レビューを書く ユースケース ステップ1は省略. ところどころ英語になっている. 68

ユースケース記述 顧客レビューを書く基本コース顧客は現在表示されている書籍の 書籍詳細 ページで, レビューを書く ボタンをクリックする. システムは顧客がログイン済が否かをチェックするために顧客セッションをチェックする. + システムは レビュー記入 ページを表示する. 顧客は書籍レビューを入力し, 書籍評価を5つ星までの範囲で指定し, 送信 ボタンをクリックする. システムはレビューが短すぎたり長すぎたりしないか, 書籍評価が1~5の間となっているかどうかを確認する. システムは確認ページを表示する. * システムは顧客レビューを審査のために待機レビューキューに格納する. + このキューはユースケース 顧客レビューを審査する で処理される. + 例外コース顧客がログインしていない場合顧客はまずログイン画面を表示し, ログインしてからもう一度 レビューの記入 ページに移動する. 顧客が書いたレビューが長すぎる (1MBより長い文章) 場合システムはレビューを拒絶し, その理由を説明するメッセージを表示する. レビューが短すぎる (10 文字未満 ) の場合システムはレビューを拒絶する. 69

Step 2 エンティティを拾う : 顧客レビュー : 顧客セッション : 書籍 : 待機レビューキュー 70

Step 3 アクター, バンダリーも <<actor>> : 顧客 <<boundary>> : 書籍詳細 ページ <<boundary>> : レビュー記入 ページ <<boundary>> : 確認 ページ <<boundary>> : レビュー拒否 ページ <<entity>> : 顧客レビュー <<entity>> : 顧客セッション <<entity>> : 書籍 <<entity>> : 待機レビューキュー p226.asta をみてください 71

完成シーケンス図の例 <<actor>> : 顧客 <<boundary>> : 書籍詳細 ページ <<entity>> : 待機レビューキュー <<boundary>> : ログイン ページ 1: レビューを書く ボタン () : void <<create>> 1.1: display() <<boundary>> : レビュー記入 ページ 2: 送信 ボタン () : void <<create>> 2.1: new() <<entity>> : 顧客レビュー 2.2: setreviewtext(text:string) : void 2.3: setrating(rating:int) : void <<create>> 2.5: display() 2.4: validate() : void <<boundary>> : 確認 ページ 2.6: add(review: 顧客レビュー ) : void 3: display() 2.7: validation エラーを表示 () : void 2.8: display() : void p239.asta 72

シーケンス図に基づくクラス図 <<boundary>> ホームページ + display() : void <<entity>> 顧客セッション + isuserloggedin() : boolean <<boundary>> 書籍詳細 ページ + display() : void <<entity>> 顧客レビュー - rating : int - reviewtext : String + setreviewtext(text : String) : void + setrating(rating : int) : void + validate() : void <<entity>> 書籍リスト <<boundary>> レビュー記入 ページ + validationエラーを表示 () : void + display() : void <<entity>> 書籍 <<boundary>> ログイン ページ + display() : void <<boundary>> 確認 ページ + display() : void <<entity>> 待機レビューキュー + add(review : 顧客レビュー ) : void 73

プレファクタリングした やったことはページまわりのスーパークラスを作っただけ. 一部, サブクラスを残して中身の再定義 (override) を行う. <<boundary>> View + display() : void <<boundary>> ホームページ <<boundary>> ログイン ページ <<entity>> 書籍リスト <<entity>> 書籍 <<boundary>> 書籍詳細 ページ <<entity>> 顧客セッション + isuserloggedin() : boolean <<boundary>> レビュー記入 ページ + validationエラーを表示 () : void + <<override>> display() : void <<entity>> 待機レビューキュー + add(review : 顧客レビュー ) : void <<boundary>> 確認 ページ <<entity>> 顧客レビュー - rating : int - reviewtext : String + setreviewtext(text : String) : void + setrating(rating : int) : void + validate() : void 74

本日は以上 75