24
1 © 2016 The MathWorks, Inc. アプリケーションを作るなら オブジェクト指向プログラミング! MathWorks Japan カスタマー トレーニング部 トレーニング エンジニア 道家治郎

アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

Embed Size (px)

Citation preview

Page 1: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

1© 2016 The MathWorks, Inc.

アプリケーションを作るならオブジェクト指向プログラミング!

MathWorks Japan

カスタマー トレーニング部

トレーニング エンジニア

道家治郎

Page 2: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

2

今日は、皆さんに次の3点を知っていただきます

オブジェクト指向プログラミングを使うべきシナリオ

MATLAB® でオブジェクト指向プログラミングができる

「MATLAB によるオブジェクト指向プログラミング」のトレーニング コースがある

Page 3: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

3

少し思い出してみてください...

アプリケーション(ツール)を作る時、どのような悩みがありますか?

「ここは注意しなければいけない」

「これをするのが大変だ」

「このような機能を追加したいけど、難しい・できない」

具体的に見てみましょう...

Page 4: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

4

アプリケーション開発の悩み:関数の入力引数の管理

プログラムが複雑化してくると、様々な関数へのデータの受け渡しも複雑になってくる

ある関数を変更すると、それに伴って他の関数も変えなければならなくなる

main()

subFcn1(p1)

subsubFcn1(p2)

subFcn2(p1,p2,p3)

subsubFcn2(p1,p2)

subsubsubFcn1(p2)

subsubFcn2(p1,p2,p4)

subFcn2(p1,p2,p3,p4)

subsubsubFcn1(p2,p4)

Page 5: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

5

アプリケーション開発の悩み:配布した時に起きる関数名の競合

Analysis Tool

main.m

importData.m

plot.m

exportData.m ...

importData.m (B さんのインポート関数)

...

plot.m (MATLABのプロット関数)

B さんの MATLAB パスA さんが作成したアプリケーション

main.m

importData.m

plot.m

exportData.m

B さんへ配布

Page 6: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

6

アプリケーション開発の悩み:配布した時に起きる関数名の競合

>> x = 1:5;

>> y = sin(x);

>> plot(x,y)

エラー: plot

入力引数が多すぎます。

>> data = importData;

入力引数が不足しています。エラー: importData (line 3)

data = xlsread(filename);

...

importData.m (B さんのインポート関数)

...

plot.m (MATLABのプロット関数)

B さんの MATLAB パス

main.m

importData.m

plot.m

exportData.m

Page 7: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

7

アプリケーション開発の悩み:機能拡張に伴う労力

既存のアプリケーションの拡張であっても、うまく再利用できないコードがあり、重複した開発となってしまう

1-D バージョン 2-D バージョン

Page 8: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

8

アプリケーション開発の悩み:連動させた処理の実現

GUI などで、ある処理と連動させた動きを実現させたい時、コールバック関数が膨れ上がってプログラムが複雑になってしまう

Page 9: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

9

オブジェクト指向プログラミングを使うべきシナリオ

その①:アプリケーション内でデータを共有したい時

– 解決する悩み:関数の入力引数の管理

その②:使いやすい、分かりやすい関数を定義したい時

– 解決する悩み:配布した時に起きる関数名の競合

その③:今後アプリケーションを拡張する必要がある時

– 解決する悩み:機能拡張に伴う労力

その④:連動した処理をさせたい時

– 解決する悩み:連動させた処理の実現

Page 10: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

10

デモ: ビジュアル データ エディター(Visual Data Editor)

データの可視化、補間、編集ツール– 1D (𝑦 = 𝑓 𝑥 )、2D (𝑧 = 𝑓 𝑥, 𝑦 ) に対応

– 読み込んだデータを散布図として表示

– 補間データの計算及び表示

– グラフと表からのデータ修正

– コマンドライン & グラフィカルなインターフェイス

Page 11: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

11

オブジェクト指向プログラミング(OOP)とは

オブジェクト指向プログラミング(object-oriented programming, OOP)とは、相互にメッセージ (message) を送りあうオブジェクト (object) の集まりとしてプログラムを構成する技法である。

Source: Wikipedia

... とありますが ...

Page 12: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

12

従来の MATLAB プログラミングとは

“手続き型” ではデータを様々な処理に受け渡していく– プロトタイプや目前の処理を手軽に行うときに活用

データ

ノイズの除去

モデルの作成統計

最適化

リサンプル

+、-、×、÷

sin、cos

plot

+、-、×、÷ sin、cos モデルの作成 plot

ノイズの除去 最適化

Page 13: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

13

オブジェクト指向プログラミングとは

OOP ではデータに対して行う処理を予め決めておく– 一連の処理を形式化し、再利用や配布用のアプリケーションを作成するときに活用

データ解析ツール

データ

ノイズの除去

モデルの作成

グラフの作成

データ解析ツール

データ

ノイズの除去

モデルの作成

グラフの作成

データからモデルを作成したい

Page 14: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

14

OOP 用語

データ解析ツール

データ

ノイズの除去

モデルの作成

グラフの作成

プロパティ

メソッド

メソッド

メソッド

クラス

