応用情報処理技術者試験の対策サイトです。 応用情報処理技術者試験の午前問題を中心とした基礎用語の解説を中心に掲載します。書き始めたばかりなので、内容はまだまだ不十分です。
カテゴリ:

8.システム開発 > 8.4 オブジェクト指向

旧来はC言語などの手続き型と言われる言語が使われていましたが、最近では、C++やJavaに代表されるオブジェクト指向型の言語が主流です。
オブジェク ト指向型の利点は、ソフトウェア開発の効率化です。特に大規模化が進むと、カプセル化の概念で保守性が高まり、汎化や継承(インヘリタンス)などの概念で再利用がしやすくなります。

応用情報のシラバスでは、オブジェクト指向設計に関して、次の記載があります。
オブジェクト指向設計
オブジェクト指向設計の考え方,手順,手法を理解する。

用語例 クラス,抽象クラス,スーパクラス,インスタンス,属性,メソッド,カプセル化,サブクラス,継承(インヘリタンス),部品化,再利用,クラス図,多相性,パッケージ,関連,派生関連,派生属性,コレクション,汎化,特化,分解,集約

オブジェクト指向モデルの特徴に関して過去問(H18秋FE午前問37 )では、「データは外部から隠ぺいされ,メソッドと呼ばれる手続によって間接的に操作される。プログラムは,データとメソッドをひとまとまりにしたものの集まりである。」とあります。

オブジェクト指向の本質を理解するのは結構難しいもので、書籍によっても違いが見えます。オブジェクト指向はあくまでも概念です。肩の力を抜いて、「そんなもんなんだ」くらいに理解するといいと思います。

まずは過去問(H16春SW午後橘2)をみてみましょう。
問2  オブジェクト指向分析に関する次の記述を読んで,設問1〜3に答えよ。
 A君は缶飲料自動販売機のシステムを開発することになった。最初に,簡単なシナリオを記述し,そのシナリオを基にしてUML (Unified Modeling Language)のクラス図とシーケンス図を使って,システムのモデリングを行うことにした。
シナリオ:
缶飲料を購入する顧客は,自動販売機に対して入金口から入金する。入金されたお金は,自動販売機内のレジスタに入れられる。レジスタには,今までの売上も含めたお金が蓄えられている。自動販売機は,入金されるたびに,入金総額をインジケータに表示する。入金総額が缶飲料の価格に達すると,自動販売機は価格に達した缶飲料に対応する購入可能ランプを点灯する。顧客は自分が購入したい缶飲料のランプが点灯するまで,自動販売機に入金する。購入したい缶飲料のランプが点灯し,顧客がその缶飲料を購入するためのボタンを押すと,自動販売機は選択された缶飲料を商品口に置き,購入可能ランプを消灯し,インジケータの表示をOにする。つり銭がある場合には,レジスタから必要な金額のつり銭を出し,返却金口に戻す。
A君はこのシナリオを基に,初期モデルのクラス図(図1)とシーケンス図(図2)を作成した。

a
 
b

さて、ここでレジスタに注目しましょう。レジスタはスーパーのレジと考えてください。
レジスタ(「クラス」といいます)には、1000円や1500円といった「保持金額」というデータ(「属性」と言います)がありますね。加えて、利用者からお金が「入金」されたり、お釣りを返すために「出金」という処理(「メソッド(手続き)」と言います)があります。
このように、データと手続きをまとめたオブジェクト(この場合は「クラス」)単位で開発をすることがオブジェクト指向です。

a




 

 

【参考】
これまでは、プロセス中心アプローチやデータ中心アプローチが取られていました。
過去問(H22春IP問45)をもとに、言葉を整理します。
ソフトウェア開発で利用する手法 解説
プロセス中心アプローチ 業務の処理手順に着目して,システム分析を実施する
データ中心アプローチ 対象とする業務をデータの関連に基づいてモデル化し,分析する
オブジェクト指向 データとデータに関する処理を一つのまとまりとして管理し,そのまとまりを組み合わせて開発する

汎化(is-a)という概念と、集約(is-part-of)という2つの概念があります。
試験では、前者の汎化が中心に問われます。

汎化と特化

