Python講座 第2回

51
Python 講講 2015 講講 講 2 講 講講講講講講講講講講 講講講講講 講講講講講講講講講講講講講講 2 講 講講講講 :26413508 講講 講講

Transcript of Python講座 第2回

Page 1: Python講座 第2回

Python 講座 2015 年版 第 2 回名古屋工業大学大学院工学研究科創成シミュレーション工学専攻 2 年学籍番号 :26413508大脇 謙太

Page 2: Python講座 第2回

イントロダクション

Page 3: Python講座 第2回

ある疑問

なぜプログラミングをするのか ?

プログラミングが何の役に立つのか?

Page 4: Python講座 第2回

より良いシステムを作るため– 直感的に正しく– 社会の役に立つ– ( ミクロな視点で ) クライアントの役に立つ

もっと計算機を使いやすくする– 素人では触れないところに改良を施す

人の役に立つ「ものを作る」というのが工学における基礎理念情報工学において 「もの」 ハードウェア、ソフトウェア

プログラム

Page 5: Python講座 第2回

・・・と、言いましたが

当面のところは研究のためと割り切っておきましょう (^^;)

Page 6: Python講座 第2回

前回講座にて

オブジェクト指向

Page 7: Python講座 第2回

オブジェクト指向とは• プログラミングパラダイムの一つ– 命令型– 関数型– 手続き型– オブジェクト指向 etc…

( プログラミングパラダイムとはコーディング、プログラムに関する考え方のこと )

• Python は厳密にはマルチパラダイム• Python を扱う上でオブジェクト指向は重要

オブジェクト指向、プログラミングパラダイムは奥が深い

Page 8: Python講座 第2回

おすすめの本技術評論社いちばんやさしいオブジェクト指向の本 第 2 版井上 樹 著

「オブジェクト指向そのものを解説」した日本語の書籍オブジェクト指向が生まれた背景から概念の理解、プログラミングの特徴設計の指南( 教科書、読本と呼ぶにふさわしいと思います ぜひご一読あれ )

たつき

Page 9: Python講座 第2回

おすすめの本翔泳社オブジェクト指向入門 第 2 版原則・コンセプトBertrand Meyer 著酒匂 寛 訳

オブジェクト指向の第一人者バートランド・メイヤー氏の著作本 ( 前編 ) です。入門に適しているとは言えませんが、オブジェクト指向な定義・考え方・技法が詰まっています。( 内容は簡単ではありませんが、ソフトウェア開発技術者であれば一度は読むべき )

※ 申し訳ありませんが、こちらの本はまだ読んでおりません。

Page 10: Python講座 第2回

おすすめの本翔泳社オブジェクト指向入門 第 2 版方法論・実践Bertrand Meyer 著酒匂 寛 訳

オブジェクト指向の第一人者バートランド・メイヤー氏の著作本 ( 後編 ) です。モデリングのための視点、分析設計の原則を丁寧に解説。オブジェクト指向を熟知したい方向け( 内容は簡単ではありませんが、ソフトウェア開発技術者であれば一度は読むべき )

Page 11: Python講座 第2回

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

Page 12: Python講座 第2回

プログラミングの意義

より良いシステムを作ること

Page 13: Python講座 第2回

システムとはA system is a set of interacting or interdependent components

forming an integrated whole.

システムとは互いに作用しあい、依存しあう要素の集まりであり、要素は統合し全体を形成する。

―― 英 Wikipedia より

身近なシステム– 時計– 楽器– カメラ– PC etc…

Page 14: Python講座 第2回

システムとは情報工学においては

システムシステムデータ データ データ手続き 手続き 手続き

手続き手続き手続き

モジュールデータデータデータ手続き手続き手続き

モジュールデータデータデータ手続き手続き手続き

モジュールデータデータデータ手続き手続き手続き

手続き ( 関数 ) とデータ (変数 ) の集合体構造化プログラミング モジュール (部品 ) の集合体モジュール化プログラミング

Page 15: Python講座 第2回

よく似たシステム手続き ( 関数 ) とデータ (変数 ) の集合体構造化プログラミング モジュール (部品 ) の集合体モジュール化プログラミング

オブジェクト指向はこちらに近い

マルチエフェクター コンパクトエフェクター

Page 16: Python講座 第2回

オブジェクト指向のプログラミング先ほどの例でいくと1. まっさらなエフェクターボードを用意します ( インタプリタを起動 )2. 設計図からエフェクターを作成し3. 各種エフェクターを設定し4. エフェクターボードに並べ5. 配線します

ギターからの入力に対して所望の出力を施せるシステムの完成です

Page 17: Python講座 第2回

オブジェクト指向 ( オブジェクト製作 ) の方式クラスベース方式

– 設計図から作成する方式

Page 18: Python講座 第2回

オブジェクト指向 ( オブジェクト製作 ) の方式プロトタイプベース方式

– プロトタイプから改良する方式

Page 19: Python講座 第2回

クラスベースオブジェクト指向§1. オブジェクト指向とは§2. キーワード

