
オブジェクト指向とプログラム設計手法(UML)を徹底解説/応用情報・基本情報・情報Ⅰ
オブジェクト指向とプログラム設計手法(UML)
【資料ダウンロード】
PDFの他、パワーポイント、学習指導案 等の原本も無料提供しています。
情報教育の底上げが目的なので、資料を修正して、学校・塾(営利目的含む)の授業等で利用して頂いて問題ありません。私への連絡不要ですが、利用する際には、YouTubeチャンネル・情報Ⅰ動画教科書・IT用語動画辞典を紹介してもらえると嬉しいです。
■PowerPoint資料
https://toppakou.com/info1/download/36_A_オブジェクト指向プログラミング/36_A_オブジェクト指向プログラミング.pptx
■簡易学習指導案
https://toppakou.com/info1/download/36_A_オブジェクト指向プログラミング/【学習指導案】36_A_オブジェクト指向プログラミング.docx
【文字おこし】
今回は、オブジェクト指向とプログラムの設計手法について説明していきます。
はじめに1台の車を思い浮かべてみてください。
その車の色は何ですか?
メーカーはどこの車ですか?
車種は普通車ですか?トラックですか?バスですか?
その車にはアクセルやブレーキなどどのような機能がありますか?
ありがとうございます。
私が思い浮かべたのは
メーカーはトヨタ
色は赤
車種は普通車
機能は発進する機能、停止する機能、ハンドル機能です。
私と全く同じ人は少ないと思います。
今話したように一言に車と行っても、色やメーカーや車種などで色んな種類があります。
でも、メーカー、色、車種という属性や発進する、停止する等の処理としては全部の車に共通しますよね。
ということは、メーカー、色、車種はまだ未定だけどそれを入れられる領域と
発進する、停止する等の処理 の車に共通する性質を保持する設計書の様なものがあれば、
皆さんにイメージしてもらったように多種多様な車が簡単に作成できます。
この設計書をもとに生成された車のことをインスタンスやオブジェクトと言います。
オブジェクト指向は、このようにメーカーや色などのデータの属性 と 処理 を一つにまとめた概念になります。
オブジェクトの属性やその値をプロパティと言います。
発進するや停止する等の処理のことをメソッドと言います。
オブジェクトの生成のもととなるオブジェクトの性質を定義した設計書の様なものを、クラスと言います。
車クラスから2台の車オブジェクトを生成していきます。
オブジェクト生成時に名前を決めることができます。
これをオブジェクト名やインスタンス名と言います。
1台目をがっきーの車、2台目をミライの車 というオブジェクト名にします。
1台目のがっきーの車は
メーカー:トヨタ
色:青
車種:普通車
とします。
メソッドは車クラスの発信する機能などがそのまま使えます。
2台目のミライの車は
メーカー:ニッサン
色:オレンジ
車種:普通車
とします。
車クラスから2台の車を作成しましたが、この行為をインスタンス化やオブジェクトの生成と言います。
車種やメーカーなどの属性や発進する、停止するの処理は、カプセルの中に入っているようにひとまとまりになっています。車を使う人にとっては、どのような論理で車が走るのか、停止するのか、データがどんなふうに管理されているのかは必要なく、アクセル踏めば走れば良いですよね。
このように、データとメソッドをオブジェクトに纏めて、オブジェクト内部の状態や構造は隠蔽し、外から見て必要な情報や手続き(処理・メソッド)のみを提供することをカプセル化と言います。
メソッドの呼び出しは、オブジェクト名.メソッド名というように指定すれば呼び出されます。
たとえば、がっきーの車を発進させたければ、がっきーの車.発進する機能 というように呼び出せば、ガッキーの車のオブジェクトだけが発進します。
最高速度の属性を追加してみます。
がっきー車は時速80キロ、ミライ車は時速200キロとします。
最高速度で発信というメソッドを呼び出した場合、オブジェクト毎に速度が違うつまり違うふるまいをします。
このように同じメソッドを呼び出しても、オブジェクト毎に振る舞いが異なることを多態性(たたいせい)やポリモーフィズムといいます。
―――
今は1つのクラスで説明しましたが。
クラスには継承という概念があります。
継承とはその名の通り定義されているクラスのプロパティやメソッドを別のクラスに引き継ぐことができます。
たとえば、哺乳類という大きなクラスがあったとします。
哺乳類に共通するプロパティは目の色、毛の色 などがあります。
メソッドとしては食べる、歩く などがあります。
このクラスを継承して
人間クラスと犬クラスを作ります。
哺乳類クラスのものは引き継げているので、人間だけに存在する 話す や 仕事するのメソッドを追加することが可能になります。
犬クラスも犬だけで存在するしっぽの太さのプロパティや吠えるなどのメソッドを追加することができます。
上位クラスをスーパークラス、継承先の下位クラスをサブクラスといいます。
このように下位のクラスがもつ共通の特性を抽出して、上位クラスとして定義することを汎化といいます。
逆に、抽象的な上位のクラスをより具体的なクラスとして定義することを特化といいます。
この汎化と特化はis a 関係とも言います。
言い換えると 人間クラス is a 哺乳類 クラスの関係にあるという意味になります。
――
他には集約と分解と呼ばれるpart of関係というものがあります。
たとえば先ほど車のクラス1つで説明しましたが、車は例えば、エンジンやタイヤやハンドルと言った部品で分解することが可能です。それをそれぞれクラスとして定義することもできます。
つまり下位クラスは上位クラスの一部であるという関係で、下位クラスは上位クラスの性質を分解して定義したものになります。
逆に上位クラスは複数の下位クラスを集約して定義したものになります。
タイヤは車のパーツという意味で
タイヤ part of 車 から part of関係と言ったりします。
ここまで、一般的に分かりやすいといわれる入門書などをベースとしたオブジェクト指向の概要を話してきました。
大半の人が、いったい何の役に立つんだ、ただややこしいだけと思っていると思います。
私自身、長年オブジェクト指向を利用した大規模システム設計に携わっていました。
実際に設計に携わる中でオブジェクト指向の凄さというのを体験しました。
実際の業務でどのようなイメージで設計していたかを簡単に説明します。
■
たとえば皆さんが持っているスマートフォンは家電量販店やauやNTTドコモやソフトバンクの様なショップで購入したと思います。
このような携帯電話会社の場合どのようなクラスが必要か考えてみましょう。
まず、契約者に関する情報が必要なので契約者クラスとします。
氏名や生年月日などが存在します。
そして、スマートフォンの端末クラスが存在します。
機種や機器固有の製造番号が存在します。
携帯電話には料金プランやオプションサービスが存在します。
それをサービスクラスとし、サービスの種類が存在します。
たとえば、太郎君がスマートフォンを購入した場合
契約者クラスから太郎君用のオブジェクトが生成され氏名に太郎、太郎君の生年月日が設定されます。
端末オブジェクトに太郎君の買った機種、製造番号、そして加入したサービスの分、サービスオブジェクトが作られます。
花子さんが同じタイミングでスマートフォンを購入した場合も、同様に花子さん用のオブジェクトが生成されます。
多くの場合、オブジェクトに設定されたプロパティ情報はデータベースに登録されます。
数年経過し太郎君が機種変更をしたい場合は、データベースからデータを取得し、太郎君のオブジェクトを再生成し、端末オブジェクトの情報を書き換えたりします。
今は太郎君と花子さん2名の話でしたが、スマートフォンのユーザは数千万人になります。
数千万人の場合でも、契約者クラスも端末クラスもサービスクラスも1つだけで済みます。
このオブジェクト指向はシステム開発の効率化や役割分担の明確化という面でも役に立ちます。
以前、IT業界の真実の動画でも話しましたが、携帯電話会社の様な大規模システム開発の場合は、数百社のシステム会社が多重構造でかかわっています。
契約者クラスはA社とその協力会社担当
端末クラスはB社とその協力会社担当 と言ったように 機能実装の役割分担がやりやすいメリットがあります。
また、システムトラブルのニュースをよく耳にすると思いますが、世の中にリリースした後もシステムにはトラブルがつきものです。
トラブルは0にするのは難しく、トラブルが起こった場合、いかに早く、迅速に対応するかという運用体制の構築が重要になってきます。
このように役割分担しておけば、仮に端末クラスの機能でエラーが発生した場合
まずはB社に調査してもらうことができます。
調査次第では必要に応じて、他の契約者クラスやサービスクラスの会社にB社から調査依頼したりします。
システム業界=プログラミング=1人で黙々と行うイメージがある人も多いと思いますが、
ある程度のシステム規模の開発は、打合せも多くチームワークが何よりも重要になってきます。
――――――――――――
次にプログラムの設計手法の概要について説明します。
システム開発では、PythonやJavaScriptなどのプログラミング言語でプログラミングを行う前には、プログラムの流れなどを説明した設計が行われます。
そのアルゴリズムの記述には以前説明したフローチャートや状態遷移図や状態遷移表などがよく使われます。
しかし、複数の処理を同時に実行したり、ユーザの操作に応じて処理を実行したりする複雑な処理を表現するには必ずしも適しているとは言えません。
このような場合にUMLという統一モデリング言語が使われることが多いです。
UMLはデータの構造や処理の流れなどソフトウェアに関連する様々な設計や機能を図示するための表記を定めたものです。
UMLで規定されている図をダイアグラムといい、全部で13種類あります。
ただ、13種類全部使っているシステム開発現場は私自身は見たことはありません。
そのシステム開発プロジェクトに適したものを取捨選択しています。
概要だけになりますが、13種類を簡単に説明します。
UMLは、大きく 構造を表す構造図とふるまいを表すふるまい図にわかれます。
構造図は
クラス図、オブジェクト図、パッケージ図、コンポーネント図、複合構造図、配置図 があります。
クラス図は、クラスの定義や関連付けなどクラス構造を表します。
オブジェクト図は、クラスを実体化させるインスタンスの具体的な関係をあらわします。
パッケージ図は、クラスなどがどのようにグループ化されているかをあらわします。
コンポーネント図は 処理を構成する複数のクラスを1つのコンポーネントとみなし、その内部構造と相互の関係をあらわします。
複合構造図は、複数クラスを内包するクラスやコンポーネントの内部構造をあらわします。
配置図は、システムを構成する物理的な構造をあらわします。
次に振る舞い図は、
ユースケース図
アクティビティ図
状態遷移図
シーケンス図
コミュニケーション図
相互作用概要図
タイミング図 があります。
ユースケース図は、システムの利用者や外部システムからの要求に対して、システムがどのようにふるまいをするかを表します。
アクティビティ図は、システム実行時における、一連の処理の流れや状態遷移を表します。フローチャートと同じようなものと考えてください。
状態遷移図は、イベントによっておこる、オブジェクトの状態遷移を表します。
シーケンス図は、オブジェクト間のやり取りを、時系列に沿って表します。私の経験上、このシーケンス図はほとんどのシステム開発プロジェクトで利用していました。
コミュニケーション図は、オブジェクト間の関連と、そこで行われるメッセージのやり取りを表します。
相互作用概要図はユースケース図やシーケンス図などを構成要素として、より大枠の処理の流れを表します。
タイミング図はオブジェクトの状態遷移を時系列で表します。
今回のオブジェクト指向とプログラム設計についての授業は以上になります。
最後までご視聴ありがとうございました。
【解説重要用語】
インスタンス、オブジェクト、オブジェクト指向、プロパティ、クラス、メソッド、カプセル化、メッセージ、多態性・ポリモーフィズム、クラスの継承、is-a関係、汎化・特化、集約と分解、part of関係クラス図、オブジェクト図、パッケージ図、コンポーネント図、複合構造図(コポジット構造図)、配置図、ユースケース図、アクティビティ図、状態遷移図(状態マシン図)、シーケンス図、コミュニケーション図、相互作用概要図、タイミング図、UML(統一モデリング言語)
★私の目標
「とある男が授業をしてみた」 の葉一さん
https://www.youtube.com/user/toaruotokohaichi
※Google社に招待頂いた、「YouTube教育クリエイターサミット2020」で
葉一さんと文部科学省・Google役員の対談セッションに感銘を受けて、高校情報講座スタートしています。
【参考サイト・参考文献】
文部科学省 「情報Ⅰ」教員研修用教材
https://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1416756.htm
詳細(情I703 高校情報I Python)|情報|高等学校 教科書・副教材|実教出版 (jikkyo.co.jp) 検定通過版
https://www.jikkyo.co.jp/book/detail/22023322
令和4年度新版教科書「情報Ⅰ」|高等学校 情報|日本文教出版 (nichibun-g.co.jp)検定通過版
https://www.nichibun-g.co.jp/textbooks/joho/2022_joho01_1/textbook/