Slide 1

Slide 1 text

オブジェクト指向で なぜ作るのか 2020.11.17 @nikotama.rb 佐藤 匠

Slide 2

Slide 2 text

自己紹介 名前:佐藤 匠 今年の4月に楽天株式会社に入社 Docker, Kubernetes, Railsをメイ ンで扱っています 学生時代:流体工学、機械学習

Slide 3

Slide 3 text

参考文献 • オブジェクト指向でなぜ作るのか • https://books.rakuten.co.jp/rb/6998790/

Slide 4

Slide 4 text

アジェンダ • オブジェクト指向が登場する以前のプログラミング言語 • オブジェクト指向の誕生 • クラス • 継承 • ポリモーフィズム • オブジェクト指向とメモリ

Slide 5

Slide 5 text

アジェンダ • オブジェクト指向が登場する以前のプログラミング言語 • オブジェクト指向の誕生 • クラス • 継承 • ポリモーフィズム • オブジェクト指向とメモリ

Slide 6

Slide 6 text

プログラミングの進化の過程 機械語を人間が理解 しやすい記号で記述 例 MOV AC, X MOV DX, Y ADD AX, DX MOV Z, AX より人間に親しみや すい形式で記述 COBOL,FORTRAN 例 Z=X+Y GOTO文を廃止 基本三構造を導入 ALGOL,Pascal. C言語 • 順次実行 • 条件分岐 • 繰り返し処理 いかに人間がわかりやすい形式でコードを記述するか 可読性を重視 コンピュータが使用 する機械語を2進数 /16進数で記述 例:16進数表記 A10010 8B160210 01D0 A10410 機械語 1940年代 アセンブリ言語 1940年代 高級言語 1950年代前半 構造化言語 1950年代後半

Slide 7

Slide 7 text

関数と値の受け渡し 関数A 高級言語以前 関数B グローバル変数 コール 値の設定参照 関数A コール 構造化言語 • ローカル変数や引数はない • グローバル変数を使用して関数間の情報共有 • グローバル変数を変更する場合、影響範囲の 特定が大変 • ローカル変数、引数の受け渡しによって 関数間の情報を共有 • 関数間の独立性が向上 • コードの再利用性が向上 ローカル変数 関数B ローカル変数 引数 値渡し ・・・ ・・・ 値渡し

Slide 8

Slide 8 text

解決できたこと、できなかったこと • 解決できたこと • 基本三構造(順次実行、if文、for/wile文) による可読性の向上 • 関数の独立性を高めることでコードの再利用性が向上 • 残った課題 • グローバル変数問題 • 関数間の値の受け渡しにはグローバル変数を使用する必要がある。 • コードの再利用が貧弱 • 関数によって再利用はできるものの、増大するアプリケーションからすると微々 たるものであった。。。 オブジェクト指向によって問題解決!

Slide 9

Slide 9 text

アジェンダ • オブジェクト指向が登場する以前のプログラミング言語 • オブジェクト指向の誕生 • クラス • 継承 • ポリモーフィズム • オブジェクト指向とメモリ

Slide 10

Slide 10 text

オブジェクト指向の三要素 クラス 継承 ポリモー フィズム

Slide 11

Slide 11 text

クラス 異なるクラス間で同じメソッド名を付けるこ とができる 変数やメソッドの公開範囲を指定することで影響 範囲を限定 インスタンスを複数作成

Slide 12

Slide 12 text

継承 クラスの共通部分をスーパークラスにまとめて、その 定義を継承することで、定義の重複を避ける仕組み Character name attack() Slime Dragon Hero

Slide 13

Slide 13 text

ポリモーフィズム クラス名に関係なく、同じ形式でメソッドを実行 する仕組み Character name attack() Slime Dragon

Slide 14

Slide 14 text

オブジェクト指向まとめ オブジェクト指向以前 関数間の値の受け渡しにグローバル変数 を使用 クラスによって、変数の公開範囲を 限定できるようになった 関数の再利用するのみ • 継承によってメソッドや変数の再 利用性が向上 • ポリモーフィズム によって、関数 だけではできなかった、呼び出し ロジックの共通化が可能に オブジェクト指向

Slide 15

Slide 15 text

アジェンダ • オブジェクト指向が登場する以前のプログラミング言語 • オブジェクト指向の誕生 • クラス • 継承 • ポリモーフィズム • オブジェクト指向とメモリ

Slide 16

Slide 16 text

メモリ領域のおさらい テキスト領域: 機械語に翻訳されたプログラムが格納 静的領域: グローバル変数、コード情報が格納される ヒープ領域: プログラムの実行時に動的に確保されるメモリ領域 スタック領域: スレッドの制御を行うためのメモリ領域。スレッドに一つず つ割り当てられる スタック 領域 スタック 領域 静的領域 ヒープ領域 テキスト領域 メモリ領域

Slide 17

Slide 17 text

メモリの使い方:クラスとインスタンス • クラスの情報が静的領域にロード • インスタンスを作成すると、ヒープ 領域にインスタンスのメモリを確保 • インスタンスと静的領域にあるクラ ス情報との対応付けが行われる。 • インスタンスを格納する変数にはイ ンスタンスのポインタが格納される 静的領域 メモリ領域 Slimeクラスの情報 attackメソッド escapeメソッド ヒープ領域 Slime_a インスタンス @name=スライムA Slime_b インスタンス @name=スライムB

Slide 18

Slide 18 text

メモリの使い方:ポリモーフィズムの実現 • 最も典型的な方法はメソッドテーブル(仮想関数テーブル)による実装 (C++,C#,java) • メソッドテーブルにはメソッドのポインタが格納されている。 • メソッドテーブルを使用することで、任意のメソッドにアクセスするこ とができるため、継承元のメソッドにもアクセスすることができる。 静的領域 メモリ領域 Slimeクラス (Characterクラスを継承) escape コード メソッド テーブル Characterクラス escape メソッド テーブル attack attack attack コード

Slide 19

Slide 19 text

継承のメモリ • スーパークラスから継承したメ ソッドはメソッドテーブルに格 納し、サブクラスのメモリ領域 には展開されない • スーパークラスから継承された インスタンス変数は各インスタ ンスにコピーされる 静的領域 メモリ領域 Slimeクラス (Characterクラスを継承) escape コード ヒープ領域 Slime_a インスタンス @name=スライムA Slime_b インスタンス @name=スライムB メソッド テーブル Characterクラス escape メソッド テーブル attack attack attack コード

Slide 20

Slide 20 text

ガベージコレクション • ヒープ領域の空きメモリが少なくなるとガベージコレクション 処理を起動 • 静的領域とスタック領域はアプリケーションの処理で必要な情 報なので、静的領域とスタックメモリから参照されていないイ ンスタンスがガベージコレクタの対象になる。 静的領域 メモリ領域 ヒープ領域 A C B スタック 領域 スタック 領域 D F E H G

Slide 21

Slide 21 text

まとめ • 保守性を向上させるための概念としてオブジェクト指向が誕生 した。 • 変数のスコープ制御 • コードの再利用性の向上 • オブジェクト指向の三要素であるクラス、継承、ポリモーフィ ズムを紹介 • メモリレベルでオブジェクト指向の三要素がどのように実現さ れているか紹介