Page 20: Python講座 第2回

§1. オブジェクト指向とは• 現実世界、実生活に根差した考え方をコンセプトにしている• もの ( 人 ) があって、それを操作する ( 命令を出す )• お互いにメッセージを送りながら協調し複雑なシステムを成す

Page 21: Python講座 第2回

§2.キーワード

1. オブジェクト2. クラス3. インスタンス

Page 22: Python講座 第2回

オブジェクト一つのテーマをもとに集めたデータと命令 (処理 )オブジェクト モジュール≒

vol の値Gate の値

Comp の値

Gate(x)

Volume( x )

Effect( ON/OFF)

オブジェクトデータ

手続きデータ --> メンバ変数、 クラス変数、プロパティ etc…手続き --> メソッド

Page 23: Python講座 第2回

クラスオブジェクトの設計書 ( 定義 )

クラス名

関数名

処理内容

Page 24: Python講座 第2回

インスタンスクラスをもとに作った 実体 ( オブジェクト )オブジェクトは量産可能です

Page 25: Python講座 第2回

クラスの利点• static変数、クラスメソッド– オブジェクトを生成しなくても呼び出せる変数やメソッドを定義できる– クラス内の変数やメソッドに直接アクセスできる

Page 26: Python講座 第2回

オブジェクト指向の特徴

§1. ポリモーフィズム§2. カプセル化§3. 動的型付け§4. 継承

Page 27: Python講座 第2回

キーワード

1. ポリモーフィズム2. カプセル化3. 動的型付け4. 継承

Page 28: Python講座 第2回

§1.ポリモーフィズム例 : ギターエフェクター

ELECTRO HARMONIXSMALL CLONE

( コーラスエフェクター )

BOSSTURBO Distortion DS-2( ディストーションエフェクター )

Page 29: Python講座 第2回

比較

ELECTRO HARMONIXSMALL CLONE

( コーラスエフェクター )

BOSSTURBO Distortion DS-2( ディストーションエフェクター )

– 設計書 ( クラス ) が違う– つまみ (変数 ) の数も違う– エフェクト (処理 ) も違うこの 2 つのエフェクターは全く別のオブジェクトところが、踏めばエフェクトがかかるという手続き ( メソッド ) は共通ユーザが新しいものを使用する際、抵抗感を減らす

ポリモーフィズム (多態性 ) とは同じメッセージでも、受け取ったオブジェクトによって動きが変わること

Page 30: Python講座 第2回

ポリモーフィズムの利点機能追加や仕様変更に強いシステムを作ることができる

手続き ( 関数 ) とデータ (変数 ) の集合体構造化プログラミング モジュール (部品 ) の集合体モジュール化プログラミング

機能を追加したいグレードアップしたい 買い替えコスト悪

機能の追加グレードアップ部分的買い替コスト良

Page 31: Python講座 第2回

§2. カプセル化

IbanezTS-9

( 本体 )IbanezTS-9( 内部基盤 )

IbanezTS-9( 設計図 )

インスタンス生成

Page 32: Python講座 第2回

比較

IbanezTS-9

( 本体 )

IbanezTS-9( 内部基盤 )

– 設計書 ( クラス ) が同じ– つまみ (変数 ) の数も同じ– エフェクト (処理 ) も同じ この 2 つのエフェクターは本質的に全く同じオブジェクトところが、

感覚的に使いやすいのは圧倒的に左側

カプセル化 (情報隠蔽 ) とはオブジェクトのデータと手続きを包み込み、ブラックボックス化すること

ユーザには必要最低限の内容を提示し、混乱、誤用、使いづらさを回避する

Page 33: Python講座 第2回

プロフェッショナルの領域

KEELEYTS-9 Mod Plus

Modify( 改造 ) --- オブジェクトの中身をよく理解し改良を施す

Page 34: Python講座 第2回

§3. 動的型付け

MaxonAD-999analog delay

MaxonAD-999analog delay

MaxonAD-999 クラス

Page 35: Python講座 第2回

比較

MaxonAD-999

Analog Delay

MaxonAD-999Analog Delay

この 2 つのエフェクターは同じクラスの異なるインスタンス

動的型付けとは実行時の実際の値によって変数の型を決定する型システムの性質のこと

「 Maxon AD-999 のエフェクトをかけて」エフェクターボードに 2台ある場合、どちらのエフェクトをかければよいのか

ステッカー (変数名 ) をつけることでそれぞれのインスタンスを識別「 Route 66 のエフェクトをかけて」オペレータからの要件が的確に伝わる

Page 36: Python講座 第2回

変数名のルール• 同じ名前 ( ステッカー ) は使えない

• 一つのオブジェクト ( インスタンス ) に 2 つ以上の変数( ステッカー ) を付けることができる

・・・

Page 37: Python講座 第2回

§4.継承

BossOD-1

BossOD-2

BossOD-3

1977 1985 1997

Page 38: Python講座 第2回

