Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

オブジェクト指向入門6

70 vues

Publié le

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

Publié dans : Formation
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

オブジェクト指向入門6

  1. 1. オブジェクト指向 プログラミング入門 ソフトウェア基礎講座 第6回 2011年3月17日 服部健太
  2. 2. 2011/3/17 オブジェクト指向プログラミング入門 6 2 オブジェクトとは何か?  上の定義以外の見方  外界のシステムに見られる「オブジェクト」  例:グラフィックスシステム  点,線,面,立体, etc  例:給与計算システム  従業員,給与小切手,給与体系  オブジェクト指向によって,外界のシステムを自然にモデル化 できる  あるクラスは問題領域における外界のオブジェクトの型のモデルを 意味する.  ただし,すべてのクラスが問題領域のオブジェクト型に対応すると は限らない. オブジェクトは何らかのクラスの実行時のインスタンスである. 定義:オブジェクト
  3. 3. 2011/3/17 オブジェクト指向プログラミング入門 6 3 基本形式  O をオブジェクトとする.オブジェクトは何らかのクラス C の 直接インスタンスである.  C は O の生成クラス,あるいは,単にジェネレータと呼ばれる .  C はソフトウェアテキスト, O は実行時のデータ構造である.  オブジェクトの形式はクラスが持つ属性によって決まる.  オブジェクトはフィールドフィールド(個々の属性について1つずつ用意 されている要素)の集合に過ぎない.  例:クラス POINT class POINT feature x, y: REAL … …ルーチンの宣言 end 3.4 -8.09 x y P_OBJ (POINT)
  4. 4. 2011/3/17 オブジェクト指向プログラミング入門 6 4 単純なフィールド  基本型  BOOLEAN  それぞれの論理値の真と偽を表すインスタンスを2つだけ持つ  True および False  CHARACTER  インスタンスは文字を表す  ‘A’ のように一重引用符でその文字を囲む  STRING (実は参照型)  インスタンスは有限の長さの文字列を表す  “A STRING” のように文字の並びを二重引用符で囲む  INTEGER  インスタンスは整数を表す  34, -675, +4 など  REAL および DOUBLE  インスタンスは単精度および倍精度の浮動小数を表す  3.5, -0.05 など. DOUBLE の場合は, -5.e-2 のような表記も可能  基本型のインスタンスはコンピュータ上で効率的に実装される定義済 み集合から値を取り出す
  5. 5. 2011/3/17 オブジェクト指向プログラミング入門 6 5 本の単純な概念  例:クラス BOOK1 class BOOK1 feature title: STRING date, page_count: INTEGER end  典型的なインスタンスの例:  レコードや構造型と違い,以下のようにフィールドに値を割当 てることはできない b1: BOOK1 … b1.page_count := 355 “The Red and the Black” 1830 title date (BOOK1) 341page_count
  6. 6. 2011/3/17 オブジェクト指向プログラミング入門 6 6 著者  例:クラス WRITER class WRITER feature name, real_name: STRING birth_year, death_year: INTEGER end  インスタンスの例: “Stendhal” “Henri Beyle” name real_name (WRITER) 1842 birth_year death_year 1783
  7. 7. 2011/3/17 オブジェクト指向プログラミング入門 6 7 サブオブジェクト  本には著者があるという特徴を表現したい  本のクラス BOOK2 の中にそれ自体がオブジェクトである フィールド author を設ける  例:サブオブジェクト「著者」を持つ 2 つの「本」オブジェク ト “The Red and the Black” 1830 title date 341page_count “Life of Rossini” 1830 title date 341page_count (BOOK2) (BOOK3) “Stendhal” “Henri Beyle” name real_name (WRITER) 1842 birth_year death_year 1783 “Stendhal” “Henri Beyle” name real_name (WRITER) 1842 birth_year death_year 1783 author author
  8. 8. 2011/3/17 オブジェクト指向プログラミング入門 6 8 サブオブジェクトの問題点  メモリ領域の無駄  例えば,人を表すオブジェクトを考えたとき,そ れぞれは市民権を持っている国を表すサブオブ ジェクトを持っているとする.表現される人の数 は多いが国の数は少ない  共有共有( sharing )を表現できない  2つのオブジェクトの author フィールドは WRITER の同じインスタンスを参照す る. WRITER オブジェクトが更新されたら,そ の変更がその著者の関係するすべての本に反映さ れるようにしたい
  9. 9. 2011/3/17 オブジェクト指向プログラミング入門 6 9 参照(1)  例:同じ「著者」オブジェクトへの参照を含む 2 つ の「本」オブジェクト “The Red and the Black” 1830 title date (BOOK3) 341page_count “The Red and the Black” 1830 title date (BOOK3) 341page_count “Stendhal” “Henri Beyle” name real_name (WRITER) 1842 birth_year death_year 1783 author author
  10. 10. 2011/3/17 オブジェクト指向プログラミング入門 6 10 参照(2)  void の参照フィールドがあるオブジェクト 参照とは実行時に void (無効)かアタッチ状態( attached )かのいずれか の値をとる. アタッチ状態の場合,参照は1つのオブジェクトを示す(その場合,その参 照はその特定のオブジェクトにアタッチされているという). 定義:参照 “Candide, or Optimism” 1759 title date (BOOK3) 120 author page_count
  11. 11. 2011/3/17 オブジェクト指向プログラミング入門 6 11 オブジェクトのアイデンティティ  オブジェクト指向システムの実行中に作成さ れるオブジェクトには,そのフィールドに よって定義されるオブジェクトの値とは無関 係の,唯一のアイデンティティがある.  アイデンティティの異なる2つのオブジェクトに 同一のフィールドが含まれている場合がある  反対に,特定のオブジェクトのフィールドがシス テムの実行中に変わる可能性がある.だからと いって,そのオブジェクトのアイデンティティは 変わらない.
  12. 12. 2011/3/17 オブジェクト指向プログラミング入門 6 12 参照の宣言  クラス BOOK3 の定義 class BOOK3 feature title: STRING date, page_count: INTEGER author: WRITE -- これが新しい属性 end  クラスが次のような標準的な形式で宣言されているときには必 ず, class C feature … end 次の形式の宣言によって C 型と宣言されたすべてのエンティ ティは x: C C 型のオブジェクトへの参照である値を表す
  13. 13. 2011/3/17 オブジェクト指向プログラミング入門 6 13 自己参照  対応するクラス間の顧客関係にも循環がある class PERSON1 feature name: STRING loved_one, landlord: PERSON1 end “Almaviva”name landlord (PERSON1) loved_one “Figaro”name landlord (PERSON1) loved_one “Susanna” name landlord (PERSON1) loved_one
  14. 14. 2011/3/17 オブジェクト指向プログラミング入門 6 14 実行時のオブジェクト構造  実行時のオブジェクト構造が複雑だからといって,必ずしも, ソフトウェアそのもの,すなわち,クラス間の関係が複雑とは 限らない.  クラス間の関係はむしろできる限り単純にするように心がける べき 27 “Raphael” True 897 3.5 “Sarah” -62 “Caroline” ‘Z’ (TYPE1) (TYPE1) (TYPE4) (TYPE3) (TYPE5) (TYPE2) ルート
  15. 15. 2011/3/17 オブジェクト指向プログラミング入門 6 15 モデリングツールとしてのオブジェ クト  ソフトウェア開発における4つの世界  モデル化される側のシステム  オブジェクトの型とその抽象的な関係によって記述され る  外界システムの特定の具体例  関係する可能性のあるオブジェクト(もの)から構成さ れる  ソフトウェアシステム  オブジェクト指向の関係(顧客と継承)によって結び付 けられたクラスから構成される  オブジェクト構造  参照によって結び付けられたソフトウェアオブジェクト から構成される
  16. 16. 2011/3/17 オブジェクト指向プログラミング入門 6 16 4つの世界の対応 抽象データ型 クラス モデル オブジェクト (ソフトウェア) オブジェクト 鋳型 実体(インスタンス) 抽象 具象 実装する インスタンス である
  17. 17. 2011/3/17 オブジェクト指向プログラミング入門 6 17 オブジェクトと参照を操作する  柔軟なデータ構造を作成し,利用できるようにする ために,オブジェクト指向によるソフトウェアシス テムがオブジェクトをどのように扱うのか  動的な作成と再アタッチメント  実行時に必要に応じてオブジェクトをシステムに作らせる  最初の状態はオブジェクトが 1 つだけ(ルートオブジェク ト)作られる  新しいオブジェクトを作成する  void だった参照をオブジェクトにアタッチする  参照を void にする  すでにアタッチされていた参照を他のオブジェクトにア タッチする
  18. 18. 2011/3/17 オブジェクト指向プログラミング入門 6 18 生成命令  単純な形式の生成命令: create x  x は生成命令のターゲットと呼ばれる  BOOK3 クラスの顧客クラス QUOTATION の例: class QUOTATION feature source: BOOK3 page: INTEGER make_book is do create source end end  すべてのフィールドはデフォルトで初期化される
  19. 19. 2011/3/17 オブジェクト指向プログラミング入門 6 19 生成命令(2) ターゲット x の型がクラス C に基づいた参照型であるとき, create x とい う形式の生成命令の効果は次の3つのステップを実行することである. C1 ● C の新しいインスタンス( C の個々の属性に対して1つずつ作られる フィールドの集合から構成される)を作成する. OC を新しいインスタンス とする C2 ● 標準のデフォルト値に従って OC の個々のフィールドを初期化する C3 ● x の参照値を OC にする.すなわち x に OC をアタッチする 基本生成命令の効果 参照値のデフォルト値は void である BOOLEAN 値のデフォルト値は False である CHARACTER 値のデフォルト値はヌルキャラクタである 数値( INTEGER 型, REAL 型, DOUBLE 型)のデフォルト値はゼロ(す なわち,適切な型の値ゼロ)である デフォルトの初期値
  20. 20. 2011/3/17 オブジェクト指向プログラミング入門 6 20 なぜ明示的な生成が必要なのか?  生成と宣言は区別される b: BOOK3 -- 宣言(オブジェクトは作られない) create b -- 生成(オブジェクトが生成される)  宣言時にオブジェクトが生成されたとしたら...  オブジェクトを 1 つ生成するためにたくさんのオブジェク トが生成されてしまう  特に自己参照クラスの場合,無限ループに陥る  void 参照や1つのオブジェクトに複数の参照をアタッチす る余地がなくなってしまう  フィールドが作られるたびにオブジェクトを作成するのは意 味がない
  21. 21. 2011/3/17 オブジェクト指向プログラミング入門 6 21 生成プロシージャ  デフォルトの初期化以外の初期化をするためには,そのクラス に1つ以上の生成プロシージャを記述する  生成プロシージャとは, feature 句の前のキーワード creation で 始まる句に列挙するプロシージャ indexing … class C creation p1, p2, … feature … プロシージャ p1, p2 …の宣言を含む特性宣言 end  生成命令は以下のようになる create x.p(…)
  22. 22. 2011/3/17 オブジェクト指向プログラミング入門 6 22 クラス POINT の例 class POINT1 creation make_cartesian, make_polar feature … 前のバージョンに記述されている特性 : x, y, ro, theta, translate, scale, … feature {NONE} make_cartesian(a,b: REAL) is do x := a; y := b end make_polar(r,t: REAL) is do x := r*cos(t); y := r*sin(t) end end -- クラス POINT1  顧客は次のような命令で点を生成する create my_point.make_cartesian(0, 1) create my_point.make_polar(1, Pi/2)
  23. 23. 2011/3/17 オブジェクト指向プログラミング入門 6 23 生成呼び出しの効果  最初の3つのステップは,基本生成命令と同 じ create x.p(…) という形式の生成呼び出しを実行すると,次の4つのステッ プが実行される.ただし,ターゲット x の型はクラス C に基づいた参照型で あり, p はクラス C の生成プロシージャであり, (…) は必要ならば指定す べき,このプロシージャの実引数の有効な並びを表す. C1 ● C の新しいインスタンス( C の個々の属性に対して1つずつ作られる フィール     ドの集合から構成される)を作成する.この新しいインスタンスを OC と呼ぶこと     にする. C2 ● 標準のデフォルト値に従って OC の各フィールドを初期化する. C3 ● x の値(参照)を OC にアタッチする. C4 ● 与えられた引数とともに OC に対してプロシージャ p 呼び出す. 生成呼び出しの効果
  24. 24. 2011/3/17 オブジェクト指向プログラミング入門 6 24 生成プロシージャのエクスポートス テータス  POINT1 の2つの生成プロシージャは feature {NONE} で始まる特性句で宣言されており,通常の 呼び出しに対しては非公開である.  my_point.make_cartesian(0,1) や my_point.make_polar(1, Pi/2) という呼び出しは不正  一度生成した点オブジェクトの座標を顧客に直接設定させ ないようにするため.  生成プロシージャの選択的な公開を設定することも 可能 class C creation {A, B, …} p1, p2, …
  25. 25. 2011/3/17 オブジェクト指向プログラミング入門 6 25 生成プロシージャに関する規則  create x という基本形式と create x.p(…) という生 成呼び出しの2つの形式の生成命令は互いに排他的 である.  クラスの中に creation 句が現れたら,許されるのは生成呼 び出しだけで基本形式は無効.  コンパイラによって拒絶される  オブジェクトの一貫性のため  生成命令は常に一貫したオブジェクトを生成しなければなら ない  呼び出しのない create x という基本形式の生成命令が許され るのは,すべてのフィールドにデフォルト値を設定すること で一貫したオブジェクトが生成される場合だけ.
  26. 26. 2011/3/17 オブジェクト指向プログラミング入門 6 26 複数の生成プロシージャと多重定 義  C++ や Java では,生成プロシージャ(「コ ンストラクタ」)はすべて同じ名前であり, クラス名そのものである.  2つのコンストラクタを区別するにはシグネチャ (引数の型)で区別するしかない  make_cartesian と make_polar に相当するコンス トラクタを同時に定義できない...
  27. 27. 2011/3/17 オブジェクト指向プログラミング入門 6 27 参照の状態  参照は void かアタッチされているかの2つの状態のいずれかで ある.  オブジェクト  実行時の概念.すべてのオブジェクトはある特定のクラスのイ ンスタンスで,実行時作成され,いくつかのフィールドから構 成される  参照  実行時の概念.参照は void かオブジェクトにアタッチされてい るかのいずれかの値である.  エンティティ  静的な概念.クラステキストに現れる識別子である. VOID STATE ATTACHED STATE create b b := c (c がアタッチされてる ) b := Void b := c (c が void)
  28. 28. 2011/3/17 オブジェクト指向プログラミング入門 6 28 void の参照と呼び出し  ターゲットが void の特性呼び出しを実行しようとすると例外例外( exception )が 発生する  コンパイラでチェックすることは非現実的  void のターゲットに対して特性呼び出しをしないことを保証するのはプログラマの責 任  簡単な方法 if x /= Void then x.f(…) else … end  ただし,すべての特性呼び出しに対して上記のように書くのは荷が重過ぎる  システムが正確であることを証明するには以下を証明する必要がある  void の参照に適用される呼び出しが全く無いこと  すべての表明(後の章で説明)が対応する実行時の瞬間に満たされていること  ソフトウェアを守る方法  ソフトウェアを書くときは,誤った状況が実行時に発生するのをあらゆる手段を使っ て防ぐ必要がある(注意深く開発する.クラスを検査する,チェックツールを使用す る)  何らかの疑問が残っていて,同時に実行時の失敗が許されない場合,例外を処理する ための用意をソフトウェアに備えておく
  29. 29. 2011/3/17 オブジェクト指向プログラミング入門 6 29 参照についてのその他の操作  参照をオブジェクトにアタッチする class PERSON2 feature name: STRING loved_one, landlord: PERSION2 set_loved(l: PERSION2) is do loved_one := l end end  a.set_loved(r) の実行 “Almavia” “Susanna” “Rosina” r (PERSON2) (PERSON2)(PERSON2) O1 O2 O3 name landlord loved_one name landlord loved_one name landlord loved_one a
  30. 30. 2011/3/17 オブジェクト指向プログラミング入門 6 30 参照の比較  等号演算子 = を使う(逆の演算子は /= )  x=y が真になるのは,対応する参照が共に void であるか,同じオブジェクトにアタッチ されている場合だけ  参照を比較するのであって,オブジェクトを 比較するのではない  x と y が全く別のオブジェクトにアタッチされて いれば,たとえそれらのオブジェクトのフィール ドが全く一致していたとしても, x=y の値は偽と なる
  31. 31. 2011/3/17 オブジェクト指向プログラミング入門 6 31 void という値  定義済みの特性 Void  特定の参照が void かどうかテストする if x = Void then …  void の参照を作る x := Void x x O1 O1
  32. 32. 2011/3/17 オブジェクト指向プログラミング入門 6 32 オブジェクトのクローニングと一 致  オブジェクトの新しいコピーを作る x := clone(y)  オブジェクトの内容を比較する equal(x,y) 783 ‘A’ 783 ‘A’ 783 ‘A’ y y x OY OY OX
  33. 33. 2011/3/17 オブジェクト指向プログラミング入門 6 33 オブジェクトのコピー  すでにあるオブジェクトのフィールドに上書 きしたい場合 x.copy(y)  y にアタッチされているオブジェクトの フィールドが x に対応するフィールドにコ ピーされる  x も y も void であってはならない
  34. 34. 2011/3/17 オブジェクト指向プログラミング入門 6 34 深いクローニングと比較 “Almaviva”name landlord (PERSON1) loved_one name landlord (PERSON1) loved_one name landlord (PERSON1) loved_one “Figaro” “Figaro” O2 O1 O3 a “Almaviva”name landlord (PERSON1) loved_one name landlord (PERSON1) loved_one name landlord (PERSON1) loved_one “Figaro” “Figaro” O6 O5 O7 “Almaviva”name landlord loved_one O4 b b := a c c := clone(a) d d := deep_clone(a) 同様に deep_equal(x,y) もある
  35. 35. 2011/3/17 オブジェクト指向プログラミング入門 6 35 深い記憶:永続性について  参照を含むオブジェクトに対するストレージと復元 をどうすべきか?  オブジェクトにアタッチされている参照はそのオブジェク トなしでは価値がない オブジェクトの直接依存オブジェクトとは,そのオブジェクトの参照フィー ルドにアタッチされているオブジェクトがあれば,そのオブジェクトのこと をいう. オブジェクトの依存オブジェクトは,そのオブジェクト自身と,(再帰的に 関係をたどっていった)そのオブジェクトの直接依存オブジェクトの依存オ ブジェクトである. 定義:直接依存オブジェクトと依存オブジェクト ストレージメカニズムによってオブジェクトを保存するときには必ずそのオ ブジェクトの依存オブジェクトも一緒に保存しなければならない.保存され ているオブジェクトを復元メカニズムによって取り出すとき,そのオブジェ クトのまだ取り出されていない依存オブジェクトがある場合には,必ずそれ らも取り出さなければならない. 永続性の閉鎖の原則
  36. 36. 2011/3/17 オブジェクト指向プログラミング入門 6 36 STORABLE クラス  STORABLE の基本的な特性の形式  store(f: IO_MEDIUM)  x.store(f) という形式の呼び出しを実行すると, x にア タッチされているオブジェクトがそのすべての依存オブ ジェクトと一緒に f に関連付けられているファイルに保 存される  x の生成クラスは STORABLE の子孫でなければならな い  x にアタッチされているオブジェクトをその保存される 構造の先頭オブジェクト( head object )という.  retrieved(f: IO_MEDIUM): STORABLE  retrieved(f) の結果として,前の store 呼び出しによって f に保存された完全なオブジェクト構造と同一なオブ ジェクト構造が得られる
  37. 37. 2011/3/17 オブジェクト指向プログラミング入門 6 37 複合オブジェクトと拡張型  実行時の値が C のインスタンスそのものであるエンティティ x が必要 な場合,次のように宣言する x: expanded C  あるオブジェクト O の1つまたは複数のフィールド自体がオブジェク ト( O のサブオブジェクトと呼ばれる)であるとき, O は複合オブ ジェクトであるという  複合オブジェクトの書き方: class COMPOSITE feature ref: C sub: expanded C end (C) (C) (COMPOSITE) ref sub
  38. 38. 2011/3/17 オブジェクト指向プログラミング入門 6 38 拡張型  拡張クラス expanded class E feature … end  E 型として宣言されるエンティティはすべて拡張 型になる 次のような2つの場合,その型は拡張型である  ● expanded C という形式である  ● E という形式である.ただし, E は拡張クラスである. 定義:拡張型
  39. 39. 2011/3/17 オブジェクト指向プログラミング入門 6 39 拡張型の役割  効率性を向上させる  より良いモデル化を可能にする  以下の属性宣言がクラス C の中にあるとする D1 ● ref: S D2 ● exp: expanded S  D1 の宣言は C のすべてのインスタンスは S の特定のイン スタンスについて「知っている」を表している  共有を許す  D2 の宣言は C のすべてのインスタンスは S のインスタン スを1つ「含む」ということを表している  共有を許さない  統一されたオブジェクト指向的型体系の中での基本 型をサポートする
  40. 40. 2011/3/17 オブジェクト指向プログラミング入門 6 40 オブジェクト間の「知っている」と いう関係と「含む」という関係 class WORKSTATION feature k: expanded KEYBOARD c: expanded CPU m: expanded MONITOR n: NETWORK … end (NETWORK) KEYBOARD1 CPU1 MONITOR1 k c m n KEYBOARD1 CPU1 MONITOR1 k c m n KEYBOARD1 CPU1 MONITOR1 k c m n (WORKSTATION) (WORKSTATION) (WORKSTATION)「集約」と いう関係を 表現してい る
  41. 41. 2011/3/17 オブジェクト指向プログラミング入門 6 41 拡張型の性質  E 型の拡張エンティティ x について  x の値は常にオブジェクトなので,絶対に void にはならな い  x = Void の結果は常に偽になる  クラス D に expanded C 型の属性が含まれている 場合,クラス C は expanded D 型の属性を持つこ とはできない 「拡張顧客」は次のように定義されたクラス間の関係であるとする.すなわ ち, C のいずれかの属性が S に基づく拡張型である(つまり, expanded S であるか, S が拡張クラスである場合には単に S )ならば, C は S の拡張 顧客である. したがって,拡張顧客という関係に循環が含まれることがあってはならない . 拡張顧客の規則
  42. 42. 2011/3/17 オブジェクト指向プログラミング入門 6 42 サブオブジェクトへの参照はだめ  実装の側面  ガーベッジコレクションが効率良く実装できる  モデリングの視点  システム記述を単純化することになる (C) (E) (COMPOSITE1) other sub ref x y OE OC O_CMP1
  43. 43. 2011/3/17 オブジェクト指向プログラミング入門 6 43 アタッチメント:参照と値の意味  アタッチメント x := y の効果 ソース y の型→ ↓ ターゲット x の型 参照型 拡張型 参照型 参照のアタッチメ ント クローン. x := clone(y) の効 果 拡張型 コピー. x.copy(y) の効果 ( y が void なら失 敗) コピー. x.copy(y) の効果
  44. 44. 2011/3/17 オブジェクト指向プログラミング入門 6 44 アタッチメント:参照と値の意味  比較 x = y の意味 y の型→ ↓x の型 参照型 拡張型 参照型 参照の比較 equal(x,y) x が void でない場合はオブ ジェクトの比較で, x が void の場合は偽 拡張型 equal(x,y) y が void でない場合はオブ ジェクトの比較で, y が void の場合は偽 equal(x,y) オブジェクトの比較
  45. 45. 2011/3/17 オブジェクト指向プログラミング入門 6 45 参照の利点と危険  参照型の代入によって同じオブジェクトに別名が付 けられる(動的別名付け)  思わぬ影響を及ぼす可能性がある -- y.boolattr は偽とする x := y -- y.boolattr は偽 x.set_true -- y.boolattr は真!  動的別名付けとうまく折り合う  複雑なデータ構造を記述するには参照の代入が必要  カプセル化によって参照の操作の危険を避けられる
  46. 46. 次回予定  日時: 2011年3月24日(木)13: 00~14:30  場所: LB 2F/A 会議室  内容:総称性 2011/3/17 オブジェクト指向プログラミング入門 6 46

×