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

 

1.オブジェクト指向とは

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

f:id:mamori_yuto:20181027120253j:plain他の言語でもプログラムを部品化しますよね。

そうです。CだろうがVBだろうが、オブジェクト指向以外のプログラムでも、プログラムを部品化して効率的な開発、保守性を高めることをします。

このことは、オブジェクト指向でもできます。プログラムを関数として部品化します。ただ、オブジェクト指向では、関数による部品化をさらに進めて、クラスとインスタンス(後述)を作ります。クラスならではの特徴は、いくつかありますが、たとえば、関数(メソッド)だけでなく、データを持つことができます。特に、複雑なデータを持つ場合に有効になるでしょう。


応用情報のシラバスでは、オブジェクト指向設計に関して、次の記載があります。

オブジェクト指向設計
オブジェクト指向設計の考え方,手順,手法を理解する。

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


オブジェクト指向モデルの特徴に関して過去問(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)をもとに、言葉を整理します。

ソフトウェア開発で利用する手法 解説
プロセス中心アプローチ 業務の処理手順に着目して,システム分析を実施する
データ中心アプローチ 対象とする業務をデータの関連に基づいてモデル化し,分析する
オブジェクト指向 データとデータに関する処理を一つのまとまりとして管理し,そのまとまりを組み合わせて開発する

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 ア

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

1.汎化と特化(is-a)

・過去問(H28秋FE午前問47)では、汎化に関して、「クラス間に共通する性質を抽出し,基底クラスを作ること」と述べています。
・H22年NW午前Ⅱ問24を参考にすると
  is-aの例が「人間と動物」「辞書と書物」 
  part-ofの例が「タイヤと自動車」

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

そして、正解選択肢として「”バス”,“トラック”などのクラスの共通部分を抽出して,“自動車"のクラスとして定義することを,汎化という。」とあります。
この逆が特化です。 ※あとで図で記載(↑が汎化、↓が特化)
また、汎化と特化の関係にある上位のクラスをスーパークラス、下位のクラスをサブクラスと言います。
スーパークラス、サブクラスの関係をは、矢印の先端が△(三角)になります。参考ですが、次の集約と分解のときは、◇(ひし形)を使います。

2.集約と分解(part-of)

過去問(平成29年春AP午前問47)をみてみましょう。
問47 汎化の適切な例はどれか。
問47





【正解】ア
 これが汎化です。下向きは特化です。

では、集約と分解(part of)の関係はどれでしょうか。選択肢イです。この上向きが集約で、下向きが分解です。 自動車は、アクセルやブレーキ、ハンドルなどに分解されるからです。
集約と分解の関係を図にするときは、◇(ひし形)を使うことがあります。

 

1.オブジェクト指向に関する用語

①クラス

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

②インスタンス

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

◆クラスとインスタンスに関してもう少し
・クラスはひな形と思ってもいいでしょう。
・クラスとインスタンスの例ですが、(一例でしかありませんが)
たとえば、整数型(INT)、文字型(String)もクラスと考えられる。
概念なので、いろいろな例を見ながら深めるといいでしょう。

クラス    インスタンス
--------------------------------
INT     1、2、10
String    abc、こんちくは

Pythonで以下を実行してみる。これを見ると、INTという型に、9というインスタンス、Stringという型に、abcが入っていることがわかる。

>>> type(9)
<class 'int'>  #INTのクラス
>>> type('abc')
<class 'str'>  #Stringのクラス

簡単に実行するなら、以下のWebサイトで。
https://paiza.io/ja

print(type(9))
print(type('abc'))
print(type(1.25))
x=[1,2,3]
print(type(x))
y={'English': 70, 'Math': 40, 'Science': 80}
print(type(y))

結果は以下のように表示されます。
<class 'int'>
<class 'str'>
<class 'float'>
<class 'list'>
<class 'dict'>

◆インスタンスとオブジェクト
厳密にいうとややこしいが、オブジェクトには、データと手続き(メソッド)が入っている。
クラスは概念なので、実体はない。
インスタンスには、実際のデータや手続きがある。乱暴ではあるが、最初のうちは、オブジェクト=インスタンスと考えておくと、気持ちが楽になるかと思う。(理解する方法としては、そう間違っていない)

③メソッド

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

■具体例をみてみよう。
(例)Pythonで実行
LIST型のクラス(あらかじめ定義されている)から、インスタンスとして、dataとして数字を入れてみる。
具体的には、[1,2,3,4,5]。これが、オブジェクトとしてのデータ
でもある。
メソッドは、LIST型クラスには、あらかじめいくつか用意されている。たとえば、popというメソッドはLISTの最後の数字を取り出す。

以下、実行例
data = [1,2,3,4,5] # インスタンスとして実体を作る
print(type(data))  # 型は何かを聞くコマンド
print(data.pop())
→結果
<class 'list'> #LISTの型(クラス)であることがわかる
5 #popの手続きによって、5が取り出される。

 ④カプセル化

・過去問(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)
問18 図において,“営業状況を報告してください"という同じ指示(メッセージ)に対して,営業課長と営業担当者は異なる報告(サービス)を行っている。オブジェクト指向で,このような特性を表す用語はどれか。
polimofizumu
・営業部長が,営業課長と営業担当者ぺ営業状況を報告してください"という指示を送る。
・営業課長が,課全体の売上目標,売上実績の報告を応答する。
・営業担当者が,本人の売上目標,売上実績,担当顧客状況の報告を応答する。

ア カプセル化     ウ 抽象化
イ 継承         エ ポリモーフィズム
■オーバーライド
オブジェクト指向では、スーパークラスのメソッドはサブクラスでも継承されます。継承せずにメソッドを再定義することをオーバーライドと言います。
過去問では、「多相性を実現するためのオーバーライドの説明」として、「スーパークラスで定義されたメソッドをサブクラスで再定義すること(H29秋FE午前問7)」とあります。参考ですが、他相性はポリモルフィズムのことです。
また、似たような言葉にオーバーロードがあります。こちらは、「同一クラス内に,メソッド名が同一で,引数の型,個数,並び順が異なる複数のメソッドを定義すること(H29秋FE午前問7不正解選択肢)」です。
11

過去問(H29秋FE午前)
問7 オブジェクト指向プログラミングにおける,多相性を実現するためのオーバーライドの説明はどれか。
ア オブジェクト内の詳細な仕様や構造を外部から隠蔽すること
イ スーパークラスで定義されたメソッドをサブクラスで再定義すること
ウ 同一クラス内に,メソッド名が同一で,引数の型,個数,並び順が異なる複数のメソッドを定義すること
エ 複数のクラスの共通する性質をまとめて,抽象化したクラスを作ること



正解は、イです。

⑦汎化(is-a)、集約(is-part-of)

こちらを参照してください。
http://sm.seeeko.com/archives/15876917.html

2.オブジェクト指向に関する用語の過去問を解いてみよう

(1)H27秋SA午前Ⅱ

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





【正解】エ

(2)H28秋AP午前問47

問47 オブジェクト指向言語のクラスに関する記述のうち,適切なものはどれか。

ア インスタンス変数には共有データが保存されているので,クラス全体で使用できる。
イ オブジェクトに共通する性質を定義したものがクラスであり,クラスを集めたものがクラスライブラリである。
ウ オブジェクトはクラスによって定義され,クラスにはメソッドと呼ばれる共有データが保存されている。
エ スーパクラスはサブクラスから独立して定義し,サブクラスの性質を継承する。





【正解】イ

↑このページのトップヘ