Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

4,600 views

Published on

  • Be the first to comment

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

  1. 1. ハトでもわかるオブジェクト指向 @ukayare
  2. 2. オブジェクト指向とは?オブジェクト同士の相互作用としてシステムの振る舞いをとらえる考え方である。英語の object-oriented (直訳は、「対象物志向の」・「目的重視の」という意味の形容詞) の日本語訳である。オブジェクト指向は、当初プログラムの構造をオブジェクト群の相互作用の関係として捉えてプログラムコードを書き表すオブジェクト指向プログラミング (OOP; object-oriented programming) から始まっているが、その後、システム開発における要求分析フェイズにおいて、開発しようとする対象領域の構成要素をオブジェクトとして抽出・定義していくオブジェクト指向分析 (OOA; object-oriented analysis) 、システムの動作や構造をオブジェクトとクラスとして記述するオブジェクト指向設計 (OOD; object-oriented design) のための、技術としても広く発展・普及することとなった。オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。特に複雑なシステム記述、巨大なライブラリ(特に部品間で緊密で複雑な相互関係を持つもの)の記述においては、現実問題としてオブジェクト指向の考え方は必須であるといえる。by WIkipwdia
  3. 3. つまりどういうことだってばよ!?
  4. 4. すっげー簡単に言うと関数や変数をオブジェクト(モノ)にまとめ(パッケージングし)て、コードを読みやすくしたり、プログラムを拡張しやすくするための手法
  5. 5. ・・・? 関数?変数?別に手続き型でよくね?
  6. 6. 手続き型言語?記述された命令を逐次的に実行し、処理の結果に応じて変数の内容を変化させていくプログラミング言語のこと。C言語やBASIC、Pascalなど、ほとんどのプログラミング言語は手続き型言語に属する。処理速度が速い反面、動作を検証するには処理の流れを追う必要があり、開発効率は関数型言語に劣るといわれる。by IT用語辞典
  7. 7. ・・・? 結局どこがどう違うのかよくわかんなーい
  8. 8. 具体例をば炊飯器の構造をプログラムであらわしてみよう
  9. 9. 炊飯器の構造・・・?まず構成要素をあげてみる フタ 開くボタン 切ボタン 炊飯ボタン 釜現在の状態タイマー 加熱器
  10. 10. 米を入れて炊けて、電源を切るまでの流れ1. お水を入れて炊飯ボタンを押す2. 炊ける3. フタを開ける(ご飯をよそう)4. フタを閉じる5. 切ボタンを押す
  11. 11. ・・・? で、これがなんなの?
  12. 12. つまり炊飯器の構成要素=変数炊飯器の動作の流れの1つ1つ=関数ってことです
  13. 13. 各変数の意味を決めようフタ:閉じてるか上に上がってるか開くボタン:押されてる、押されてない炊飯ボタン:押されてる、押されてない切ボタン:押した、押してない釜:現在の温度(常温)加熱器:現在の加熱具合(常温)タイマー:切、作動中現在の状態:切、炊飯中、保温中
  14. 14. 各動作を細かく見よう(1)1. お水を入れて炊飯ボタンを押す a. 炊飯ボタンが押される b. タイマーが作動中になる c. 加熱器が動いて炊飯の温度になる i. 釜に熱が伝わる d. 状態が炊飯中になる2. 炊ける a. タイマーが切になる(止まる) b. 加熱器が保温の温度になる i. 釜に熱が伝わる c. 状態が保温中になる d. 炊飯ボタンが押されてない状態になる
  15. 15. 各動作を細かく見よう(2)1. フタを開ける(ご飯をよそう) a. 開くボタンを押された状態にする b. フタが上に上がる2. フタを閉じる a. フタが閉じた状態になる b. 開くボタンが押されてない常態になる3. 切ボタンを押す a. 切るボタンが押された状態になる b. 加熱器が常温になる i. 釜に熱が伝わる c. 状態が切になる
  16. 16. そして今書き下したそれぞれが変数、関数となります
  17. 17. ・・・!? な、なんだってー!? ・・・どういうこと?
  18. 18. 軽くコードっぽく書いてみよう(変数)boolean フタ=false;boolean 開くボタン=false;boolean 炊飯ボタン=false;boolean 切ボタン=false;temp 釜=常温;temp 加熱器=常温;boolean タイマー=false;state 現在の状態=切;
  19. 19. 軽くコードっぽく書いてみよう(関数)お水を入れて炊飯ボタンを押すstart炊飯(){ push炊飯(); startタイマー(); start加熱器(); 状態炊飯中();}
  20. 20. 軽くコードっぽく書いてみよう(関数)炊飯ボタンが押されるpush炊飯(){炊飯ボタン=true;}タイマーが作動中になるstartタイマー(){タイマー=true;}加熱器が動いて炊飯の温度になるstart加熱器(){ 加熱器=加熱中; 釜加熱();}
  21. 21. 軽くコードっぽく書いてみよう(関数)釜に熱が伝わる釜加熱(){ 釜=加熱中;}状態が炊飯中になる状態炊飯中(){ 現在の状態=炊飯中;}
  22. 22. 軽くコードっぽく書いてみよう(関数)炊ける炊ける(){ タイマー切(); 加熱器保温(); 状態保温(); 炊飯ボタン切();}
  23. 23. 軽くコードっぽく書いてみよう(関数)タイマーが切になる(止まる)タイマー切{タイマー=false;}加熱器が保温の温度になる加熱器保温(){加熱器=保温;}状態が保温中になる状態保温(){現在の状態=保温;}炊飯ボタンが押されてない状態になる炊飯ボタン切(){炊飯ボタン=false;}釜に熱が伝わる釜保温(){釜=保温;}
  24. 24. 軽くコードっぽく書いてみよう(関数)フタを開けるopenフタ(){ push開くボタン(); upフタ();}開くボタンを押された状態にするpush開くボタン(){開くボタン=true;}フタが上に上がるupフタ(){フタ=true;}
  25. 25. 軽くコードっぽく書いてみよう(関数)フタを閉じるcloseフタ(){ downフタ(); unpushed開くボタン();}フタが閉じた状態になるdownフタ(){フタ=false;}開くボタンが押されてない常態になるunpushed開くボタン(){開くボタン=false;}
  26. 26. 軽くコードっぽく書いてみよう(関数)切ボタンを押すpush切ボタン(){ pushed切ボタン(); 加熱器常温(); 状態切();}切るボタンが押された状態になるpushed切ボタン(){切ボタン=true}
  27. 27. 軽くコードっぽく書いてみよう(関数)加熱器が常温になる加熱器常温(){ 加熱器=常温; 釜常温();}釜に熱が伝わる釜常温(){釜=常温;}状態が切になる状態切(){現在の状態=切;}
  28. 28. ?なんとなくわかったけど、手続き型でいいよねこれ
  29. 29. そいつはどうかな?変数をどうするか?● グローバル変数を使うのはまずい ○ どこからでも見れるグローバル変数はどこで何が起こった かをトレースするのが難しい● 関数に引数を持たせる ○ 変数のたらいまわしによる可読性の低下 ○ 関数の引数は基本的に値を参照するのみとする(一応 変更可能に出来るが)
  30. 30. 大規模時の弊害● 手続き型だと規模が大きくなったときに、関数同 士の関連性をぱっと見わからない ○ ファイルを分けることである程度その辺の部分をある程度 お茶を濁すことが出来る ○ 構造体を使用することでもある程度対処可能だが、拡張 性が低くなる● 分割したところで関係ないところで関数を呼び出 すことは可能なので、本質的ではない● 副作用の問題 ○ 影響範囲が良くわからなくなる
  31. 31. たしかにC言語で大規模プログラムは書きたくないわー
  32. 32. ということでその辺をまとめて影響範囲とかを明確にしようと言うのがオブジェクト指向の主旨です(たぶん)
  33. 33. さっきの炊飯器をまとめるとclass 炊飯器{ boolean 炊飯ボタン; boolean フタ; ... start炊飯(){ ... } ...}
  34. 34. ん?これ別に手続き型でも・・・
  35. 35. ここでカプセル化と言う概念カプセル化とは、「手続きと情報を一緒にまとめる」というオブジェクト指向プログラミングの考え方のことである。カプセル化は、外部から操作できる処理に対してオブジェクト内部で情報を紐付けることであり、外部から不要な操作や情報を遮断できる。こうすることでオブジェクトを操作する側から見るとインターフェース(外部から操作できる処理)のみ把握すればよく、オブジェクトの独立性が高まり、結果的に開発効率と可搬性の向上が期待できる。
  36. 36. ???????????????????
  37. 37. 簡単に言うとオブジェクトを使う側から見て内部の処理は良くわかんなくても使えるようにすること
  38. 38. 炊飯器を例にすればご飯炊きたい 炊飯器オブジェクトに start炊飯を実行すれば いい
  39. 39. 炊飯器を例にすればご飯炊きたい 炊飯器オブジェクト内で何してるか よくわかんなくても 炊飯器オブジェクトに 動作を実行することが出来る start炊飯を実行すれば (インターフェースのように扱える) いい
  40. 40. さらに継承と言う概念例えば・・・高機能な炊飯器を新しく考えたい アップ グレード!
  41. 41. このとき またいろいろ書き直すのめんどいお・・・
  42. 42. 継承を使えば拡張も簡単class高機能炊飯器 expands 炊飯器{ 新機能(){ ... }}継承により再利用性や拡張性が高くなる!(たぶん)
  43. 43. あとポリモーフィズムという考え方こういうときどうする? お米だけじゃなくて パンも焼きたい
  44. 44. このとき [start炊飯ボタンby米]と [start炊飯ボタンbyパン]で 名前別にするのはなんかあれだなあ
  45. 45. こういうときこそポリモーフィズムオブジェクト指向プログラミング言語の持つ性質のひとつであり、同名のメソッドや型などをオブジェクトの種類に応じて使い分けることができる性質のこと。日本語では「多相性」「多態性」「多様性」などと訳される。
  46. 46. ???????????????????
  47. 47. 噛み砕くと引数の型を変えたり、継承先で別動作を定義したり、同じメソッド名でもいろいろな動作をできるようにしようということ
  48. 48. さっきの炊飯器の機能でいうとclass 高機能炊飯器 expands 炊飯器{ start炊飯(米){    .... } start炊飯(パン){ ... }}メソッド引数の型などによるポリモーフィズム・・・オーバーロード
  49. 49. こんな感じで● カプセル化● 継承● ポリモーフィズムこういった概念を取り入れてコードの再利用や拡張性、可読性やメンテナンスをやりやすくしたのがオブジェクト指向
  50. 50. なるほどなんとなくわかったお
  51. 51. 今回は概念だけこれを実現する機能としていろいろあります● アクセサ● プロパティ● オーバーロード● オーバーライド● コンストラクタ● とかとか?後は自分で調べてね!
  52. 52. それではありがとうございました
  53. 53. 注意この資料はukayareの独断と偏見による説明になっております。正確な事実と若干異なる部分がある可能性があります。もし「これぜんぜん違うじゃねーか」という部分がありましたら、twitterで@ukayareまでお願いいたします。

×