Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

オブジェクト指向入門1

352 Aufrufe

Veröffentlicht am

ソフトウェア基礎講座資料

Veröffentlicht in: Bildung
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

オブジェクト指向入門1

  1. 1. オブジェクト指向 プログラミング入門 ソフトウェア基礎講座 第 1 回 2011年2月9日 服部健太
  2. 2. オブジェクト指向とは  “Object” は最も汎用的な英単語  認識できるすべてのものはオブジェクトである  要するにほとんど何の意味もない  オブジェクト指向の決定的な定義はない  いろいろな人がいろいろなことを言ってる 2011/2/9 オブジェクト指向プログラミング入門 1 2
  3. 3. 2011/2/9 オブジェクト指向プログラミング入門 1 3 オブジェクト指向の重要な特徴  カプセル化( Encapsulation )  情報 / 実装の隠蔽( Information/implementation hiding )  状態保持( State retention )  オブジェクトの固有性( Object identity )  メッセージ( Messages )  クラス( Classes )  継承( Inheritance )  多態性( Polymorphism )  総称性( Genericity )
  4. 4. 2011/2/9 オブジェクト指向プログラミング入門 1 4 カプセル化( Encapsulation )  カプセル化の概念はソフトウェアと同じくらい古い  1940 年くらいには,プログラマ達は同じような命 令のパターンが同じプログラムに何度も現れること に気づいた  人々は,そのような繰返しパターンはプログラムの 隅っこの箱の中に閉じ込めておき,メインプログラ ムの異なる場所から単一の名前単一の名前で呼び出し得ること を理解した ⇒  こうしてサブルーチン( subroutine )が発明されたカプセル化とは,関連する概念を一つのユ ニットにグループ化し,それ以後,単一の名 前で参照できるようにすることである
  5. 5. 2011/2/9 オブジェクト指向プログラミング入門 1 5 サブルーチン( Subroutine )  サブルーチンは当時の貴重なメモリを節約する良い 手段だった  後に人々は,人間の記憶も節約できることに気づい た  人が単一の観念として捉え,操作できる概念の塊として表 される 月々のローン 返済額の計算 元金 ローン期間 利率 返済額 ローンの許可 入力変数 出力変数サブルーチン コードはサブルーチン の中にカプセル化され る
  6. 6. 2011/2/9 オブジェクト指向プログラミング入門 1 6 オブジェクト指向におけるカプセル 化  オブジェクト指向におけるカプセル化の目的もサブ ルーチンのそれと同じ  ただし,構造的にはより洗練されている オブジェクト指向におけるカプセル化とは, データを取り巻く手続きをグループ化したも のである direction location set-in-grid turn-left turn-right advance location facing-wall display メソッ ド 変数
  7. 7. 2011/2/9 オブジェクト指向プログラミング入門 1 7 オブジェクト指向におけるオブジェ クト  複数のメソッドと複数の変数から構成される  変数はオブジェクトのメソッドからアクセス され更新される  それぞれの変数は非公開であり,他のオブ ジェクトは変数に直接アクセスすることはで きない  他のオブジェクトがそのオブジェクトの変数の情 報が必要なら,そのオブジェクトのメソッドにお 願いしてアクセスする
  8. 8. 2011/2/9 オブジェクト指向プログラミング入門 1 8 情報 / 実装の隠蔽 ( Information/Implementation Hiding ) カプセル化されたユニットは外( public view )と 内( private view )から眺めることができる  良いカプセル化に対する報酬はプライベートビュー に見られる無数のこまごまとしたことを,パブリッ クビューでは伏せておけることである  情報の隠蔽と実装の隠蔽 情報 / 実装の隠蔽とは,カプセル化された構 造の内側にある特定の情報や実装上の決定に ついて,外部への見せ方を制限することであ る
  9. 9. 2011/2/9 オブジェクト指向プログラミング入門 1 9 情報 / 実装隠蔽によるオブジェクト のブラックボックス化  外部の観察者は,オブジェクトが何( what )がで きるかについては知っている  オブジェクトがどのように( how )するのか,中 がどうなってるのか,についてはまったく知らない  情報 / 実装隠蔽の2つの利点  設計上の決定を局所化する  情報の内容を表現の形式と分離する set-in-grid turn-left turn-right advance location facing-wall display
  10. 10. 2011/2/9 オブジェクト指向プログラミング入門 1 10 状態の保持( State Retention )  オブジェクトは状態を保つことができる  伝統的な手続きモジュール(関数,副プログラム ,手続き,など)では,呼び出し元に戻ってその モジュールが終了すると,結果だけが残る  同じモジュールが再び呼ばれても,あたかも最初 に呼び出されたかのように生み出される  オブジェクトは情報をそれ自身の中に無期限 に保持する
  11. 11. 2011/2/9 オブジェクト指向プログラミング入門 1 11 抽象データ型( ADT )  カプセル化,情報 / 実装隠蔽,状態の保持は ,オブジェクト指向の核ではあるが,新しい アイディアではない  計算機科学者たちは,それらを抽象データ型の分 野として何年もの間,研究してきた  オブジェクト指向は ADT よりさらに進んで ,以降に示すような特徴を持つ
  12. 12. 2011/2/9 オブジェクト指向プログラミング入門 1 12 オブジェクトの固有性( Object Identity )  オブジェクト指向の決定的な特徴は,それぞれのオ ブジェクトが固有のアイデンティティを持つことに ある  仲間のオブジェクトと区別するための何かユニーク なものがある  オブジェクトハンドル機構によって提供される オブジェクトの固有性とは,各オブジェクト が異なるソフトウェア実体として識別され, 扱われるという特性である
  13. 13. 2011/2/9 オブジェクト指向プログラミング入門 1 13 142857 102237 オブジェクトハンドル  そのオブジェクトに何が起ころうとも,オブジェクトが生きて いる限りハンドルは同じものであり続ける  2つのオブジェクトが同じハンドルを持つことはない  システムがオブジェクトを生成するときは常にそれぞれ異なる (過去,現在,未来を通じて)ようなハンドルを割当てる  2つのオブジェクトが,たとえ同じ構造と情報を持っていたと しても,それらは区別される direction location set-in-grid turn-left turn-right advance location facing-wall display direction location set-in-grid turn-left turn-right advance location facing-wall display
  14. 14. 2011/2/9 オブジェクト指向プログラミング入門 1 14 オブジェクトハンドル(2)  プログラマやユーザが実際に新しいオブジェクトのハンドル ( 102237 )をみることは出来ない  代わりに変数 hom1 を通じてオブジェクトにアクセスする  オブジェクトのメモリ番地をハンドルとして使用するオブジェ クト指向環境もある  シンプルではあるがオブジェクトがメモリ中を移動したらいや な感じになる 102237 direction location set-in-grid turn-left turn-right advance location facing-wall display 142857 direction location set-in-grid turn-left turn-right advance location facing-wall display 102237 142857 hom1 hom2 var hom1 := HOMINOID.new; var hom2 := HOMINOID.new;
  15. 15. 2011/2/9 オブジェクト指向プログラミング入門 1 15 オブジェクトハンドル(3)  hom2 := hom1  したら...  オブジェクト 142857 にはもはやアクセス不可能となる  多くのオブジェクト指向環境ではガーベッジコレクタによって メモリから回収される 102237 direction location set-in-grid turn-left turn-right advance location facing-wall display 142857 direction location set-in-grid turn-left turn-right advance location facing-wall display 102237 102237 hom1 hom2
  16. 16. 2011/2/9 オブジェクト指向プログラミング入門 1 16 メッセージ( Messages )  オブジェクトは別のオブジェクトに対して, メッセージによってアクティビティを遂行す る  典型的なメッセージでは,一つのオブジェク トから別のオブジェクトに対して何らかの情 報を運ぶメッセージは送信者オブジェクト ob1 があて 先オブジェクト ob2 に対して, ob2 がそのメ ソッドの一つに適用するための要求物を運ぶ 手段である
  17. 17. 2011/2/9 オブジェクト指向プログラミング入門 1 17 メッセージの構造  Ob1 が ob2 にメッセージを送るには, ob1 は以下の3つを知っ てる必要がある  Ob2 のハンドル  Ob2 のメソッド名  Ob2 がメソッド実行に必要とする追加的な情報(引数)  メッセージ送信の例: hom1.turn-left;  オブジェクトにお願いする  伝統的な手続き(関数)呼び出しと逆になってる call turn-left(hom1);  手続きユニットにお願いする  多態,オーバロード,動的束縛を議論するとき,この逆転は実 際上重要な違いをもたらす
  18. 18. 2011/2/9 オブジェクト指向プログラミング入門 1 18 メッセージ引数 hom1.advance(no-of-squares; advance-ok)  純粋なオブジェクト指向環境では,メッセージの引 数はオブジェクトのハンドルである あて先オブジェクト メソッド名 入力引数 出力引数 シグネチャ メッセージ
  19. 19. 2011/2/9 オブジェクト指向プログラミング入門 1 19 メッセージにおけるオブジェクトの 役割  メッセージの送信者  メッセージのあて先  別のオブジェクトの中の変数から指されるも の  メッセージの引数から指されるもの method
  20. 20. 2011/2/9 オブジェクト指向プログラミング入門 1 20 メッセージの種類  情報メッセージ(過去指向)  オブジェクトに情報を提供し,更新させる  例: hom1.set-in-grid  質問メッセージ(現在指向)  オブジェクトの情報を明かすように要求する  例: hom1.location  命令メッセージ(未来指向)  オブジェクトにあるアクションをするように要求 する  例: hom1.advance
  21. 21. 2011/2/9 オブジェクト指向プログラミング入門 1 21 クラス( Classes )  クラスとオブジェクトの違い  クラスはあなたが設計しプログラムするもの  オブジェクトとはあなたが実行時に(クラスか ら)生成しようとするもの クラスとは,そこからオブジェクトが生成 (具体化)される雛形である.各オブジェク トはそれの生成元であるクラスと同じ構造と 振る舞いを持つ オブジェクト ob がクラス C に属するとき, 「 ob は C のインスタンスである」と言う
  22. 22. 2011/2/9 オブジェクト指向プログラミング入門 1 22 オブジェクトに必要なメモリ  概念図  実際の実装 object1 method-a method-b var-v handle method-c method-d var-w var-x var-y var-z 400 bytes 10 bytes 6 bytes object2 method-a method-b var-v handle method-c method-d var-w var-x var-y var-z 400 bytes 10 bytes 6 bytes object3 method-a method-b var-v handle method-c method-d var-w var-x var-y var-z 400 bytes 10 bytes 6 bytes object 1 method-a method-b var-v handle method-c method-d var-w var-x var-y var-z 400 bytes 16 bytes object 2 var-v handle var-w var-x var-y var-z 16 bytes object 3 var-v handle var-w var-x var-y var-z 16 bytes object 4 var-v handle var-w var-x var-y var-z 16 bytes object 5 var-v handle var-w var-x var-y var-z 16 bytes object 6 var-v handle var-w var-x var-y var-z 16 bytes ・・・
  23. 23. 2011/2/9 オブジェクト指向プログラミング入門 1 23 クラスメソッド,クラス変数  どれだけ多くオブジェクトがインスタンス化されよ うとも,ちょうど一セットだけのクラスメソッドと クラス変数がある  クラスメソッドとクラス変数は個々のオブジェクト の責務でまかないきれない状況を扱うのに必要  例: new メソッド, no-of-hominoids-created 変数 , etc.object 1 method-a method-b var-v handle method-c method-d var-w var-x var-y var-z 400 bytes 16 bytes object 2 var-v handle var-w var-x var-y var-z 16 bytes object 3 var-v handle var-w var-x var-y var-z 16 bytes object 4 var-v handle var-w var-x var-y var-z 16 bytes object 5 var-v handle var-w var-x var-y var-z 16 bytes object 6 var-v handle var-w var-x var-y var-z 16 bytes ・・・ method-c method-f var-p var-q var-r クラス変 数 クラス メソッ ド インスタン ス メソッド インス タンス 変数
  24. 24. 2011/2/9 オブジェクト指向プログラミング入門 1 24 継承( Inheritance )  クラス C を書いた後で,いくつかのメソッドを除い てほとんど同じようなクラス D が必要だとわかった らどうする?  コピペコードはメンテナンス上よろしくない ( D による C からの)継承とは,クラス D のオブジェクトがクラス C のオブジェクトに 利用可能なメソッドと変数を,あたかも D で 定義されたメソッドや変数のように使えるよ うにする機能のことである. C は D のスーパークラスと呼ばれる. D は C のサブクラスである.
  25. 25. 2011/2/9 オブジェクト指向プログラミング入門 1 25 継承の例 var ac := AIRCRAFT.new; var gl := GLIDER.new; … ac.turn(new-course;turn-ok); // OK gl.release-towline; // OK gl.turn(new-course;turn-ok); // OK ac.release-towline; // NG … AIRCRAFT course turn() GLIDER whether-attached release-towline()
  26. 26. 2011/2/9 オブジェクト指向プログラミング入門 1 26 is-a 関係  継承関係が適切かチェックする  「 D は C である」と言えるなら, D はほぼ 確実に C のサブクラスである  グライダーは航空機である (A glider is an aircraft)
  27. 27. 2011/2/9 オブジェクト指向プログラミング入門 1 27 単一継承と多重継承  多重継承では,単一継承における継承木が継 承格子( lattice )となる  多重継承は設計上の困難な問題をもたらす AIRCRAFT PASSENGER -VEHICLE PASSENGER -AIRCRAFT
  28. 28. 2011/2/9 オブジェクト指向プログラミング入門 1 28 多態性( Polymorphism )  ありがちな例 (a) 多態性とは,単一のメソッド名が複数の クラス上で定義され,それらのクラスにおい て異なる実装を取りうる機能である (b) 多態性とは,一つの変数が異なる時点の 異なるクラスを指すことによる特徴である. POLYGON area() TRIANGLE area() RECTANGLE area() HEXAGON
  29. 29. 2011/2/9 オブジェクト指向プログラミング入門 1 29 動的束縛( dynamic binding ) var p : POLYGON; var t := TRIANGLE.new; var h := HEXAGON.new; … If user says OK then p:= t; else p:=   h; … p.area(); // p は TRAIANGLE か HEXAGON のどちらか 動的束縛(実行時束縛や遅延束縛ともいう) とは,実際に実行されるべきコードを(コン パイル時ではなく)実行時に決める技術であ る
  30. 30. オーバーライドとオーバーロード  オーバーライド( overriding )  クラス C で定義されたメソッドを C のサブクラスの 中で再定義すること  オーバーロード( overloading )  同一のクラス上に定義されたいくつかのメソッド(や 演算子)が同じ名前やシンボルを持つとき,名前やシ ンボルがオーバーロードされたという  多態性と関連した概念だが,オーバーライドとごっ ちゃにしないこと  メソッドのどのコードが実行されるかはシグネチャに よって決まる product1.mark-down() product1.mark-down(huge-percentage) 2011/2/9 オブジェクト指向プログラミング入門 1 30
  31. 31. 総称性( Genericity )  コードをコピペしなくても済む技術 2011/2/9 オブジェクト指向プログラミング入門 1 31 総称性とは,あるクラス C を,1つかそれ以 上のクラスとして実行時(クラス C のオブ ジェクトがインスタンス化されたとき)に供 給されるように構築することである.
  32. 32. 総称的な TREE クラスの例 class TREE [NODE-ITEM]; … var current-node := NODE-ITEM.new; … current-node.print(); 2011/2/9 オブジェクト指向プログラミング入門 1 32 26 17 42 14 22 44 10 15 29 34 31 Mike Dave Ted Bob Fred Zack Alice Carol Norb Rud Pat var prod-tree := TREE.new[PRODID]; var cust-tree := TREE.new[CUSTOMER];
  33. 33. 次回予定  日時:2011年2月16日(水)  場所: LB2  2 F / A 会議室  内容:モジュール 2011/2/9 オブジェクト指向プログラミング入門 1 33

×