比較– 設計書 ( クラス ) が違う– つまみ (変数 ) の数も違う – エフェクト (処理 ) の回路も違う この 3 つのエフェクターはそれぞれ別のオブジェクトところが、これらは本質的に同じクラス

継承とは指定されたあるクラスの属性とメソッドをすべて引き継いで新しいクラスを定義する機能

ユーザには、開発の経緯、クラス間の関係を明らかにすることができる。共通した変数、処理を記述する手間を削減BossOD-1

BossOD-3

BossOD-2

(OD-1 をもとに、 OD-2 が開発され、 OD-2 をもとに、 OD-3 が開発された )

Page 39: Python講座 第2回

多重継承 (Mixin)2 つの ( あるいは複数の )違うクラスを継承する機能

多重継承は、クラス間の関係が複雑になりやすいため、 Mixin という手法を用いて構成することを推奨します

BOSS ツインペダルシリーズBOSS DD シリーズ

BOSS DD-20

参考 URL - メメメモモ (Mixin について ) : http://memememomo.hatenablog.com/entry/20100516/1273961982

Page 40: Python講座 第2回

なぜオブジェクト指向なのか

Page 41: Python講座 第2回

負担を減らすポリモーフィズム、カプセル化

オブジェクトに「エフェクトをかけて」と命令すれば、それぞれが自身のエフェクトにあった処理をかけてくれる .

↓ユーザの負担は軽くなる

Page 42: Python講座 第2回

処理を複雑にさせない• メインの処理がそれぞれのデータに対して細かく指示

– 処理が複雑になる傾向• 複雑なプログラムはバグを生み出しやすい

– 修正、変更が難しくなる

• 変更に強い作りは後々の修正作業を楽にする

マルチエフェクターコンパクトエフェクター

Page 43: Python講座 第2回

オブジェクト指向のポイント§1. 凝縮度と結合度§2. 概念、仕様、実装§3. 継承はどこで使うべきか

Page 44: Python講座 第2回

§1. 凝縮度と結合度• 凝縮度 ・・・ オブジェクトやモジュールが、自身のすべき処理 (責任 ) にどれだけ集 中しているかという尺度• 結合度 ・・・ オブジェクトや、モジュール、関数同士の結びつきを表す尺度

オブジェクト指向では、凝縮度が高く、結合度の低いオブジェクトやモジュールを作成することが良いとされています

Page 45: Python講座 第2回

新しく発売されたディストーションエフェクター [XXX] は… .• チューナー機能付き• コーラス、フランジャー付き• 同時発売されたディストーションエフェクター [YYY] と合わせることで、理想の歪みを実現できます

悪い例チューナー機能はいらない( 責任がはっきりしない処理を含む

= 凝縮度 : 低 )

コーラス、フランジャー機能もいらない(自身が担うべきでない処理を含む

= 凝縮度 : 低 ) 最初から一台にして発売して( オブジェクト同士の結びつきが高い

= 結合度 : 高 )

Page 46: Python講座 第2回

良い例新しく発売されたディストーションエフェクター [XXX] は… .• ギターの音を歪ませます• つまみは Volume と Gain と Comp の 3 つです。• これ一台で理想の歪みを実現必要な機能 (責任 ) を持っている = 凝縮度 : 高処理はそれぞれ独立している = 結合度 : 低

シンプル イズ ベスト

Page 47: Python講座 第2回

§2. 概念、仕様、実装ソフトウェア開発の際の、 3 つの観点

1. 概念 (concept)

2. 仕様 (specification)

3. 実装 (implementation)

― 「私が何に対して責任があるのか」― 「私はどのように使用されるのか ? 」― 「私はどのようにして自身の責任を全うするのか」

コンセプトを考え↓インターフェースを考え↓ソースコードを書く

Page 48: Python講座 第2回

§3.継承はどこで使うべきか• 継承はオブジェクトを分類するための手段• 概念や仕様に基づき、同じ概念を持つクラスをまとめる• 「同じ変数やメソッドを持っている」という 実装寄りの継承は非推奨

BossOD-1

BossOD-3

BossOD-2

Page 49: Python講座 第2回

おわりに、OOP は現在のソフトウェア開発でも広く使われている考え方ですが、絶対的なものでもないですし、万能でもありません。要件によっては別の考え方が適している場合もあります。OOP を無理矢理適用することで、逆にシステムが複雑になることもあり得ます。たくさんある考え方の中のひとつとして、OOP のことも知っておくといいんじゃないかなーと思います。― かまずにまるのみ。 (http://tdak.hateblo.jp/) より

Page 50: Python講座 第2回

参考文献• 初めての Python– O’REILLY Japan, Mark Lutz 著 , 夏目 大訳 , 2009

• いちばんやさしいオブジェクト指向の本– 技術評論社 , 井上 樹著 , 2009

• かまずにまるのみ。 < プログラミング勉強中の人にオブジェクト指向とは何なのかを何となく伝えたい話 >– http://tdak.hateblo.jp/entry/20140406/1396773476

Page 51: Python講座 第2回

次回予告Python を用いたオブジェクト指向プログラミング