オブジェクト

.mクラス定義ファイル

Page 15: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

15

OOP 用語

クラス– 情報と処理(とその関係)を定義したもの

オブジェクト– クラスの定義に基づいた1つの例

プロパティ– クラス内に定義されている様々なデータ

メソッド– クラス内に定義されている様々な処理

クラス定義ファイル– クラスを定義している MATLAB ファイル

Page 16: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

16

OOP を使うべきシナリオ その①:アプリケーション内でデータを共有したい時

プロパティを使うと必要なデータをすべて管理できる

オブジェクトさえ受け渡しすれば、データもついてくる

プロパティ:• XData

• YData

• HokanType

オブジェクトplotData( )

XData

YData

HokanType

evaluate( )

XData

YData

x = 2, 3, 4, 6 の y の値は?

Y

X

Scenario1

Page 17: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

17

メソッド:

クラス

OOP を使うべきシナリオ その②:使いやすい、分かりやすい関数を定義したい時

メソッドはクラス内でしか意味を持たないので名前の競合がなくなる

• plot()

• evaluate()

• sin

• xlsread

• plot

• filter

• legend

• ...

MATLAB の関数リスト

関数名の競合に注意クラス外の関数とは競合しない

• plot()

• evaluate()

Scenario2a

Page 18: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

18

OOP を使うべきシナリオ その②:使いやすい、分かりやすい関数を定義したい時

メソッドはアプリケーションに紐付けされた関数なので名前の競合がなくなる

演算子やインデックス参照の再定義ができる– obj(val) の意味を変えられる

– オブジェクトに対する +、-、×、÷ などの演算子を定義できる

メソッド:• evaluate()

• plot()

Data1d y = f(x)

% 𝒚 = 𝒇 𝟑. 𝟒 を求めるには>> y = evaluate(fcn,3.4) >> y = fcn(3.4)

+ =• subsref()

• plus()

Scenario2b

Page 19: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

19

OOP を使うべきシナリオ その③:今後アプリケーションを拡張する必要がある時

継承を使うと関連したクラスを作成したり、既存のクラスを拡張したりできる

プロパティ:• XData

• YData

• HokanType

• ShowHokan

Data1d y = f(x)

プロパティ:• XData

• YData

• ZData

• HokanType

• ShowHokan

Data2d z = f(x,y)

Scenario3

Page 20: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

20

OOP を使うべきシナリオ その④:連動した処理をさせたい時

イベントとリスナーを使うとオブジェクト間の自然な振る舞いが実現できる– イベントとは何かが起きた、という報告

– リスナーはあるイベントに反応するもの

>> obj = Data1d([1 2 3 4],[5 7 3 5])

>> plot(obj)

>> obj.YData(2) = 4

Scenario4

値が変わった!

Page 21: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

21

オブジェクト指向プログラミングを使うべきシナリオ

その①:アプリケーション内でデータを共有したい時

– 解決する悩み:関数の入力引数の管理

その②:使いやすい、分かりやすい関数を定義したい時

– 解決する悩み:配布した時に起きる関数名の競合

その③:今後アプリケーションを拡張する必要がある時

– 解決する悩み:機能拡張に伴う労力

その④:連動した処理をさせたい時

– 解決する悩み:連動させた処理の実現

Page 22: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

22

その他、OOP を使う理由

ユーザーから中身を隠したい(カプセル化)

新しいデータ型を作成したい、MATLAB 既存のデータ型を拡張したい

参照渡しのデータを作成したい

MATLAB 本体でもあらゆる所でオブジェクトが使われている

– System Objects, fit objects, neural net objects, App Designer, etc.

そもそも表現しようとしているものが「オブジェクト(物)」である

解析をしている方へ:解析は何度も行うことなので、解析アプリケーションを作ることに

よって効率をあげられる

ユーザーから中身を隠したい(カプセル化)

MATLAB 本体でもあらゆる所でオブジェクトが使われている

– System Objects, fit objects, neural net objects, App Designer, etc.

解析をしている方へ:解析は何度も行うことなので、解析アプリケーションを作ることに

よって効率をあげられる

Page 23: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

23

「MATLAB によるオブジェクト指向プログラミング」2日間トレーニング コース

2日間で MATLAB を使ったオブジェクト指向

プログラミングが習熟できます。

対象者:既に MATLAB を使用している人。

オブジェクト指向プログラミングの基礎知識はいりません。

特徴:様々な例題を使用して OOP を基礎から体系

的に学べます。講師が付いているのでその場で疑問点

を解消することができます。

詳しくはトレーニング ブースへ

第 1 日• はじめに• カスタム データ型の作成• MATLAB クラスの設計• クラス階層の構築• 複数の参照を容易にする方法第 2 日• 単体テストの作成• オブジェクトの同期• オブジェクトの変換と連結• まとめ

コース概要

年内開催日:10月27日~28日 (名古屋)12月20日~21日 (東京)

Page 24: アプリケーションを作るなら オブジェクト指向プロ subsref() + = • plus() Scenario2b 19 OOP を使うべきシナリオその③: 今後アプリケーションを拡張する必要がある時

24

ご清聴ありがとうございました