■ Java オブジェクト指向
□ 注意事項
・本稿では「オブジェクト指向とは何か」ということで、いくつか解説を行っている。
・複数の解説を提示した理由は、初級者が「オブジェクト指向とは何か?」ということが、理解しにくいと考え、複数の解説を行い、そのうちのどれかで納得してもらえば、オブジェクト指向への理解が早まると考えた。
・本稿で解説するのは「クラスベースのオブジェクト指向」で、別に「プロトタイプベースのオブジェクト指向」というものもあるが、こちらは解説しない。
□ オブジェクト指向を勉強する意味
・オブジェクト指向は、現在のプログラミング言語の到達点
・現在の主流の言語は、オブジェクト指向言語
Java、PHP、Ruby、Python、C#などなど
・現在のシステム開発のほとんどは、オブジェクト指向言語で行われている
・なのでオブジェクト指向の考え方を身につけることは、非常に重要
□ オブジェクト指向の由来
・パロアルト研究所(ゼロックス)
http://ja.wikipedia.org/wiki/%E3%83%91%E3%83%AD%E3%82%A2%E3%83%AB%E3%83%88%E7%A0%94%E7%A9%B6%E6%89%80
・smalltalk
http://ja.wikipedia.org/wiki/Smalltalk
・アラン・ケイ → ダイナブック
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A9%E3%83%B3%E3%83%BB%E3%82%B1%E3%82%A4
□ オブジェクト指向とは何か - 0
・クラスを定義してプログラミングすること
□ オブジェクト指向とは何か - 1
・組織内での分業と役割分担のようなもの
・組織内では、いろいろ役割を持った人が、分業して仕事をしている
・自分の役割以外のことはしない
・自分の役割以外のことを実行する場合には、他の人に依頼する
・役割がクラス
・その役割の個人がオブジェクト
□ オブジェクト指向とは何か - 2
・クラスは設計図
・オブジェクトは製品
・設計図を元に製品を作る
・一つの設計図を元に、製品をいくつも作ることができる
・例.住所クラスと住所オブジェクト
・住所は、国、都道府県、市町村、....などから構成される
・住所クラスには、これらのデータを入れるフィールドがある
・Aさんの住所を表現するために、住所クラスから住所オブジェクトを作成し、Aさんの住所の具体的なデーを入れる
・Bさんの住所も同じ..
・住所クラスは、住所がどのようなものから構成されるかの設計図、住所オブジェクトは、具体的な住所が設定された製品
□ オブジェクト指向とは何か - 3
・例えば住所録アプリで一人のデータは次の項目から構成
・氏名
・郵便番号
・都道府県
・以下の住所
・それぞれの項目をアプリでバラに管理すると分かりにくい
・住所クラスを作り上記の項目を格納し、アプリでは、住所クラスの集合として処理すると分かりやすい
□ オブジェクト指向とは何か - 4
・オブジェクトとは?
・コンピュータシステム内の処理の対象
・書籍管理の書籍や著者や出版社、人事管理の社員や部門や資格、在庫管理の商品や発注先など
・システムの動作
・システム内では複数のオブジェクトが連携しあいながら処理を進める
・人事システムでは、社員や部門や資格などのオブジェクトが連携しあう
・社員オブジェクトは実際の社員の数だけ存在する、他も同じ
・クラス - オブジェクトの設計図
・それぞれのオブジェクトには、いわば設計図があり、それをクラスと言う
・実行時に新しいオブジェクトが必要になった時点でクラスを元にオブジェクトが作成される
・例えば、新しい社員が入社した時に、社員クラスから社員オブジェクト化作成される
・クラスには、次のものが記述される
・オブジェクトがどのようなデータを持っているのか?
社員オブジェクトは給与のデータを持っている
・オブジェクトには、どのような操作が許されるのか?
この操作によって内部のデータを取得したり、設定したりできる
社員オブジェクトは給与を増やす操作を持っている
・データのことをプロパティやフィールドと言う
・操作のことをメソッドと言う
・システムの構築
・オブジェクト指向によるプログラミングとは、「クラスを設計、作成すること」である
・プロジェクト指向では、最初にどのようなクラスが必要なのか洗い出すことが行われる
・それにもとづいてクラスごとにプログラミングが行われる
□ オブジェクト指向とは何か - 5
・オブジェクト指向とは、以下の技法によるプログラミングである。
・抽象化(クラスの作成)
・カプセル化
・抽象化(クラスの作成)
・対象のシステムで、どのようなデータが必要かを洗い出す
・洗い出されたデータをグループ化する ⇒ クラスの抽出
・カプセル化
・オブジェクト(クラス)の内部データに、不当なアクセスをさせないための手段
・不当なアクセスを許すと、内部データがおかしくなったり、プログラムの構造がおかしくなったりする
・例.貿易関係のシステムで、商品の価格を円で設定するようになっているが、内部データでは変換してドルで持っているような場合、それを知らない人が内部データに円で設定してしまう。
□ オブジェクト指向とは何か - 6
・対象領域に登場する物や概念の構造と役割、そしてそれらの相互作用に着目してモデリング&プログラミングする手法
□ オブジェクト指向の手法
□ 位置づけ
・オブジェクト指向は、現在のプログラミング言語の到達点
・現在の主流の言語は、オブジェクト指向言語
・オブジェクト指向の考え方を身につけることは、非常に重要
□ 目的
・部品化の推進
・開発の効率化
・品質の向上
・部品の流通
□ 手法
・抽象化-オブジェクト(クラス)の抽出 <= 人間が行う
・カプセル化 <= 言語が行う
・継承 <= 言語が行う
注、言語にその機能があっても、正しく使うのは人間の責任
□ 抽象化-オブジェクト(クラス)の抽出 モデルの作成
以下の手順で行う
1.処理に必要なデータを洗い出す
要求仕様や概要設計やインタビューなどから
2.そのデータをグループ分けする(クラスの抽出)
書籍に関係するデータ、社員に関係するデータなどなど
3.抽出されたクラスで処理がスムーズに行えるかシミュレーションする
スムーズに行かなければ2.に戻る
□ カプセル化
・オブジェクト(クラス)の内部データに、不当なアクセスをさせないための手段
・不当なアクセスを許すと、内部データがおかしくなったり、プログラムの構造がおかしくなったりする
・例
年齢を公開するとマイナス値を設定されるかもしれない。
なので他からアクセスできないようにしメソッドを設けてマイナス値が設定されないようにする
□ 継承
・継承とは、既存のクラスを元に新しいクラスを作成すること
既存のクラスを基底クラス(親クラス)、新しいクラスを派生クラス(子クラス)と言う
・継承を使うのは、同じ定義や処理を複数の部分で行いたくないため
・例
社員クラスを定義した、これを基底クラスとして、管理職クラス、一般社員クラス、契約社員クラスを派生クラスとして定義
社員共通の処理は、社員クラスにのみ記述される
□ overrideとoverload
・override
・基底クラスのメソッドを書き換えること
・overload
・引数が違う同名のメソッドを定義すること
□ ロジック用クラスとデータ保持用クラス
・アプリケーションは、ロジック用のクラスとデータ保持用のクラスに分けられる
・ロジック用のクラスは、データ保持用のクラスを受け渡しつつ、処理を連携する
・ロジック用のクラスは、またデータベースを介して、処理を連携する
file:ロジック用クラスとデータ保持用クラス.pdf

