狠狠撸

狠狠撸Share a Scribd company logo
ハトでもわかる
オブジェクト指向
  @ukayare
オブジェクト指向とは?

オブジェクト同士の相互作用としてシステムの振る
舞いをとらえる考え方である。
英語の object-oriented (直訳は、「対象物志向の」
?「目的重視の」という意味の形容詞) の日本語訳
である。
オブジェクト指向は、当初プログラムの構造をオブジェクト群の相互作用の関係として捉えてプログラムコード
を書き表すオブジェクト指向プログラミング (OOP; object-oriented programming) から始まっているが、その
後、システム開発における要求分析フェイズにおいて、開発しようとする対象領域の構成要素をオブジェクト
として抽出?定義していくオブジェクト指向分析 (OOA; object-oriented analysis) 、システムの動作や構造を
オブジェクトとクラスとして記述するオブジェクト指向設計 (OOD; object-oriented design) のための、技術とし
ても広く発展?普及することとなった。

オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。特に複雑なシステム記
述、巨大なライブラリ(特に部品間で緊密で複雑な相互関係を持つもの)の記述においては、現実問題として
オブジェクト指向の考え方は必須であるといえる。
by WIkipwdia
つまりどういうことだってばよ!?
すっげー簡単に言うと

関数や変数をオブジェクト(モノ)にまとめ(パッケー
ジングし)て、
コードを読みやすくしたり、
プログラムを拡張しやすくするための手法
????


 関数?変数?別に手続き型でよくね?
手続き型言語?
記述された命令を逐次的に実行し、処理の結果に
応じて変数の内容を変化させていくプログラミング
言語のこと。

C言語やBASIC、Pascalなど、ほとんどのプログラミング言語は手続き型言語に属す
る。
処理速度が速い反面、動作を検証するには処理の流れを追う必要があり、開発効率
は関数型言語に劣るといわれる。


by IT用語辞典
????


 結局どこがどう違うのかよくわかんなーい
具体例をば



炊飯器の構造を
プログラムで
あらわしてみよう
炊飯器の構造????
まず構成要素を
あげてみる       フタ

          開くボタン
 切ボタン
             炊飯ボタン
                        釜
現在の状態
タイマー
                  加熱器
米を入れて炊けて、
電源を切るまでの流れ
1.   お水を入れて炊飯ボタンを押す
2.   炊ける
3.   フタを開ける(ご飯をよそう)
4.   フタを閉じる
5.   切ボタンを押す
????


 で、これがなんなの?
つまり

炊飯器の構成要素=変数
炊飯器の動作の流れの1つ1つ=関数

ってことです
各変数の意味を決めよう

フタ:閉じてるか上に上がってるか
開くボタン:押されてる、押されてない
炊飯ボタン:押されてる、押されてない
切ボタン:押した、押してない
釜:現在の温度(常温)
加熱器:現在の加熱具合(常温)
タイマー:切、作動中
現在の状態:切、炊飯中、保温中
各動作を細かく見よう(1)

1. お水を入れて炊飯ボタンを押す
  a. 炊飯ボタンが押される
  b. タイマーが作動中になる
  c. 加熱器が動いて炊飯の温度になる
     i. 釜に熱が伝わる
  d. 状態が炊飯中になる
2. 炊ける
   a. タイマーが切になる(止まる)
   b. 加熱器が保温の温度になる
      i. 釜に熱が伝わる
   c. 状態が保温中になる
  d. 炊飯ボタンが押されてない状態になる
各動作を細かく見よう(2)

1. フタを開ける(ご飯をよそう)
 a. 開くボタンを押された状態にする
 b. フタが上に上がる
2. フタを閉じる
 a. フタが閉じた状態になる
 b. 開くボタンが押されてない常態になる
3. 切ボタンを押す
 a. 切るボタンが押された状態になる
 b. 加熱器が常温になる
    i. 釜に熱が伝わる
 c. 状態が切になる
そして


今書き下した
それぞれが
変数、関数
となります
???!?

 な、なんだってー!?
 ???どういうこと?
軽くコードっぽく書いてみよう(変数)

boolean フタ=false;
boolean 開くボタン=false;
boolean 炊飯ボタン=false;
boolean 切ボタン=false;
temp 釜=常温;
temp 加熱器=常温;
boolean タイマー=false;
state 現在の状態=切;
軽くコードっぽく書いてみよう(関数)

お水を入れて炊飯ボタンを押す
start炊飯(){
  push炊飯();
  startタイマー();
  start加熱器();
  状態炊飯中();
}
軽くコードっぽく書いてみよう(関数)
炊飯ボタンが押される
push炊飯(){炊飯ボタン=true;}

タイマーが作動中になる
startタイマー(){タイマー=true;}

加熱器が動いて炊飯の温度になる
start加熱器(){
  加熱器=加熱中;
  釜加熱();
}
軽くコードっぽく書いてみよう(関数)
釜に熱が伝わる
釜加熱(){
  釜=加熱中;
}

状態が炊飯中になる
状態炊飯中(){
  現在の状態=炊飯中;
}
軽くコードっぽく書いてみよう(関数)

炊ける
炊ける(){
  タイマー切();
  加熱器保温();
  状態保温();
  炊飯ボタン切();
}
軽くコードっぽく書いてみよう(関数)
タイマーが切になる(止まる)
タイマー切{タイマー=false;}

加熱器が保温の温度になる
加熱器保温(){加熱器=保温;}

状態が保温中になる
状態保温(){現在の状態=保温;}

炊飯ボタンが押されてない状態になる
炊飯ボタン切(){炊飯ボタン=false;}

