1.オブジェクト指向とは
旧来はC言語などの手続き型と言われる言語が使われていましたが、最近では、C++やJavaに代表されるオブジェクト指向型の言語が主流です。(ただし、Javaなどが非手続き型言語かというと、そうでもない)オブジェク ト指向型の利点は、ソフトウェア開発の効率化です。特に大規模化が進むと、カプセル化の概念で保守性が高まり、汎化や継承(インヘリタンス)などの概念で再利用がしやすくなります。
他の言語でもプログラムを部品化しますよね。
そうです。CだろうがVBだろうが、オブジェクト指向以外のプログラムでも、プログラムを部品化して効率的な開発、保守性を高めることをします。
このことは、オブジェクト指向でもできます。プログラムを関数として部品化します。ただ、オブジェクト指向では、関数による部品化をさらに進めて、クラスとインスタンス(後述)を作ります。クラスならではの特徴は、いくつかありますが、たとえば、関数(メソッド)だけでなく、データを持つことができます。特に、複雑なデータを持つ場合に有効になるでしょう。
応用情報のシラバスでは、オブジェクト指向設計に関して、次の記載があります。
④ オブジェクト指向設計 オブジェクト指向設計の考え方,手順,手法を理解する。 用語例 クラス,抽象クラス,スーパクラス,インスタンス,属性,メソッド,カプセル化,サブクラス,継承(インヘリタンス),部品化,再利用,クラス図,多相性,パッケージ,関連,派生関連,派生属性,コレクション,汎化,特化,分解,集約 |
オブジェクト指向モデルの特徴に関して過去問(H18秋FE午前問37 )では、「データは外部から隠ぺいされ,メソッドと呼ばれる手続によって間接的に操作される。プログラムは,データとメソッドをひとまとまりにしたものの集まりである。」とあります。
オブジェクト指向の本質を理解するのは結構難しいもので、書籍によっても違いが見えます。オブジェクト指向はあくまでも概念です。肩の力を抜いて、「そんなもんなんだ」くらいに理解するといいと思います。
まずは過去問(H16春SW午後Ⅰ問2)をみてみましょう。
問2 オブジェクト指向分析に関する次の記述を読んで,設問1~3に答えよ。 A君は缶飲料自動販売機のシステムを開発することになった。最初に,簡単なシナリオを記述し,そのシナリオを基にしてUML (Unified Modeling Language)のクラス図とシーケンス図を使って,システムのモデリングを行うことにした。 シナリオ: 缶飲料を購入する顧客は,自動販売機に対して入金口から入金する。入金されたお金は,自動販売機内のレジスタに入れられる。レジスタには,今までの売上も含めたお金が蓄えられている。自動販売機は,入金されるたびに,入金総額をインジケータに表示する。入金総額が缶飲料の価格に達すると,自動販売機は価格に達した缶飲料に対応する購入可能ランプを点灯する。顧客は自分が購入したい缶飲料のランプが点灯するまで,自動販売機に入金する。購入したい缶飲料のランプが点灯し,顧客がその缶飲料を購入するためのボタンを押すと,自動販売機は選択された缶飲料を商品口に置き,購入可能ランプを消灯し,インジケータの表示をOにする。つり銭がある場合には,レジスタから必要な金額のつり銭を出し,返却金口に戻す。 A君はこのシナリオを基に,初期モデルのクラス図(図1)とシーケンス図(図2)を作成した。 |
さて、ここでレジスタに注目しましょう。レジスタはスーパーのレジと考えてください。
レジスタ(「クラス」といいます)には、1000円や1500円といった「保持金額」というデータ(「属性」と言います)がありますね。加えて、利用者からお金が「入金」されたり、お釣りを返すために「出金」という処理(「メソッド(手続き)」と言います)があります。
このように、データと手続きをまとめたオブジェクト(この場合は「クラス」)単位で開発をすることがオブジェクト指向です。
【参考】
これまでは、プロセス中心アプローチやデータ中心アプローチが取られていました。
過去問(H22春IP問45)をもとに、言葉を整理します。
ソフトウェア開発で利用する手法 | 解説 |
プロセス中心アプローチ | 業務の処理手順に着目して,システム分析を実施する |
データ中心アプローチ | 対象とする業務をデータの関連に基づいてモデル化し,分析する |
オブジェクト指向 | データとデータに関する処理を一つのまとまりとして管理し,そのまとまりを組み合わせて開発する |
2.オブジェクト指向の過去問を解いてみよう
(1)H19春SW午後1
問2 オブジェクト指向分析設計に関する次の記述を読んで,設問1~3に答えよ。 E社では,株価の現在値と,変動の表示を定期的に行う,図1に示すようなシステム(以下,株価通知システムという)を開発することになった。株価通知システムには複数の株銘柄が登録されており,証券取引所から定期的に送信される最新の株価に基づき,株価通知システムの株価が株銘柄ごとに更新される。株価通知システムは,株銘柄ごとに表示時点の最新株価(現在値)を数値で,株価の変動の様子(値動き)をグラフで定期的に表示する。 なお,当初は現在値表示と値動き表示の二つの表示機能だけを提供するが,将来的には株価分析用チャート表示など,新たな形式での表示機能の追加が予定されている。 株価通知システムの開発を担当するF君は,次の設計方針に従い, UML (UnifiedModeling Language)のクラス図とシーケンス図を用いたシステムのモデリングを行うことにした。 〔設計方針〕 ・株価を保持する部分と,現在値や値動きなどの表示を行う表示部は,それぞれを個別のクラスとし,表示部には株価の値を保持しない。 ・すべての株銘柄は一つ以上の表示部と関連をもち, 1回の株価更新で各表示を更新できるようにする。将来の表示機能追加に備え,表示部との関連は任意個可能とする。 ・現在値表示や値動き表示などの表示機能に関しては,新たな形式の追加が予定されているので,適切な汎化を行い,部品化を図っておく。 F君は,一つの株銘柄に対する複数の表示機能を,株価の管理を行う株銘柄クラス(モデル),株価の表示を行う株価ビュークラス及びそのサブクラス(ビュー),株価の更新を制御する株価更新部クラス(コントローラ)の三つに分けて実装することにした。作成したクラス図を図2に示す。 株銘柄は,自身に依存するすべての株価ビューを,依存ビューの一覧としてもつ。株銘柄は,株価の変化に応じて,依存ビューの一覧に含まれるすべての株価ビューに対して表示を促すメッセージを送る。 株価ビューは,依存先の株銘柄を属性としてもつ。表示を促すメッセージを受けた株価ビューは,表示に必要な情報を依存先の株銘柄から取得し,表示を行う。 株銘柄と株価ビューの関連付けは,システム初期化部が関連付けのメッセージを送ることで行う。関連付けに関する処理のシーケンス図を図3に示す。また,定期的な株価更新と表示処理のシーケンス図を図4に示す。 株価通知システムをこのように設計することで,将来新たな形式の表示機能を追加 する場合,そのクラスを株価ビュークラスの[ a ]として実装し,そのインスタンスを対応する[ b ]クラスのインスタンスに依存ビューとして登録するだけでよい。[ b ]クラスでは,機能追加前と同じく,依存ビューの一覧に含まれるすべての株価ビューに対して表示の更新を促す処理を行うことによって,新たに追加された形式の表示についても適切に表示の更新が行われる。 この方針は,一般にMVC (Model-View-Controller)と呼ばれ,一つのモデルを複数のビューによって表示し,モデルの変化を,それを表示するすべてのビューに反映する必要がある場合に用いられる。これは,モデルとビューの[ c ],及びビュ-の汎化によって実現される。 |
設問1 次の(1),(2)について答えよ。 (1)本文中の[ a ],[ b ]に入れる適切な字句を答えよ。 (2)本文中の[ c ]に入れる適切な字句を解答群の中から選び,記号で答えよ。 解答群 ア 依存関係 イ 親子関係 ウ 包含関係 |
↓
↓
↓
↓
【正解】
a サブクラス
b 株銘柄
c ア