【C# WPF】WPFを理解したいC#初心者の話【オブジェクト指向編2】

C# WPFについて学んでいく過程を備忘録として残して置きたいと思います。

1. オブジェクト指向について


前回はオブジェクト指向について、基本的な概念の部分や特徴についてをまとめました。

ですが、オブジェクト指向を理解するにはまだまだ必要な知識がありそうだと感じたので、今回はオブジェクト指向プログラミングのメリットやデメリットなどを中心としてまとめていこうと思います。

2. オブジェクト指向のメリットは?

まずはオブジェクト指向プログラミングを行うメリットをいくつか挙げてみます。


・複数人開発の効率が高い

・作業効率が高い

・保守性の高いプログラミングが可能

・メモリ使用量を抑えられる

2-1. 複数人開発の効率が高い

オブジェクト指向では、共通の性質をもつモノをオブジェクトとして扱い、切り分けながらプログラミングを行うことができます。

また、前回オブジェクト指向の4大要素として挙げた中でも特に「カプセル化」と「抽象化」を取り入れることによって、別の人がプログラミングしたコードのすべてを理解する必要なく、そのコードを通じて情報のやり取りや処理を安全に行うことができます。


適切な設計を行うことで、オブジェクトの使い方がわかりやすくなり、既存のコードの可読性も高めることができます。

2-2. 作業効率が高い

オブジェクト指向のプログラミングの中でも「継承」と「ポリモーフィズム」の機能を活かすことで、効率の良いプログラミングを行うことができます。


例えばゲームを作るとき、ゲームの中に登場する様々なキャラクターを作る必要があります。

プレイヤーが操作するプレイヤーキャラクターや敵キャラクター、敵キャラクターも1種類では物足りませんから、様々な種類のキャラクターを作る必要があります。


そんな時、どのキャラクターにも共通する「体力」や「移動する」「攻撃する」といった処理をスーパークラスで作成しておき、プレイヤーキャラクターか敵キャラクターかで異なる部分はサブクラスで追加、あるいは処理をオーバーライドして再定義することで、コードを書く量は格段に減らすことができます。

2-3. 保守性の高いプログラミングが可能

ソフトウェア開発を行うにあたって必ず直面する問題があります。

それが修正作業です。予期しないエラーであったり、想定通りにプログラミングした結果が気に入らなかったりと、修正作業を行わなければならない場面というのは必ず存在します。


オブジェクト指向のプログラミングをうまく活用することで、厄介な修正作業を効率的かつ効果的に行うことが可能になります。

ここでは主に「継承」と「カプセル化」の機能が活きてきます。


オブジェクト指向に基づいた設計とプログラミングを行っている場合、様々な機能はオブジェクト毎に切り分けられていると思います。

各オブジェクトのデータの操作や処理もオブジェクトにまとめられているはずです。

例えばエラーが発生したタイミングで動作を行ったオブジェクトを特定できれば、そこから原因の究明につながります。

先ほどの例えを使えば、もし修正したい内容がキャラクターの「移動する」という基本的な挙動だった場合で考えることができます。

もしオブジェクト指向プログラミングを行っていなかった場合、最悪のパターンではプレイヤーキャラクターやバリエーションを様々に増やした敵キャラクターすべての「移動する」という挙動を、ひとつひとつ修正することになります。

これでは手間がかかりますし、修正漏れが怖いですね。

一方、オブジェクト指向プログラミングを適切に行えていれば、スーパークラスである「キャラクター」の「移動する」という挙動ひとつを修正するだけで、それを継承して利用するほとんどのサブクラスの修正まで完了してしまいます。


このように保守性の高いプログラミングを行うことができます。

2-4. メモリ使用量を抑えらえる

オブジェクト指向のプログラミングでは、必要に応じてメモリ使用量を抑えることが可能です。

クラスの設計を見直すことで、不要な属性の継承をしないようなつくりを行ったり、インスタンスの生成をうまくコントロールすることでメモリの使用量を抑えることにつなげます。

3. オブジェクト指向のデメリットは?


オブジェクト指向プログラミングもいいことばかりではありません。

デメリットを簡単に挙げていきます。

・コードが複雑になりやすい
・習得の難易度が高い

3-1. コードが複雑になりやすい

オブジェクト指向のプログラミングでは、様々な処理をオブジェクトを通じてコーディングしていくことになります。

ですので、実際にプログラミング作業を行う前にしっかりとした設計を行うことや、プログラミングでオブジェクトを追加する際にもコードの理解や仕組みの理解が必要になってきます。


オブジェクト指向プログラミングで登場する様々なクラスの処理について、作っていくうちにほとんど同じ処理を行うクラスが作られてしまうことがあります。

この場合、オブジェクト指向でないプログラミングであれば後からでも処理を一つにまとめることが可能です。

しかしオブジェクト指向プログラミングの場合は、あとから処理を一つにまとめて共通化することは難しくなってしまいます。


そういった無駄なコードにならないように事前の設計やコーディングに際しての知識が必要ですが、開発中にどうしてもそうせざるを得ない状況になってしまった場合にコードが複雑になりやすいというデメリットを抱えています。

3-2. 習得の難易度が高い

オブジェクト指向プログラミング最大のデメリットとしてよく挙げられるのが習得の難易度の高さです。

オブジェクト指向プログラミングを行うにあたって、当然コーディングの知識や技術が必要になってきますが、もっと重要になってくる設計で苦労する場面が多いのではないでしょうか。


オブジェクト指向プログラミングの4大要素である「カプセル化」「抽象化」「継承」「ポリモーフィズム」への理解と、それを効率よく活かすことのできる設計を行えるかどうかが、今回オブジェクト指向プログラミングのメリットとしてあげた要素を引き出すことに大きく関わってきます。

オブジェクト指向プログラミングはコードとオブジェクト指向の概念を理解したプログラムを書くことと、オブジェクトの設計をうまくできることで最大の効果を発揮するので、かなり奥が深いと感じます。


オブジェクト指向のプログラミングを習得するには、こういった基礎知識の学習から始まり、実際に開発を通じて設計やコーディングの知識・技術を得るために多くの経験を積むことが肝心なのではないでしょうか。

4. まとめ

今回はオブジェクト指向のメリットとデメリットについてをまとめてみました。

WPFに引き続き、デメリットとして学習難易度の高さを挙げてしましましたが、こういった技術や知識を習得できたとき、プログラマーやシステムエンジニアとしてのレベルが大きく上がるのではないでしょうか。


やはり学習というものは一朝一夕で完了して身につくものではありませんから、小さなことからコツコツと、まずはできることを少しずつ増やしていければ問題ないと思います。

オブジェクト指向についての基本的な部分はまとめられましたが、実際どのプログラム言語で使うことのできるモノなのか、という所を次回ご紹介できたらと考えています。