Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

8c250b149ef5d379d07e47386e010ca6?s=47 TakumiSato0613
November 17, 2020
44

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

nokotama.rb発表資料

8c250b149ef5d379d07e47386e010ca6?s=128

TakumiSato0613

November 17, 2020
Tweet

Transcript

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

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

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

  4. アジェンダ • オブジェクト指向が登場する以前のプログラミング言語 • オブジェクト指向の誕生 • クラス • 継承 •

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

    ポリモーフィズム • オブジェクト指向とメモリ
  6. プログラミングの進化の過程 機械語を人間が理解 しやすい記号で記述 例 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年代後半
  7. 関数と値の受け渡し 関数A 高級言語以前 関数B グローバル変数 コール 値の設定参照 関数A コール 構造化言語

    • ローカル変数や引数はない • グローバル変数を使用して関数間の情報共有 • グローバル変数を変更する場合、影響範囲の 特定が大変 • ローカル変数、引数の受け渡しによって 関数間の情報を共有 • 関数間の独立性が向上 • コードの再利用性が向上 ローカル変数 関数B ローカル変数 引数 値渡し ・・・ ・・・ 値渡し
  8. 解決できたこと、できなかったこと • 解決できたこと • 基本三構造(順次実行、if文、for/wile文) による可読性の向上 • 関数の独立性を高めることでコードの再利用性が向上 • 残った課題

    • グローバル変数問題 • 関数間の値の受け渡しにはグローバル変数を使用する必要がある。 • コードの再利用が貧弱 • 関数によって再利用はできるものの、増大するアプリケーションからすると微々 たるものであった。。。 オブジェクト指向によって問題解決!
  9. アジェンダ • オブジェクト指向が登場する以前のプログラミング言語 • オブジェクト指向の誕生 • クラス • 継承 •

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

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

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

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

  14. オブジェクト指向まとめ オブジェクト指向以前 関数間の値の受け渡しにグローバル変数 を使用 クラスによって、変数の公開範囲を 限定できるようになった 関数の再利用するのみ • 継承によってメソッドや変数の再 利用性が向上

    • ポリモーフィズム によって、関数 だけではできなかった、呼び出し ロジックの共通化が可能に オブジェクト指向
  15. アジェンダ • オブジェクト指向が登場する以前のプログラミング言語 • オブジェクト指向の誕生 • クラス • 継承 •

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

    スタック 領域 スタック 領域 静的領域 ヒープ領域 テキスト領域 メモリ領域
  17. メモリの使い方:クラスとインスタンス • クラスの情報が静的領域にロード • インスタンスを作成すると、ヒープ 領域にインスタンスのメモリを確保 • インスタンスと静的領域にあるクラ ス情報との対応付けが行われる。 •

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

    メモリ領域 Slimeクラス (Characterクラスを継承) escape コード メソッド テーブル Characterクラス escape メソッド テーブル attack attack attack コード
  19. 継承のメモリ • スーパークラスから継承したメ ソッドはメソッドテーブルに格 納し、サブクラスのメモリ領域 には展開されない • スーパークラスから継承された インスタンス変数は各インスタ ンスにコピーされる

    静的領域 メモリ領域 Slimeクラス (Characterクラスを継承) escape コード ヒープ領域 Slime_a インスタンス @name=スライムA Slime_b インスタンス @name=スライムB メソッド テーブル Characterクラス escape メソッド テーブル attack attack attack コード
  20. ガベージコレクション • ヒープ領域の空きメモリが少なくなるとガベージコレクション 処理を起動 • 静的領域とスタック領域はアプリケーションの処理で必要な情 報なので、静的領域とスタックメモリから参照されていないイ ンスタンスがガベージコレクタの対象になる。 静的領域 メモリ領域

    ヒープ領域 A C B スタック 領域 スタック 領域 D F E H G
  21. まとめ • 保守性を向上させるための概念としてオブジェクト指向が誕生 した。 • 変数のスコープ制御 • コードの再利用性の向上 • オブジェクト指向の三要素であるクラス、継承、ポリモーフィ

    ズムを紹介 • メモリレベルでオブジェクト指向の三要素がどのように実現さ れているか紹介