釜に熱が伝わる
釜保温(){釜=保温;}
軽くコードっぽく書いてみよう(関数)

フタを開ける
openフタ(){
  push開くボタン();
  upフタ();
}
開くボタンを押された状態にする
push開くボタン(){開くボタン=true;}

フタが上に上がる
upフタ(){フタ=true;}
軽くコードっぽく書いてみよう(関数)

フタを閉じる
closeフタ(){
  downフタ();
  unpushed開くボタン();
}
フタが閉じた状態になる
downフタ(){フタ=false;}

開くボタンが押されてない常態になる
unpushed開くボタン(){開くボタン=false;}
軽くコードっぽく書いてみよう(関数)

切ボタンを押す
push切ボタン(){
  pushed切ボタン();
  加熱器常温();
  状態切();
}
切るボタンが押された状態になる
pushed切ボタン(){切ボタン=true}
軽くコードっぽく書いてみよう(関数)
加熱器が常温になる
加熱器常温(){
  加熱器=常温;
  釜常温();
}

釜に熱が伝わる
釜常温(){釜=常温;}

状態が切になる
状態切(){現在の状態=切;}
?

なんとなくわかったけど、
手続き型でいいよねこれ
そいつはどうかな?

変数をどうするか?
● グローバル変数を使うのはまずい
  ○ どこからでも見れるグローバル変数はどこで何が起こった
   かをトレースするのが難しい
● 関数に引数を持たせる
  ○ 変数のたらいまわしによる可読性の低下
  ○ 関数の引数は基本的に値を参照するのみとする(一応
   変更可能に出来るが)
大規模時の弊害

● 手続き型だと規模が大きくなったときに、関数同
  士の関連性をぱっと見わからない
 ○ ファイルを分けることである程度その辺の部分をある程度
   お茶を濁すことが出来る
 ○ 構造体を使用することでもある程度対処可能だが、拡張
   性が低くなる
● 分割したところで関係ないところで関数を呼び出
  すことは可能なので、本質的ではない
● 副作用の問題
 ○ 影響範囲が良くわからなくなる
たしかに

C言語で
大規模プログラムは書きたくないわー
ということで

その辺をまとめて
影響範囲とかを明確にしようと
言うのが
オブジェクト指向の主旨です
(たぶん)
さっきの炊飯器をまとめると

class 炊飯器{
  boolean 炊飯ボタン;
  boolean フタ;
  ...
  start炊飯(){
     ...
  }
  ...
}
ん?


これ別に手続き型でも???
ここでカプセル化と言う概念
カプセル化とは、「手続きと情報を一緒にまとめる」というオブ
ジェクト指向プログラミングの考え方のことである。

カプセル化は、外部から操作できる処理に対してオブジェクト内
部で情報を紐付けることであり、外部から不要な操作や情報を
遮断できる。こうすることでオブジェクトを操作する側から見るとイ
ンターフェース(外部から操作できる処理)のみ把握すればよく、
オブジェクトの独立性が高まり、結果的に開発効率と可搬性の
向上が期待できる。
?


??????????????????
簡単に言うと

オブジェクトを
使う側から見て
内部の処理は
良くわかんなくても
使えるようにすること
炊飯器を例にすれば


ご飯炊きたい

         炊飯器オブジェクトに
         start炊飯を実行すれば
         いい
炊飯器を例にすれば


ご飯炊きたい
    炊飯器オブジェクト内で何してるか
    よくわかんなくても
       炊飯器オブジェクトに
    動作を実行することが出来る
       start炊飯を実行すれば
    (インターフェースのように扱える)
       いい
さらに継承と言う概念

例えば???
高機能な炊飯器を新しく考えたい

         アップ
         グレード!
このとき


 またいろいろ書き直すのめんどいお???
継承を使えば拡張も簡単

class高機能炊飯器 expands 炊飯器{
  新機能(){
    ...
  }
}

継承により再利用性や拡張性が高くなる!
(たぶん)
あとポリモーフィズムという考え方

こういうときどうする?
          お米だけじゃなくて
          パンも焼きたい
このとき

 [start炊飯ボタンby米]と
 [start炊飯ボタンbyパン]で
 名前别にするのはなんかあれだなあ
こういうときこそポリモーフィズム
オブジェクト指向プログラミング言語の持つ性質の
ひとつであり、同名のメソッドや型などをオブジェク
トの種類に応じて使い分けることができる性質のこ
と。日本語では「多相性」「多態性」「多様性」などと
訳される。
?


??????????????????
噛み砕くと

引数の型を変えたり、
継承先で別動作を定義したり、
同じメソッド名でも
いろいろな動作を
できるようにしようということ
さっきの炊飯器の機能でいうと

class 高機能炊飯器 expands 炊飯器{
  start炊飯(米){
    ....

   }
   start炊飯(パン){
    ...

   }
}
メソッド引数の型などによるポリモーフィズム
???オーバーロード
こんな感じで

● カプセル化
● 継承
● ポリモーフィズム

こういった概念を取り入れてコードの再利
用や拡張性、可読性やメンテナンスをやり
やすくしたのがオブジェクト指向
なるほど


なんとなくわかったお
今回は概念だけ

これを実現する機能としていろいろあります
● アクセサ
● プロパティ
● オーバーロード
● オーバーライド
● コンストラクタ
● とかとか?

後は自分で調べてね!
それでは


ありがとうございました
注意

この資料はukayareの独断と偏見による説明になっ
ております。
正確な事実と若干異なる部分がある可能性があり
ます。

もし「これぜんぜん違うじゃねーか」という部分があり
ましたら、twitterで@ukayareまでお願いいたしま
す。

More Related Content

ハトでもわかるオブジェクト指向