オブジェクト指向(基礎)
   2012/08/09 株式会社エスイーシー
                   香戸 寛雄
イントロダクション
皆さんについて教えてください
● お名前
● 業務(学校)で使っている言語
● あなたは今、オブジェクト指向
  をわかっている?
           (○ or ×)
あなたはどっち?
「扉を開ける」あなたはどっちの書き方?

 1. open(door)

 2. door.open()
あなたの指向は
1. open(door)
 手続き指向です
 「開ける」関数に「扉」構造体を渡してい
 ます
2. door.open()
 オブジェクト指向です
 「扉」オブジェクトの「開ける」メソッドを呼
 んでいます
知ってる?
オブジェクト指向の3原則って
知っていますか?
オブジェクト指向の3原則

 1. カプセル化
 2. 継承
 3. ポリモーフィズム
でも・・・
今回は「オブジェクト指向の3原則」には触
れません!
さらに
「たい焼きの鋳型」がクラス、「たい焼き」は
インスタンス!
的な意味のない例えも、今回は使いませ
ん。
本日のレジュメ
1. オブジェクト指向とは
 (そんなにオブジェクト指向すごいのか?)


 ■■ 休憩 ■■

2. 手続き型とオブジェクト型の
 違い               本日のレジュメ
1.オブジェクト指向とは
ググってみた
「IT用語辞典 e-word」にはこ
のように書かれています。
みんなで読み合わせてみましょ
う
                           http://e-words.
jp/w/E382AAE38396E382B8E382A7E382AFE3
                  8388E68C87E59091.html
ソフトウェアの設計や開発にお
いて、操作手順よりも操作対
象に重点を置く考え方。




       オブジェクト指向【object oriented】
関連するデータの集合と、それ
に対する手続き(メソッド)を「オ
ブジェクト」と呼ばれる一つの
まとまりとして管理し、その組
み合わせによってソフトウェア
を構築する。
         オブジェクト指向【object oriented】
1つのまとまりとして管理?
例えば、C言語においてライブ
ラリ化した場合、1つのまとまり
として管理されていないか?

この考え方は、オブジェクト指
向だけの考え方か?
すでに存在するオブジェクトについては、
利用に際してその内部構造や動作原理
の詳細を知る必要はなく、外部からメッ
セージを送れば機能するため、特に大規
模なソフトウェア開発において有効な考
え方であるとされている。



         オブジェクト指向【object oriented】
詳細を知る必要がない?
オブジェクト指向言語をつかっ
ている皆様はそのような実装に
なっている?

各言語の標準関数を使う場合
でも詳細を知る必要がある?
大規模なソフトウェア開発に
おいて有効?
なぜ?
ライブラリ化により、他言語でも
再利用性、汎用性はあがるの
では?
設計、およびポリシーの問題な
のでは?
データやその集合を現実世界
の「モノ」になぞらえた考え方で
あることから、「オブジェクト」指
向と呼ばれる。



        オブジェクト指向【object oriented】
現実世界の「モノ」になぞらえ
た?
現実世界をプログラムの世界
に反映させるの?
例えば、我々がテレビを操作する際には、テレビ
内部でどのような回路が働いているかを理解する
必要はない。ただテレビの操作方法だけを知って
いれば、それでテレビを使うことができる。
すなわち、「テレビ」というオブジェクトは、自身(の
内部を構成する電子回路)を動作させる手続きを
知っており、それを利用するためには、(例えばリ
モコンで)適切なメッセージを与えるだけでよい。




            オブジェクト指向【object oriented】
このように、何らかの「データ」
と、それを操作するための「メ
ソッド」の組み合わせが「オブ
ジェクト」である。


        オブジェクト指向【object oriented】
個々の操作対象に対して固有の操作方
法を設定することで、その内部動作の詳
細を覆い隠し、利用しやすくしようとする
考え方と言える。この考え方を応用した
プログラミング技法が、オブジェクト指向
プログラミング(OOP)である。




         オブジェクト指向【object oriented】
どうでしょう?
一般的なオブジェクト指向の説明・・・
いかに抽象的でいかに曖昧か・・・

これでオブジェクト指向が理解できます
か?
オブジェクト指向とは!
● 大規模開発に向いている
● 再利用性がとても高い
● 保守性も高く、仕様変更に強
  い
● 技術者として知るべきこと

     本当??
そんなわけない・・・
オブジェクト指向って・・・
● 必須?効率的?それはリーダーや製造
  者次第では?
● Javaが誕生して17年、C言語は過去の
  ものとなった?
● 知らないより知っているほうが良いレベ
  ルなのでは?

      所詮は道具
オブジェクト指向って流行って
いるの?

7月プログラミング言語人気

          http://news.mynavi.
jp/news/2012/07/10/012/index.
                         html
休憩
手続き型とオブジェクト型の
違い
オブジェクトって?
●   フィールドとは?
●   メソッドとは?
●   クラスとは?
●   インスタンスとは?
●   オブジェクトとは?
オブジェクトとは
● フィールド:変数です
● メソッド:関数です
● クラス:フィールドと関数を集めた定義
  体です
● インスタンス:クラスをメモリに実体化し
  たものです
● オブジェクト:インスタンスの総称です
     (とりあえずはオブジェクト=インスタンスでOK)
イントロダクションでのこと
● あなた自身がオブジェクト
● 名前、言語などが隠蔽化され
  た情報
● 私がお願いしたことがメソッド
  呼び出し
● あなたの動作が処理
どう つ・く・る?
画面をランダムに移動する街の住人
それぞれ向いている向きも違えば、外見も違う
でも、同じ外見の人もいたりする