・H22年NW午前玉24を参考にすると
  is-aの例が「人間と動物」「辞書と書物」 
  part-ofの例が「タイヤと自動車」

過去問(H19秋SD午前問12)では、オブジェクト指向において階層クラスを定義した図が記載されています。
a

そして、正解選択肢として「”バス”,“トラック”などのクラスの共通部分を抽出して,“自動車"のクラスとして定義することを,汎化という。」とあります。
この逆が特化です。 ※あとで図で記載(↑が汎化、↓が特化)

集約と分解
過去問(平成29年春AP午前問47)をみてみましょう。
問47 汎化の適切な例はどれか。
問47
正解はアです。これが汎化です。下向きは特化です。

注目は、選択肢イです。この上向きが集約で、下向きが分解です。 自動車は、アクセルやブレーキ、ハンドルなどに分解されるからです。

ああああ
問2 オブジェクト指向分析設計に関する次の記述を読んで,設問1〜3に答えよ。
E社では,株価の現在値と,変動の表示を定期的に行う,図1に示すようなシステム(以下,株価通知システムという)を開発することになった。株価通知システムには複数の株銘柄が登録されており,証券取引所から定期的に送信される最新の株価に基づき,株価通知システムの株価が株銘柄ごとに更新される。株価通知システムは,株銘柄ごとに表示時点の最新株価(現在値)を数値で,株価の変動の様子(値動き)をグラフで定期的に表示する。
なお,当初は現在値表示と値動き表示の二つの表示機能だけを提供するが,将来的には株価分析用チャート表示など,新たな形式での表示機能の追加が予定されている。

オブジェクト指向
株価通知システムの開発を担当するF君は,次の設計方針に従い,  UML (UnifiedModeling Language)のクラス図とシーケンス図を用いたシステムのモデリングを行うことにした。

〔設計方針〕
・株価を保持する部分と,現在値や値動きなどの表示を行う表示部は,それぞれを個別のクラスとし,表示部には株価の値を保持しない。
・すべての株銘柄は一つ以上の表示部と関連をもち, 1回の株価更新で各表示を更新できるようにする。将来の表示機能追加に備え,表示部との関連は任意個可能とする。
・現在値表示や値動き表示などの表示機能に関しては,新たな形式の追加が予定されているので,適切な汎化を行い,部品化を図っておく。
F君は,一つの株銘柄に対する複数の表示機能を,株価の管理を行う株銘柄クラス(モデル),株価の表示を行う株価ビュークラス及びそのサブクラス(ビュー),株価の更新を制御する株価更新部クラス(コントローラ)の三つに分けて実装することにした。作成したクラス図を図2に示す。
株銘柄は,自身に依存するすべての株価ビューを,依存ビューの一覧としてもつ。株銘柄は,株価の変化に応じて,依存ビューの一覧に含まれるすべての株価ビューに対して表示を促すメッセージを送る。
株価ビューは,依存先の株銘柄を属性としてもつ。表示を促すメッセージを受けた株価ビューは,表示に必要な情報を依存先の株銘柄から取得し,表示を行う。
株銘柄と株価ビューの関連付けは,システム初期化部が関連付けのメッセージを送ることで行う。関連付けに関する処理のシーケンス図を図3に示す。また,定期的な株価更新と表示処理のシーケンス図を図4に示す。
株価通知システムをこのように設計することで,将来新たな形式の表示機能を追加
する場合,そのクラスを株価ビュークラスの[  a  ]として実装し,そのインスタンスを対応する[  b  ]クラスのインスタンスに依存ビューとして登録するだけでよい。[  b  ]クラスでは,機能追加前と同じく,依存ビューの一覧に含まれるすべての株価ビューに対して表示の更新を促す処理を行うことによって,新たに追加された形式の表示についても適切に表示の更新が行われる。
この方針は,一般にMVC (Model-View-Controller)と呼ばれ,一つのモデルを複数のビューによって表示し,モデルの変化を,それを表示するすべてのビューに反映する必要がある場合に用いられる。これは,モデルとビューの[  c  ],及びビュ-の汎化によって実現される。
ああ

