オブジェクト指向設計で覚えて欲しい2つの事 – 新人エンジニア教育の定番

オブジェクト指向で覚えて欲しい事 IT技術

プログラミングを独学で学んでいる場合、思いつくままにプログラムを作っていくことが多いでしょう。そういったプログラムは、時間が経つと構造が把握できなくなったり、修正が困難な不具合(バグ)に苦しめられるといったことがよくあります。

新しくITエンジニアになった人たちには、プログラム作成の実務の前に、簡単なソフトウェアの設計を教育することがあります。個人で作っているプログラムと違い、IT企業で作成されるソフトウェアは規模も大きく、複数人で制作することも多いです。今回は、ソフトウェア設計の基本でもある「オブジェクト指向」について、習得が簡単で実務に役立つ内容を2点だけまとめていますので、是非学習に役立ててみてください。

オブジェクト指向を学ぶ意義

オブジェクト指向という言葉は、とても複雑そうな響きがするため、多くの新人エンジニアは身構えてしまいがちですが、内容は比較的単純な「考え方」や「概念」です。オブジェクト指向を学んでソフトウェアの制作に活用すると、プログラミング作業の効率は高まり、品質も向上するでしょう。

設計が良いソフトウェアは不具合が生じた時にも原因の究明が容易となり、また修正にかかる時間も大幅に削減できます。その上、修正の影響範囲を狭くなるため、二次的な障害などを防ぐ効果も得られます。

また、ソフトウェアの拡張性を高めることにも繋がります。理路整然とした設計は、追加の仕様をどのように組み立て・結合すればよいのか明確になり、度重なるアップデートがあっても高い品質を保つことが容易になります。

ソフトウェアの設計は「整理整頓」に似ている

良い設計をするということは、部屋や倉庫などの「整理整頓」をする発想と似ています。何をどこに片付けるのか考えて、それをルール化して徹底します。

そうすると、間違った場所に片付けられているものがあれば、本来片付けるべき正しい場所は直ぐに判明し、直すのも簡単です。また、新しい種類の物を扱うことになったとしても、既存のルールに追加する形で、新しい片付けのルールを決めやすいということになります。

ソフトウェア設計に迷った時は、「基本は整理整頓」であることを思い出して、自分なりに工夫してみると、自然と良い設計になっていくでしょう。

オブジェクト指向設計で大事な2点

オブジェクト指向設計の歴史は比較的長く、その全てを覚えるのには時間もかかります。もちろんすべてを学んで役立てる事ができれば、それに越したことはありませんが、時間は限られています。新人エンジニアの研修などでは全てを伝えきることはできないので、興味のある人は自分で学ぶ以外に方法はないでしょう。

ここでは、新人研修などでも伝える事が多い、業務にすぐに役立つ「オブジェクト指向設計の基本」を紹介しています。実務で直ぐに使ってみる事ができる上に、自分なりに応用したり効率化することもできるような内容なので、是非覚えてみてください。

カプセル化 – 役割分担を明確にしよう

カプセル化」は、オブジェクト指向の最も重要な概念の一つです。

モジュールや関数などを「小さな役割」で分割管理し、それぞれの役割は「その中で完結」させる考え方で、まるで「カプセルの様に封じ込める」ため、カプセル化と呼ばれます。

実例からイメージを掴もう – MVC

例えば、画面に表示する処理と、表示するデータの処理があった場合、それらをひとつの関数やモジュール内で処理してしまうのではなく、画面の処理とデータ処理を完全に分離した構造にするといった設計です。

表示する処理の近くにデータ処理があった方が、プログラムの流れも把握しやすく効率的なように見えてしまいそうですが、この構造が許されるのは小規模で拡張もしない、個人利用のプログラムなどの場合だけです。

具体的には、表示する処理は「表示だけに専念」するように設計・コーディングします。受け取ったデータを表示するだけの処理になり、データの処理は行いません。一方、データ処理部は「データだけに専念」します。表示の事は考慮せず、ただ必要なデータを集め、返却します。このようにプログラム全体を整理整頓します。

この構造は、ソフトウェア設計や近年の開発環境などでも採用されることが多い「MVC」の基本構造でもあります。MVCは、Model View Controllerの頭文字で、データ処理のModel、画面表示のViewと、処理の流れを担当するControllerの3つの柱で、ソフトウェア全体をまとめる基本設計です。

この考え方は、画面とデータに限らず、実装内容に応じて役割(モジュール構成)などを考えて、制作するプログラム全体に適用します。そうしておくことで、不具合や仕様追加が発生した場合は該当する部分だけを修正する形となるため、影響範囲は小さくなり、修正にかかる時間も大幅に短縮できることになります。

近年のプログラミング言語には、「クラス」と呼ばれる言語仕様が含まれていることが多いです。「クラス」は、処理実体である関数と、データを保持する変数などを一元管理することができるため、オブジェクト指向設計を実現する上で非常に重要な役割を担います。

疎なインターフェース – 基本は締める

カプセル化したモジュールと外部との接点はインターフェースと呼びます。

オブジェクト指向の設計において、カプセル化の次に大事な概念として学んでほしいのは、「インターフェースを疎にする」ことです。「疎」というのは、「出来るだけ少なく」「簡素」にするという意味です。

クラスは公開するものを限定しよう

クラスなどの設計においては、プログラミング言語にもよりますが、メンバ変数やメンバ関数の公開レベルを設定できることが多いです。ソフトウェアの品質を高めるためには、「基本は締める」を徹底することが重要です。

クラスのメンバーは、基本は非公開の「private」とし、派生クラスなどを考慮する場合は「protected」で実装します。外部からの呼び出しが極力少なくて済むように実装を進め、最低限必要な物だけを「public」で公開します。

このように実装しておくことで、問題が発生した場合に、原因がクラスの内部なのか外部なのかが明確になることが多く、問題の切り分け・修正が迅速に行えるようになります。また、デバッグ工程においても、インターフェースの値を監視する等で、問題の再現も容易になるメリットも生まれます。

また、クラス内のメンバ変数を直接公開するのではなく、gettersetterといった機能を利用することも重要です。変数自体を外部に公開してしまうと、値の更新が「プログラム全体から可能」となってしまいますが、getter/setterを利用すると「必ずクラス内の処理を通過する」ことになり、「門番やゲート」のような役割を担うようになります。

学ぶ姿勢を大事にしよう

ITエンジニアとして仕事をし始めたばかりの人は、上司や先輩から言われた仕事をするのが精一杯になることが多いでしょう。仕事に慣れて余裕が出てきたら、是非自分が触っているプログラムの設計についても考えてみましょう。モジュールの構成やクラスの分け方など、先輩エンジニアのノウハウが詰まったプログラムからは、学べるところも多いです。

学生の間は、学ぶ(勉強する)というのは教科書を見ながらや、先生に習いながらということが多いですが、一般的な社会ではそういった機会は与えられません。学ぶ意識がある人は、日々の業務や些細な会話からも学びますし、学ぶ意識のない人はずっと同じままなのです。ITエンジニアとして成長したいと考えるのであれば、学ぶ姿勢を大事にしましょう。新しく何か勉強を始めなくても、意識があれば、自然と知識や技術力が身に付いていくものです。

コメント