Archive for 12月 27th, 2016

オブジェクト指向について

火曜日, 12月 27th, 2016

こんにちは。naoyaです。

毎月一回のプログラム学習記事の投稿です。

第三回は、「オブジェクト指向」について、調べたことをまとめて
いこうと思います。

・オブジェクト指向とは?
  ソフトウェア設計において、操作手順よりも捜査対象に重点を
 置く考え方。カプセル化・継承・多態性という3つの概念がある。
  関連するデータの集合と、それに対する手続き(メソッド)を
 「オブジェクト」と呼ばれる1つのまとまりとして管理し、その
 組み合わせによってソフトウェアを更新する。
  既に存在するオブジェクトについては、その内部構造や動作原
 理の詳細を知る必要は無く、外部からメッセージを送れば機能す
 るため、特に大規模なソフトウェア開発において、有効な考え方
 と言える。
  データやその集合を、現実世界の「モノ」になぞらえた考え方
 であることから、「オブジェクト」指向とよばれている。
  すなわち、「テレビ」というオブジェクトがあれば、テレビは
 自分自身の中身について、それを動作させる仕組みを知っており、
 それを利用するためには(たとえばリモコンなどで)適切なメッセ
 ージを与えるだけで良い。
  このような、何らかの「データ」と、それを操作するための
 「メソッド」の組み合わせが「オブジェクト」になる。
  個々の操作対象に対して、固有の操作を設定することで、その
 内部を隠し、利用しやすくしようとする考え方。
  ポイント
   1, プロジェクトを作るときは、まずデータ構造を決める。
   2, データ構造を中心に考える。
   3, データ構造は、中身を隠す(カプセル化する)と、必要な
     所だけ見えて分かりやすい。
   4, 継承と多態性という概念もある。
   
 ・カプセル化
   オブジェクト指向では、オブジェクトは中身がどうなってい
  るかを隠し、可能な操作と属性のみを公開するべきだと言われ
  る。可能な操作を「メソッド」、属性を「プロパティ」と言う。
  ※可能な操作と属性のみを公開すべき
   -例えば、正の整数を扱うメンバ変数に値を入れるときに、
   その値がもし負の数だった場合、直接値を入れると負の数が
   そのまま入り、後の計算がおかしくなるかもしれない。
   プロパティやメソッドを通して値を入れる場合、そこで負の
   数の時の処理をはさめるので、後々助かるかもしれない。
   
 ・継承
   クラス定義の共通部分を別クラスにまとめる仕組み。
   既存クラスの機能、構造を共有する新たなクラスを派生する
  ことが出来る。
   継承元のクラスを親クラスやスーパークラス、継承したクラ
  スをサブクラスと言い、サブクラスには、スーパークラスの変
  数定義やメソッド等が引き継がれる。スーパークラスとサブク
  ラスは包含関係で表現できる。
   継承を行うことで、コードの再利用性、拡張性を高めること
  ができる(複数のクラスで共通部分がある場合に、その部分を
  別クラスにして継承させると、コードが見やすくなり、バグや
  仕様変更などがあった場合に、修正箇所が少なくて澄む)。
  
 ・多態性
   同名のメソッドや型などをオブジェクトの種類によって使い
  分けることが出来る性質のこと。
   同じクラスを継承した2つのクラスでスーパークラスのメソ
  ッドをオーバーライドさせると、同じ名前のメソッドで違う挙
  動をさせること(目的は同じであるが、違う手段を使ったり、
  違う結果が欲しい場合など)が出来るため、コード利用側での
  変更を少なく出来る。
  

まとめ
 オブジェクト指向について調べてみましたが、どこの説明でも、
「コードの読みやすさ」や「コード改変のしやすさ」に重点を置い
ているような印象を受けました。これはそのまま、複数人で作業を
する場合に、他の人がコードを理解するのにかかる時間が減るのと、
バグや仕様変更などがあった時も、変更にかける時間を減らせると
いう利点があるように思います。
 継承は何度か使ったことがあり、カプセル化はイメージがつかみ
やすかったので、割とスッと頭に入ってきましたが、多態性につい
ては、中々理解するのに苦労しました。イメージが掴みづらく、サ
ンプルコードを見て、やっていることはわかるけれども、こうする
ことで何がいいのか、と言う所を理解するのに、凄く時間がかかり
ました(もしかしたら勘違いしているという可能性もありますので、
ご指摘等いただけるとうれしいです。)。

次回(第四回)は、「関数指向」について、書いていこうと思います。

参考URL:
http://www.sejuku.net/blog/9598
http://java2005.cis.k.hosei.ac.jp/materials/lecture18/polymorphism.html
http://qiita.com/lrf141/items/a2f764c8d87de26b6f45
http://nobuo-create.net/java-beginner-25/
http://ufcpp.net/study/csharp/oo_about.html
http://www.itmedia.co.jp/im/articles/0703/06/news125.html
http://e-words.jp/w/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91.html