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.

オブジェクト指向入門7

41 vues

Publié le

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

Publié dans : Formation
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

オブジェクト指向入門7

  1. 1. オブジェクト指向 プログラミング入門 ソフトウェア基礎講座 第7回 2011年3月24日 服部健太
  2. 2. 2011/3/24 オブジェクト指向プログラミング入門 7 2 メモリ管理(サマリーその1)  オブジェクト管理の3つのモード  静的( static ),スタック( stack-based ),自由( free )  不要なオブジェクトの回収方法  呑気なアプローチ,手作業による回収,自動ガーベジコレクション  メモリの回収にかんする諸問題  検出と回収  言語実装レベル,アプリケーションレベル,部品レベル  プログラマ制御による解放  信頼性という課題  不可思議なメモリのバグのために開発が繰返し遅らされるプロジェクトは少なく ない...  開発のしやすさという課題  アプリケーション開発の大部分の労力をメモリ管理に費やす...  部品レベルのアプローチ  例:連結リストのための領域管理  手作業によるメモリ管理が無くなるわけではなく,部品担当者に任せる  生成と削除のパターンが単純で予測可能なデータ構造にのみ適用可能
  3. 3. 2011/3/24 オブジェクト指向プログラミング入門 7 3 メモリ管理(サマリーその2)  自動領域管理  参照カウント  実装は簡単だが,循環構造を回収できない  ガーベジコレクション  安全であることと完全であることがガーベジコレクタの条件  実用上の諸問題  メカニズムのアプリケーションからの調整,修正  ファイナライゼーション  ガーベジコレクションと外部呼出し(ほかの言語のルーチン)  領域管理を備えた環境  基本は自動  実際的な制約によるチャレンジ  外部関数の呼び出し,オブジェクトのサイズは一様ではない,領域の返却  オブジェクトを動かす  ガーベジコレクションのメカニズム(組み合わされる)  マーク&スイープ,世代別回収,領域圧縮, etc.
  4. 4. 2011/3/24 オブジェクト指向プログラミング入門 7 4 総称性  クラスをより柔軟にする方法  拡張性,再利用性,信頼性を高める
  5. 5. 2011/3/24 オブジェクト指向プログラミング入門 7 5 2つの方向 LIST_OF_ BOOKS SET_OF_ BOOKS LINKED_LIST_ OF_BOOKS LIST_OF_ JOURNALS LIST_OF_PEOPLE 具象化 型のパラメータ化 型のパラメータ化
  6. 6. 2011/3/24 オブジェクト指向プログラミング入門 7 6 水平方向と垂直方向の型の汎化  LIST_OF_BOOKS を汎化する2つの方法  縦方向の軸(継承)  リストは「コンテナ構造」の特別な場合と考えることが できる.  より抽象的な変種⇒ SET_OF_BOOKS  より特殊な変種⇒ LINKED_LIST_OF_BOOKS  横方向の軸(総称性)  BOOK のリストは,任意のオブジェクトの特別な場合と 考えることができる.  JOURNAL のリスト, PEOPLE のリスト, etc.  ほぼ同一のクラスをいちいち記述しなくて済む
  7. 7. 2011/3/24 オブジェクト指向プログラミング入門 7 7 型のパラメータ化の必要性  ADT をパラメータ化した考え方をクラスにも適用し たい  課題  信頼性:明示的な宣言を通して型の安全性を享受できるこ と  再利用性:ある概念のバリエーションに適用できる1つの ソフトウェア要素を記述できること  型付けの役割  読みやすさのため:明示的な宣言はソースを読むプログラ マにそれぞれの要素の意図を語りかける  信頼性のため:コンパイラは誤った操作の適用が実際に行 なわれる前に検出することができる  間違いを修正するコストは,発見が遅れるほど増大する
  8. 8. 2011/3/24 オブジェクト指向プログラミング入門 7 8 総称クラスの宣言 Indexing description: “ 任意の型 G ”を要素に持つスタック class STACK[G] feature count: INTEGER -- スタック内の要素の数 empty: BOOLEAN is -- 要素は存在しない? do … end full: BOOLEAN is -- 中身がいっぱいか? do … end item: G is -- 最上位の要素 do … end put(x: G) is -- 最上位に x を追加 do … end remove is -- 最上位の要素を取り除く do … end end 仮総称 パラメータ
  9. 9. 2011/3/24 オブジェクト指向プログラミング入門 7 9 総称クラスの利用  実際の型(実総称パラメータ)を仮総称パラ メータの数だけ宣言に与える  例: sp: STACK[POINT] slp:STACK[LIST[POINT]] ssp:STACK[STACK[POINT]]  総称クラスに実総称パラメータを与えて型を 作り出すことを総称的派生総称的派生と呼ぶ
  10. 10. 2011/3/24 オブジェクト指向プログラミング入門 7 10 型チェック  総称性を用いると,あるデータ型がただ1つの型の要素だけを 含むことを保証することができるようになる  以下の宣言を含むクラスがあるとする sc:STACK[CIRCLE]; sa:STACK[ACCOUNT] c: CIRCLE; a: ACCOUNT  以下の呼び出しは妥当 sc.put(c) -- 円のスタックの上に円をプッシュ sa.put(a) -- 銀行口座のスタックの上に銀行口座をプッシュ c := sc.item -- 円のエンティティに円のスタックのトップを代入  以下の呼び出しはエラー sc.put(a) -- 円のスタックの上に銀行口座をプッシュ sa.put(c) -- 銀行口座のスタックの上に円をプッシュ c := sa.item -- 円のエンティティに銀行口座のスタックのトップを 代入
  11. 11. 2011/3/24 オブジェクト指向プログラミング入門 7 11 型の規則  基礎的な非総称的な規則  非総称クラス C に次のような特性があるとする  f(a: T): U is …  他の任意のクラス B に現れる x.f(d) という呼び出しは( x の型は C ), d が型 T であり,かつ f が B から見えるとき ,またそのときに限り正しい.  総称的な規則  総称クラス C は仮総称パラメータ G を伴っていて,次の ような特性があるとする  h(a: G): G is …  h への呼び出しは y.h(e) という形式であり, y は既存の型 V を用いて y: C[V] のように宣言されているとする  e の型は, V でなければならない.  呼び出しの戻り値の型も V である.
  12. 12. 2011/3/24 オブジェクト指向プログラミング入門 7 12 総称型のエンティティへの操作  オブジェクトの生成 create x は許されない  ANY の特性  clone, copy, equal, deep_clone, deep_equal など 仮総称パラメータ G を型にもつエンティティ x の正しい利用法は以下にあ げるものだけである   G1 ● x を代入 x := y の左辺として使う.右辺の式 y の型もまた G であ る   G2 ● x を代入 y := x の右辺として使う.左辺のエンティティ y の型も また G で        ある   G3 ● x を論理式 x = y もしくは x /= y で使う. y の型も G である.   G4 ● ルーチン呼び出しの際に, G 型もしくは ANY 型と宣言された型引 数へ x を     実引数として渡す   G5 ● ANY の特性を呼び出す際のターゲットとして 仮総称引数の型をもつエンティティの利用
  13. 13. 2011/3/24 オブジェクト指向プログラミング入門 7 13 型とクラス  これまで,クラスはモジュールであり,型でもある としてきたが,総称性の導入によって,必ずしも 「すべてのクラスが型である」とは言えなくなった  C[G] のように宣言される総称クラスは型というよりはむし ろ可能な無限の型をつむぎ出すパターンである  任意の型 T は1つのクラスと関連している  T のベースクラスと呼ぶ  もし T が C[U,…] といったものからの総称的派生であると すれば, T のベースクラスは C である  T のベースクラスに関する特性や顧客に関する議論は T に ついても成り立つ
  14. 14. 2011/3/24 オブジェクト指向プログラミング入門 7 14 例:オブジェクトとしての配列 class ARRAY[G] creation make feature make(minindex, maxindex: INTEGER) is -- 最小値 minindex と最大値 maxindex を指定して配列を生 成 -- もし minindex > maxindex なら配列は空となる do … end lower, upper, count: INTEGER -- インデックスの取りうる最小値,最大値,配列の大きさ . put(v: G; i: INTEGER) is do … end infix “@”, item(i: INTEGER): G is do … end end
  15. 15. 2011/3/24 オブジェクト指向プログラミング入門 7 15 総称クラス ARRAY の利用  配列オブジェクトの生成  create a.make(m, n)  配列への要素の設定  a.put(x, i)  配列の要素へのアクセス  x := a.item(i)  顧客からの利用例 pa: ARRAY[POINT]; p1: POINT; i, j: INTEGER … create pa.make(32, 101) -- 配列を指定した範囲で生成 pa.put(p1, i) -- i 番目の要素として p1 を設定 … p1 := pa.item(j) -- p1 に j 番目の要素を代入
  16. 16. 2011/3/24 オブジェクト指向プログラミング入門 7 16 配列の特徴  より多い次元を持つ類似の配列クラスを考え ることができる  特性 count は属性もしくは関数として実装す ることができる.  count = upper – lower + 1 という性質のため  表明によって put と item に対する一貫性制 約条件を定義することが可能となる  インデックス i が lower と upper の間にある場合 に限り,呼び出しが有効であるという条件を表現 することができる
  17. 17. 2011/3/24 オブジェクト指向プログラミング入門 7 17 総称性のコスト  総称性は C++ のテンプレートのようにコー ドの複製を前提とすべきではない  さもないと,プログラマは気軽に総称性を使えな い  適切な言語設計と優れたコンパイラをもって すれば,任意の総称クラスに対して唯一の コードを生成することが可能である  コンパイル時間への影響  生成されたコードのサイズへの影響  実行時間への影響  必要な作業空間への影響
  18. 18. 2011/3/24 オブジェクト指向プログラミング入門 7 18 残された質問  いくつかの円といくつかの四角形,何個かの 点を保持するスタックは考えられないか?  ⇒ 多相的データ構造  仮総称パラメータを任意の型ではなく,特定 の操作を提供してくれる型であることを保証 するにはどうするか?  ⇒ 制約付き総称性  どちらも総称性と継承の組合せで解決可能
  19. 19. クラスの見つけ方
  20. 20. 2011/3/24 オブジェクト指向プログラミング入門 7 20 要求仕様書を検討する(2)  分析の基本として要求仕様書を使うと,再利用を見 過ごす可能性がある.  オブジェクト指向のソフトウェア開発者は,新しいソフト ウェアプロジェクトに直面したとき,要求仕様書を問題に 関する知識の主な要素とは受け止めず,要求仕様書に加え て,それまでの開発や再利用可能なソフトウェアライブラ リに関する知識を組み合わせて考える.必要ならば,要求 仕様書を批評し,システムの構築がしやすいように更新し たり修正することを提案する.  発見と拒絶  候補となる抽象をどうやって見つけるか  不適当なものをどうやって暴くか
  21. 21. 2011/3/24 オブジェクト指向プログラミング入門 7 21 危険信号  実はルーチンであるものをクラスとしてしまう  私のクラスは・・・を実行する  何か他のクラスの 1 ルーチンにすべきものをクラスにして しまう  命令的な名前  前項のケース or 名前が間違っている  クラス名は名詞か形容詞でなければならない  1つのルーチンだけから構成されるクラス  例外:対話式システムにおけるコマンド  未熟なクラス分け  あまりにも早い段階から継承の階層構造について心配する  継承について考えるのは,抽象をよく理解してから
  22. 22. 2011/3/24 オブジェクト指向プログラミング入門 7 22 危険信号(2)  非命令クラス  まったくルーチンを含まないクラス,クエリはあるがコマンド は含まないクラス  Pascal のレコード型や C の構造体に相当  クラスの存在は正しいが,コマンドが見当たらない  クラスの存在が正しくなかった  リストや配列などの構造によって代用できる  ほかのクラスに属性を追加するだけで表現できる  不適当でないケース  外界から獲得されるオブジェクトを表すもの  処理制御システムからのデータや,パケット交換網からのパケット, etc.  継承によって他のクラスが使うために定数などの共有性質をカプセ ル化したクラス  修正可能でないオブジェクトについて記述する場合  オブジェクト自身を修正するコマンドの代わりに,同じ型の新しいオブ ジェクトを生成する関数を提供する. INTEGER,REAL,DOUBLE など
  23. 23. 2011/3/24 オブジェクト指向プログラミング入門 7 23 危険信号(3)  混合された抽象  同じクラスに含まれる特性が複数の抽象に関連す る  例: NeXT ライブラリ  初期のリリースでは,テキストクラスが完全なビジュア ルテキスト編集機能を提供していた.  2つの抽象(文字列と対話形式で編集可能なテキスト) の併合が問題だった.  結局, NSAttributedString と NSTextView に分離された
  24. 24. 2011/3/24 オブジェクト指向プログラミング入門 7 24 理想的なクラス  データ抽象として表せる明確に関連付けられた抽象が1つある  クラス名が名詞か形容詞で,その抽象を適切に表す名前である  クラスが実行時オブジェクトとなる可能性のあるもの,すなわ ちインスタンスの集合を表している  実行中にインスタンスが1つだけのクラスもあるがそれも可  インスタンスの属性を調べるためのクエリが用意されている  コマンドの代わりに生成ファンクションが含まれるのも可  インスタンスの状態を変えるためのコマンドが用意されている  抽象的な属性として以下の事柄を形式的・非形式的に記述する ことができる  色々なクエリの結果が互いにどのように関係するか(クラス不 変表明)  どのような条件のもとで特性が適用できるのか(事前条件)  コマンド実行がどのようにクエリの結果に影響を与えるか(事 後条件)
  25. 25. 次回予定  日時: 2011年3月31日(木)13: 00~14:30  場所: LB 2F/A 会議室  内容:契約による設計 2011/3/24 オブジェクト指向プログラミング入門 7 25

×