□ 蛇足ないし補足
・インスタンスとオブジェクト
・クラスが設計図であり、クラスを元に作成されたものがインスタンス
・インスタンスのことをオブジェクトともいう
・しかしオブジェクトと言った場合は、若干意味が曖昧
・メソッドとメッセージ
・オブジェクト同士の連携をメッセージと言うが、これはメソッド呼び出しと同じ
・smalltalkで、メッセージと言っていたため
・メッセージと言う言葉にこだわる人もいるが、同じものである
・継承、オーバーライドとボリモフィズム
・継承
・クラスを元に別のクラスを作成すること
・ある製品の設計図を元に、別の製品の設計図を作成するようなもの
・継承する理由は、同じ処理を二重に実装しないため
・元のクラスを基底クラス(親クラス)、作成したクラスを派生クラス(子クラス)と言う
・例
・社員クラスを定義した、これを基底クラスとして、管理職クラス、一般社員クラス、契約社員クラスを派生クラスとして定義
・社員共通の処理は、社員クラスにのみ記述される
・オーバーライド
・継承で受け継いだメソッドを変更することができる
・すなわち基底クラスの動作を変更することができる
・例
・給与の計算方式が違うので、それぞれ給与計算メソッドをオーバーライドする
・ボリモフィズム
・継承されたクラスがあり、それぞれがあるメソッドをオーバーライドしている
・当該メソッドを呼び出したとき、それらの動作が異なることを言う
・呼び出し側は、動作が異なることを意識する必要はない
・蛇足(私見):
ボリモフィズムは、動作としては重要であるが、継承とオーバーライドを認めれば自然に実現されることであり、また実際の場面では「ここは、ボリモフィズムを使おう!」と意識することもないので、解説の必要はないと考えている
□ 参考資料
オブジェクト指向プログラミング
http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
オブジェクト指向できていますか?
http://www.slideshare.net/MoriharuOhzu/ss-14083300
オブジェクト指向
http://www.aerith.net/design/object-j.html
Javaのオブジェクト指向入門
http://www.kab-studio.biz/Programing/OOPinJava/
オブジェクト指向の基本概念
https://www.ogis-ri.co.jp/otc/hiroba/technical/concept.html
-----------------------------------------------------
・目次 Java システム開発
http://blogs.yahoo.co.jp/artery2020/40586660.html
・目次 - Java入門
http://blogs.yahoo.co.jp/artery2020/39975776.html
・目次 - ビジネスパーソンの常識と非常識
http://blogs.yahoo.co.jp/artery2020/39728331.html
・目次 - 論理・発想・思考についての考察と鍛え方
http://blogs.yahoo.co.jp/artery2020/39657784.html
-----------------------------------------------------