オブジェクト指向って何ですのん?何がいいの?
オブジェクト指向でなぜ作るべきかを解説した本を読んだから紹介するね!
プロコアラ@エンジニアブロガー
10年間エンジニアをしており、副業でWebサイトやWebサービスを作っています。
一時期資格取得にハマりTOEIC860点オーバー、応用情報処理は取得。休日はラズパイをいじるコアラ好きです。
Follow @top_pro_koala
概要
オブジェクト指向には2つの側面がある。
・汎用的に使える整理術(UML、モデリング)
・ソフトウェアプログラミングの技術
オブジェクト指向でよくある誤解が、オブジェクト指向がそのまま現実世界を表すことができるというもの。
これは、動物クラスを継承した哺乳類クラスがある、車クラスがタイヤクラスを持つ等の比喩を乱用した結果である。
このため、全てをオブジェクトで当てはめて考えようという思考になり、悪い設計となる。
現実世界との対比は例え話として割り切るほうが良い。
プログラミングの歴史
プログラミングは以下のように変遷している。
・機械語(コンピュータが直接解釈する0と1のコード)
・アセンブリ言語(機械語を人間に分かりやすいようにしたもの)
・高級言語(複数のアセンブリ言語を1行で記述できる人間に分かりやすい高級な言語)
・構造化プログラミング(GOTO文を禁止して順次進行、条件分岐、繰り返しのみでロジックを表現するプログラミング手法)
製品化間隔が短縮されている背景があり、プログラムを使い回すことが増えてきた。
また、CPUやメモリが安価になってきたことから、プログラミング時に要求されることが、
実行効率から保守性、展開性へとシフトしていった。
構造化プログラミングは、サブルーチンしか再利用することができず、グローバル変数を多用するため、保守性向上に限界がある。
この課題を解決する手法として、オブジェクト指向が生まれたのである。
オブジェクト指向のメリット
・サブルーチン以外に再利用できる仕組みがある。
→クラス、継承、ポリモーフィズム
・グローバル変数を多用しない仕組みがある。
→クラス(インスタンス変数)
・呼び元のインターフェースが共通化されるため、コール側の処理を変更する必要がなくなる。
オブジェクト指向とメモリの仕組み
プログラムはビルド時に、プログラムやグローバル変数はコード領域へと格納される。
C++の場合、使用しないクラスも含めて全てのクラスのプログラムがコード領域へと最初にロードされる。
Javaや.NETでは、使うコードを実行するときに読み込まれてメモリにロードされる。
インスタンスは、コード領域では無くヒープ領域にメモリが確保される点がクラスと異なる。
また、ヒープのメモリ確保、解放にはオーバーヘッドが発生してしまう。
組み込み機器の場合、メモリ領域が有限であること、リアルタイム性の要求が高いことから
ヒープ領域を多く使用するオブジェクト指向は使用できないケースが出てくるだろう。
感想
私が会社で担当している製品はPC上のソフトウェアから制御可能な組み込み機器です。
C++でコーディングされているのですが、神様クラスが何個かあるだけのオブジェクト指向とはいいがたいものです。
この本を読み、組み込み機器でオブジェクト指向を使うためにはメモリとリアルタイム性の問題を
解消する必要がある。
オブジェクト指向を適用するとなると多大な設計変更があり、二の足を踏んでしまうのですが
保守性、展開性を考慮すると適用せざるを得ない。
オブジェクト指向に関わらず、良い設計というものを、これから書籍から効率的に学んでいきたい。
では(^^)/