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.

オブジェクト指向入門5

48 vues

Publié le

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

Publié dans : Formation
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

オブジェクト指向入門5

  1. 1. オブジェクト指向 プログラミング入門 ソフトウェア基礎講座 第5回 2011年3月7日 服部健太
  2. 2. 2011/3/7 オブジェクトは主体ではない  オブジェクト技術におけるすべてのもとにな る基本概念はクラスクラスである  クラスは可能なデータ構造の集合を現しそれ らのデータ構造はそのクラスのインスタンスインスタンス ( instance )と呼ばれる  抽象データ型のインスタンス=数学的要素  クラスのインスタンス=メモリ上のデータ構造 クラスは(部分的であっても良い)実装を伴う抽象データ型である 定義:クラス 2オブジェクト指向プログラミング入門 5
  3. 3. 2011/3/7 クラスとオブジェクト  オブジェクトは単にクラスのインスタンスの こと  クラスはシステムの作成に使われるソフト ウェアテキスト  静的な構造  オブジェクトは実行時のみの概念  実行時に作成され,操作される 3オブジェクト指向プログラミング入門 5
  4. 4. 2011/3/7 メタクラス( metaclass )  クラスそのものをオブジェクトとして扱うた めの機構  メタクラスのインスタンスはクラスである.  メタクラスの概念を導入している言語では Smalltalk が有名  メタクラスを導入すると静的型チェックが困 難になる  利点よりも問題の方が多いので,本書では扱わな い  メタクラスの効果は他の手段によっても代替でき る 4オブジェクト指向プログラミング入門 5
  5. 5. 2011/3/7 「メタ~」について  「~についての~」のこと  日本語で「超~」ともいう  メタデータ  データについてのデータ  メタタグ  タグにつけるためのタグ  メタ言語  言語を記述するための言語 5オブジェクト指向プログラミング入門 5
  6. 6. 2011/3/7 モジュールと型(クラスの役割)  モジュールはソフトウェア分解の単位  ルーチンやパッケージ etc.  モジュールへの分解はソフトウェアが提供する サービスとは無関係  どんなプログラムも 1 つのメインプログラムで書くこと は可能  型は特定の動的なオブジェクトの静的な記述  ソフトウェアの実行中に処理される様々なデータ 要素の静的な記述  データ(値)を抽象したもの  すべての型はソフトウェアの実行に直接影響を与 える 6オブジェクト指向プログラミング入門 5
  7. 7. 2011/3/7 モジュールと型としてのクラス  クラスという概念の大きな特徴は,モジュー ルと型の概念を包括し, 1 つの言語的構造に 併合したこと  クラスはモジュールであり,型でもある(総 称性がある場合には型のパターン) 7オブジェクト指向プログラミング入門 5
  8. 8. 2011/3/7 一様な型体系  オブジェクト指向の重要な特徴の 1 つは,型 体系が単純で一様( uniform )であること  整数や実数,論理地,文字などの基本オブジェク トも,定義済みのライブラリクラス( INTEGER, REAL, DOUBLE, BOOLEAN, CHARACTER )の インスタンスとして考えられる すべてのオブジェクトは何らかのクラスのインスタンスである オブジェクトの原則( Object rule ) 8オブジェクト指向プログラミング入門 5
  9. 9. 2011/3/7 一様な型体系の利点  多くの特殊ケースを設けるよりは 1 つの単純で一律 のフレームワークを使う方がよい  基本的な型を ADT として記述すること,すなわち クラスとして記述することは単純で自然なことであ る  INTEGER を定義するには,「 + 」や「 <= 」などの演算子 に関する数学的公理を使えばよい  継承や総称性というオブジェクト指向の機構をすべ ての型に対して自然に適用できる  INTEGER , REAL, DOUBLE はより汎用的なクラスである NUMERIC の継承クラスであると考えることができる  MATRIX[INTEGER] や MATRIX[REAL] などの総称クラスと しての MATRIX 9オブジェクト指向プログラミング入門 5
  10. 10. 2011/3/7 単純なクラスの例: POINT x y p1 ρ θ x y rho theta POLAR_POINT CARTESIAN_POINT rho = sqrt(x*x+y*y) theta = arctan(y/x) x = rho*cos(theta) y = rho*sin(theta) 10オブジェクト指向プログラミング入門 5
  11. 11. 2011/3/7 抽象データ型としての POINT 型 TYPES ● POINT FUNCTIONS ● x: POINT → REAL ● y: POINT → REAL ● rho: POINT → REAL ● theta: POINT → REAL ● translate: POINT×REAL×REAL → POINT ● rotate: POINT×REAL → POINT ● scale: POINT×REAL → POINT AXIOMS 任意の x,y,a,b: REAL, x: POINT について以下が成り立つ ● x(translate(p1,a,b))=x(p1)+a ● y(translate(p1,a,b))=y(p1)+b ・・・ PRECONDITIONS ・・・ 11オブジェクト指向プログラミング入門 5
  12. 12. 2011/3/7 属性とルーチン  クラスにおいては,抽象データ型の関数は特性とな る  クラスのインスタンスに適用可能な操作となる  ある特性は空間によって表現される  ある情報をそのクラスのすべてのインスタンスに関連付け ることによって表現される  属性属性( attribute )と呼ばれる  ある特性は時間によって表現される  そのクラスのすべてのインスタンスに適用される計算(ア ルゴリズム)を定義することによって表現される  ルーチンルーチン( routine )と呼ばれる  ルーチンは結果を返すファンクションと返さないプロシー ジャに分類できる 12オブジェクト指向プログラミング入門 5
  13. 13. 2011/3/7 統一形式アクセス  p1 という点を操作するときには, p1 の内部 的な表現がデカルト座標か極座標か気にせず に済むようにしたい.  属性とファンクションを明示的に分けることは適 切か?  その属性がメモリによって実装されているか ,計算によって実装されているかにかかわら ず, 1 つの表記でアクセスできる.  例: p1.x 13オブジェクト指向プログラミング入門 5
  14. 14. 2011/3/7 POINT クラスの例 indexing description: “2 ”次元の点 class POINT feature x, y: REAL -- 横座標と縦座標 rho: REAL is -- 原点 (0,0) までの距離 do Result := sqrt(x^2+y^2) end theta: REAL is -- 横軸に対する角度 … distance(p: POINT): REAL is --p までの距離 do Result := sqrt((x-p.x)^2)+(y-p.y)^2) end … end 14オブジェクト指向プログラミング入門 5
  15. 15. 2011/3/7 関数の結果の表記  予約語 Result を使う  Result はデフォルト値で初期化される non_negative_value(x: REAL): REAL is -- 正ならば x の値,それ以外ならゼロ do if x > 0.0 then Result := x end end 15オブジェクト指向プログラミング入門 5
  16. 16. 2011/3/7 現在のインスタンス  どの点の x と y に a と b を足すのか?  現在のインスタンスの明示的な参照には予約語 Current を使う   distance(p: POINT): REAL is -- p までの距離 do if p /= Current then Result := sqrt((x-p.x)^2 + (y-p.y)^2) end end translate(a,b: REAL) is -- 水平方向に a, 垂直方向に b 移動する do x := x+a; y:= y+b end 16オブジェクト指向プログラミング入門 5
  17. 17. 2011/3/7 顧客と供給者  クラスを使う 2 通りの方法  そのクラスから継承する  そのクラスの顧客( client )になる  この定義では, a は C の属性かファンクションか もしれないし, C のルーチンのローカルなエン ティティか引数かもしれない  さきの例では,クラス POINT は REAL の顧客で ある S はクラスとする. a: S という形式の宣言を含むクラス C は S の顧客 ( client )であるという.また, S は C の供給者( supplier )であるという . 定義:顧客と供給者 17オブジェクト指向プログラミング入門 5
  18. 18. 2011/3/7 特性呼び出し  オブジェクト指向の基本的メカニズム  クラス POINT の特性 translate を p1 に適用せよ  特性呼び出しの基本形式  x.f  x.f(u, v, …)  x は呼び出しのターゲットと呼ばれる  2 つ目の形式では f は引数のあるルーチンであり,実引数 u,v な どは, C の中の f の宣言の仮引数と,型と個数が一致する必要が ある   p1.translate(4.0, -1.5) (あれば)個々の仮引数を対応する実引数の値に初期化した後, x にアタッ チされているオブジェクトに対して特性 f を適用する ターゲット x に対して特性 f を呼び出した効果 18オブジェクト指向プログラミング入門 5
  19. 19. 2011/3/7 単一ターゲットの原則  特性呼び出しと伝統的なプロシージャの違い  オブジェクト指向形式の特性呼び出しでは,ある オブジェクトをターゲットとして選び,他の引数 は補助的な地位に追いやられる オブジェクト指向におけるすべての操作は,その操作の実行時における現在 のインスタンスという特定のオブジェクトに対するものである. 単一ターゲット( Single Target )の原則 translate(p1, 4.0, -1.5) すべての引数が同 等に扱われている 19オブジェクト指向プログラミング入門 5
  20. 20. 2011/3/7 モジュールと型の識別  クラスはモジュールであると同時に型である  モジュールはソフトウェアの一部を構成する 関連する機能の集まりである.  モジュールが型ならば,そのモジュールの中 のすべての操作はその型の特性のインスタン スに対するものである. クラス POINT を 1 つのモジュールとして見たとき,このクラスによって提 供される機能は型として見たときのクラス POINT のインスタンスに対して 使用できる操作にほかならない. モジュールと型の融合がどのように行われるか 20オブジェクト指向プログラミング入門 5
  21. 21. 2011/3/7 Current の役割  あるルーチンに対するすべての呼び出しは,特定の ターゲットに対するものである  ルーチンのテキスト上に現れるすべての特性名をその特定 のターゲットに対して適用されるものとして扱う  p1.translate(4.0,-1.5) という呼び出しにおける, translate の本体の中のすべての x の記述は「 p1 の x 」を意味する  Current とは「現在の呼び出しのターゲット」であ る  F1 ● ルーチン呼び出しの一部として実行する以外の方法で実行される呼び 出し     要素は絶対にない. F2 ● すべての呼び出しにはターゲットが 1 つある. 特性呼び出しの原則 21オブジェクト指向プログラミング入門 5
  22. 22. 2011/3/7 修飾された呼び出しと修飾されない 呼び出し  修飾された呼び出し  呼び出しのターゲットが明示的に指定されているもの  x.f  x.f(u, v, …)  修飾されない呼び出し transform(a, b, factor: REAL) is -- (a,b) だけ移動し, factor を率として拡大/縮小する do translate(a,b); scale(factor) end  修飾されないすべての呼び出しはターゲットを Current と する修飾された呼び出しとして書き直すことができる do Current.translate(a,b); Current.scale(factor) ドット記法 22オブジェクト指向プログラミング入門 5
  23. 23. 2011/3/7 演算子特性  演算子を特性呼び出しと考える  x + a は x.plus(a) の糖衣構文 indexing description: “ ”実数 class REAL feature infix “+”(other:REAL): REAL is -- 現在の値と other の合計 do … end infix “-”(other:REAL): REAL is -- 現在の値と other の差 do … end prefix “-”: REAL is -- 符号を逆にした現在の値 end 伝統的な表記法とオブ ジェクト指向の法則を 調和させることが可能 23オブジェクト指向プログラミング入門 5
  24. 24. 2011/3/7 選択的エクスポートと情報隠蔽  特性の顧客による利用を制限する class S feature f … g … feature {A, B} h … feature {NONE} i … end 完全に開示する 顧客のアクセスを制限する 非公開にする 24オブジェクト指向プログラミング入門 5
  25. 25. 2011/3/7 自分自身にエクスポートする indexing note: “ ”このままでは正しくない class T feature x: T my_routine is do … print(x.secret) … end feature {NONE} secret: INTEGER end  secret は非公開なので, x.secret は無効  解決方法: feature {NONE} のかわりに feature {T} とすればよ い 25オブジェクト指向プログラミング入門 5
  26. 26. 2011/3/7 システムの実行  いったいどこから実行がはじまるのか?  1つのオブジェクトが作られ,生成プロシージャが開始される  ルートオブジェクトはシステムのルートクラスと呼ばれる特定 クラスのインスタンスである  生成プロシージャはルートクラスに含まれるプロシージャの 1 つである オブジェクト指向ではソフトウェアシステムの実行は次の 2 つのステップか ら成り立っている.  ●その実行のルートオブジェクト( root object )と呼ばれる特定のオブ ジェクトを   作成する  ●生成プロシージャ( creation procedure )と呼ばれる特定のプロシー ジャをその   オブジェクトに適用する 定義:システムの実行 26オブジェクト指向プログラミング入門 5
  27. 27. 2011/3/7 システム  システムの組み立てに必要な 3 つのこと  クラスの集合 CS .そのシステムのクラスセットと呼ばれ る  CS の中のどのクラスがルートクラスか  そのルートクラスのどのプロシージャがルート生成プロ シージャか  意味のあるシステムを作るためには,ルートクラス が直接あるいは間接に必要とするクラスすべてが CS に含まれていなければならない そのシステムのクラスセットの中にルートクラスが必要とするすべてのクラ スが含まれている場合にのみ,システムは閉じている. 定義:システムクロージャ 27オブジェクト指向プログラミング入門 5
  28. 28. 2011/3/7 メインプログラムとどこがちがう の?  伝統的なメインプログラムでは,次の無関係な概念 を融合していた  実行を開始する場所  システムアーキテクチャの一番上(トップ)の,あるいは ,根本的な要素  処理の開始時点がシステムの重要な要素である必然 性はまったくない  例:オペレーティングシステムにおけるブート手続き  システムの最も重要な属性は,それに含まれるクラ スの集合と,それらクラスの個々の機能と,クラス 間の属性  システムの進化に合わせて簡単に変更できなくてはならな い 28オブジェクト指向プログラミング入門 5
  29. 29. 2011/3/7 システムを組み立てる  組み立てツールにとって必要な情報  ルートクラスの名前  ユニバース( universe ).ルートが必要とするクラスのテ キストを含むファイルの集合  これらはクラステキストには記述できない  本書( Eiffel )では Lace と呼ばれる制御言語を用 いる system painting root GRAPHICS(“painting_application”) cluster base_library: “librarybase”; graphical_library: “librarygraphics”; painting_application: “userapplication” end 29オブジェクト指向プログラミング入門 5
  30. 30. クラスの見つけ方  要求仕様書の記述にある名詞に注目する  The elevator will close its door before it moves to another floor  ELEVATOR, DOOR, FLOOR がクラスになる  残念ながら,この方法はほとんど役に立たない  明らかなクラスしか見いだせないばかりか余計なクラスも含む  無駄なクラスを避ける  DOOR というクラスは本当に必要だろうか?  ELEVATOR の中にドアを開け閉めするコマンドを用意すれば済 むかもしれない  新しいクラスが必要か?  何階かという概念を表すのには整数でも十分?  整数の属性には含まれない重要な操作がある場合や利用で きる操作を制限したい場合, FLOOR クラスは妥当かもし れない 2011/3/7 30オブジェクト指向プログラミング入門 5
  31. 31. システム分析  「実世界をそのままモデル化すること」では ない  構築中のソフトウェアにとって意味のある部 分をモデル化すること. 2011/3/7 31オブジェクト指向プログラミング入門 5
  32. 32. 次回予定  日時: 2011年3月17日(木)13: 00~  場所: LB  2 F / A 会議室  内容:オブジェクト 2011/3/7 オブジェクト指向プログラミング入門 5 32

×