クラス
・過去問(H21秋AP午前問44)では、「同一のデータ構造と同一の手続をもつオブジェクトをまとめて表現する」という選択肢がありますが、こうやってできたものがクラスと言えます。
・過去問(H28秋AP午前問47)ではオブジェクト指向言語のクラスに関して、「オブジェクトに共通する性質を定義したものがクラスであり,クラスを集めたものがクラスライブラリである。」とあります。

インスタンス
インスタンス(instance)は実例という意味です。
過去問(H22秋FE午前問47)では、「オブジェクト指向におけるクラスとインスタンスとの関係」に関して、「クラスの定義に基づいてインスタンスが生成される」とあります。また、「一つのクラスに対して,複数のインスタンスが対応(選択肢ウを改編)」します。
小さなプログラムの場合は、クラスとインスタンスが同じこともあります。しかし、一般的には分けて考えましょう。たとえば、自動車というクラスの中に、その具体的な例(インスタンス)である、日産マーチやトヨタのクラウンがあります。

メソッド
過去問(H25秋FE午前問48)では、メソッドに関して、「オブジェクト指向開発において,オブジェクトのもつ振る舞いを記述したもの」とあります。

カプセル化
・過去問(H28秋FE午前問47)では、「オブジェクト指向におけるカプセル化」に関して、「データとそれを操作する手続を一つのオブジェクトにして,データと手続の詳細をオブジェクトの外部から隠蔽すること」と述べています。
・過去問(H22秋FE午前問46)ではカプセル化に関して「オブジェクト指向において,属性と振る舞いを一つにまとめた構造にすること」と述べています。

応用情報技術者試験を勉強する成子
なぜカプセル化するのですか?
なにかメリットでもありますか?
過去問をベースに利点および効果を紹介します。
・過去問(H21秋FE午前問46)では、「オブジェクト指向でシステムを開発する場合のカプセル化の効果」として、「オブジェクトの内部データ構造やメソッドの実装を変更しても、ほかのオブジェクトがその影響を受けにくい。」とあります。
・過去問(H26春FE午前問47)では、カプセル化に関して、「オブジェクト指向に基づく開発では,オブジェクトの内部構造が変更されても利用者がその影響を受けないようにすることができ,それによってオブジェクトの利用者がオブジェクトの内部構造を知らなくてもよいようにすることができる。これを実現するための概念を表す用語」とあります。

つまり、保守性が高まることが効果の一つです。

インヘリタンス(継承)
過去問(H28秋FE午前問47)では、インヘリタンス(継承)に関して、「基底クラスの性質を派生クラスに受け継がせること」と述べています。
「オブジェクト指向の概念で,上位のクラスのデータやメソッドを下位のクラスで利用できる性質(H22秋SA午前2問6)」
「基底クラスで定義したデータ構造と手続をサブクラスで引き継いで使用する(H21秋AP午前問44)。」とあります。

その利点として、過去問(H19秋FE午前問44)では、「継承という概念によって,モデルの拡張や変更の際に変更部分を局所化できる」とあります。

ポリモーフィズム(多様性)
ポリモーフィズム、ポリモルフィズムと読むこともあるが、情報処理試験の言葉に合わせます。
ポリモーフィズムの例(H18共通 午前18)
porimo
汎化(is-a)、集約(is-part-of)
・H22年NW午前玉24を参考にすると
  is-aの例が「人間と動物」「辞書と書物」 
  part-ofの例が「タイヤと自動車」
・汎化の反対は特化
・過去問(H28秋FE午前問47)では、汎化に関して、「クラス間に共通する性質を抽出し,基底クラスを作ること」と述べています。

過去問
H27秋SA午前
問4 オブジェクト指向設計における設計原則のうち,開放・閉鎖原則はどれか。
ア クラスにもたせる役割は一つだけにするべきであり,複数の役割が存在する場合にはクラスを分割する。
イ クラスを利用するクライアントごとに異なるメソッドが必要な場合は,インタフェースを分ける。
ウ 上位のモジュールは,下位のモジュールに依存してはならない。
エ モジュールの機能には,追加や変更が可能であり,その影響が他のモジュールに及ばないようにする。

正解は、エ

このページのトップヘ