こんな街の住人をプログラムで表現すると?

<キーワード>
 ・住人
 ・向き
 ・外見
 ・移動する
手続き型向の場合
● 住人構造体を作成
  (向き、外見に関する情報を保持)
● 「移動する」関数を作成
● 「移動する」関数に住人構造体を渡す
● この処理を住人の数だけ繰り返す



  move(non_player)
オブジェクト指向の場合
● 住人クラスを作成
  (向き、外見に関する情報を保持)
● 「移動する」メソッドを住人クラスに作成
● 住人の数だけオブジェクトを作成しメソッドを呼
  ぶ


   nonPlayer.move()
もう少し考えてみよう
では、次の処理を追加するとどうなる?


   主人公を動かす
手続き指向の場合
● 主人公構造体を作成
  (向き、外見に関する情報を保持)
● 「移動する」関数を作成
● 「移動する」関数に主人公構造体と移動する方
  向を渡す




 player_move(player, key)
オブジェクト指向の場合
● 主人公クラスを作成
  (向き、外見に関する情報を保持)
● 「移動する」メソッドを主人公クラスに作成
● 「移動する」メソッドを呼ぶ



   player.move(key)
あれ・・・
なんか「移動する」っていろいろ
出てきそうだけど・・・
「移動する」が増えれば増える
ほど手続きの方って・・・


  設計次第だけどねw
こ・ん・ど・は?
主人公の動きにこんな制約をつけます

 ・主人公の状態を追加
 ・主人公の毒と言う状態がある
 ・主人公の状態が毒の場合、移動するごとにHPが減る
手続き指向の場合
● 主人公構造体に「状態」と「HP」の情報を追加
● 「移動する」関数に「状態」により「HP」を減少さ
  せる処理を追加




  player_move(player, key)
もしかしたら・・・
● お仕事だったら、こんな風に書くかもね・・・

player_move(player, key)
if(player.status = poison){
   player.hp = player.hp -20
}
※ 進行上、これはなかったことに
オブジェクト指向の場合
● 主人公クラスに「状態」と「HP」の情報を追加
● 「移動する」メソッドに「状態」により「HP」を減少
  させる処理を追加



    player.move(key)
あれ?



手続きもオブジェクト
  も一緒?
でも・・・
状態もHPも「主人公」構造体(クラス)も持ち物!
「移動する」関数(メソッド)は?

<手続き>
 誰の持ち物でもない(処理実装部分が
 状態を意識している)
<オブジェクト>
 主人公クラスの持ち物(状態は主人公
 クラスしか意識していない)
どういうこと?
手続き指向は
 ○ 主人公構造体はただのデータの塊
 ○ それを操作(処理)する実装で、位
   置、向きを書き換える
 ○ さらに状態によって、HPが減るか減ら
   ないか判断する
手続指向だと

主人公構造体をいたるところで変更可能

主人公に対する変更が発生すると影響度
       は大きい

 さらに。。。不具合が発生しやすい
で??
オブジェクト指向は
 ○ 主人公クラスは全ての情報と「移動
   する」メソッドを管理
 ○ オブジェクト内で全ての情報を操作
   し、呼び出し先は情報を意識していな
   い
オブジェクト指向だと
  主人公の情報はクラス内で完結

情報に対する仕様変更はクラス内で完結
   処理の追加はメソッドの追加

  情報が隠ぺい化されているので
    不具合が発生した場合
    原因の特定がしやすい
ミソは!(1)

● オブジェクト指向は「情報」と
 「処理」を「ひとまとまり」に管
 理できる
ミソは!(2)

● オブジェクト指向は「情報」と
 「処理」の「ひとまとまり」を定
 義さえすれば、メモリ上に簡
 単にいくつでも、配置(実体
 化)出来る
ミソは!(3)

● オブジェクト指向は「情報」と
 「処理」の「ひとまとまり」を定
 義が同じでも、メモリ上に配置
 (実体化)したものはまったく
 の別物である
マルチプルインスタンス
実は先ほどの「ミソ」が
「マルチプルインスタンス」
と言うもので
オブジェクト指向を理解するうえで、もっと
も主となる考え方と言われています。
まとめ
今回の勉強会は
今回は「オブジェクト指向」の「オブジェク
ト」の部分を、以下の点からふれてみまし
た
● 一般的に言われているオブ
  ジェクト指向
● オブジェクトとはき型と比較
でも
まだ、「オブジェクト指向」の入り口に差し掛かった
くらいです。

しかし、いきなり「オブジェクト指向の3原則」などを
例え話を交えて説明しても、理論的な知識としてし
か理解できません。
本質のない知識は、やがて忘れていきます。
まずは

      オブジェクトって?
 なにが今までと違うの?

  を漠然とで良いので、
想像出来るようにしてください
今、こうなっていてくれたら幸い


 書籍、ネットで書かれている
   「オブジェクト指向」
      について
 自分なりの見方が出来る!
おそらく

 今、講義の序盤で行った
 「IT用語辞典 e-word」
での内容をもう一度読んだら…

       違うとらえ方が
その上で
「オブジェクトとは」をしっかり理解したうえ
で
「カプセル化,継承,ポリモーフィズム」
などを理解した方が効率的です。

なぜなら、「本質」を理解していなければ

ただの「言葉」で終わってしまうからで
最後に
知識や論理は後でもよい
わかったような例え話を覚えても、本質はわからな
い

重要なのは「自分の経験」と「学ぶべき対象」を比
較し、自分のものに出来るか

今回は、この部分から何かを掴んで頂けたなら、
良い時間となったかと思います

第2回勉強会 オブジェクト指向