【DO!BOOK・ページリンク】
2008_migaro_techreport_001   94 / 136

BOOKをみる

10秒後にBOOKのページに移動します


92 フォームを変更すれば10 画面全て に全て適用される。【図2】  A は工数がかかるだけでなく、プロ グラムの開発/ 変更量が多い。というこ とは、それだけ人為的なミスが発生する 可能性も高く、プログラム試験の工数も それに伴って増大する。  それに対して、B はプログラムの開発 / 変更量が少なく、また、継承化された 部分は基本的に全て同じ動作となる。そ のため、試験の確認パターンも必要最低 限で済む、という違いがある。  ただし、上記2 例からわかるように、 継承化は必ずしも有効な開発手法ではあ るとは限らない。継承の理解が誤ってい るために、逆に開発効率やメンテナンス 性が悪くなってしまったという話もよく 耳にする。  では、フォーム継承はどのように行え ば効率がよい開発が行えるのか、これを 順を追ってみていこう。 2 フォーム継承の ポイント  フォーム継承がどういった特性を持つ のかを把握しておかないと、煩雑なプロ グラムになり、後々のメンテナンスで逆 に手間がかかってしまう。  では、フォーム継承を作成していくポ イントをまとめてみる。 2-1. フォーム継承とは  継承とは、オブジェクト指向プログラ ミングにおいて、すでに定義されている オブジェクトをもとに、拡張や変更を加 えた新しいオブジェクトを定義すること である。  例えば、Excel で帳票を作成する場合、 同じ帳票を印刷するたびに新規のExcel から作り込むことはあまりしないだろ う。必要と思われる帳票フォーマットに 対して、定型となるExcel をあらかじ め用意しておき、そのExcel に必要な 内容だけ入力して印刷すれば手間もかか らず、効率よく帳票が作成できる。  これと同じように、フォームの定型が あらかじめ用意されていれば、その フォームに対して必要な箇所だけ手を加 えればよいので、便利ではないだろうか。 これが、フォーム継承である。  継承フォームの新規作成についても押 さえておこう。  Delphi のメニューから[ファイル] →[新規作成]→[その他]から、同じ プロジェクト内のフォームを選択して、 新規フォームを作成する。これにより、 選択したフォームを継承した新しい フォームを作成することができる。【図 3】 2-2. コンポーネントの配置  では、継承元フォームを作成するうえ で、定型となるフォームにはどういった コンポーネントを配置するのが望ましい かを考えてみる。  仮に、継承元フォームに、照会画面で 使う全ての画面項目を配置したとする。 そうすると、全く同じ照会画面を作成す る場合にはほとんど継承だけで動作する ことになり、一見非常に便利に思える。  しかし、少し違う照会画面になった場 合、必ず不要になるコンポーネントがあ ることに気づくだろう。【図4】 ・不要なコンポーネント  この不要なコンポーネントが多いと、 その不要なコンポーネントを非表示にし たり、動作しないように制御したりする ことで、逆に開発に手間がかかってしま う。また、不要なコンポーネントが存在 すると、その画面の動作はそのぶんパ フォーマンスが悪くなる。フォームの継 承を行ううえで失敗するのは、このケー スであることが非常に多い。  継承は便利である一方、継承で配置し たコンポーネントは、継承先フォームで は削除することはできない。継承先 フォームへの制約となることも意識する 必要がある。  つまり、継承元フォームに配置するも のは、その継承を利用して作成する画面 に共通して必ず存在するコンポーネント だけにすることが望ましい。  例えば、検索を行う照会画面で項目の 要/ 不要を選別してみる。【図5】 ● 検索項目:画面によって異なるので、 不要になる可能性がある。 ● 検索ボタン:検索画面には必ず存在す るので、必要である。  継承元フォームを作成するうえで最も 重要なポイントは、継承画面に本当に必 要な項目だけを過不足なく洗い出すこと である。これは、上流工程の画面設計で、 共通の画面レイアウトを考える際に意識 しておくと、継承化の時にも格段に楽に なる。 2-3. コンポーネントとコーディング  では、そうしたことを概念として理解 しながらも、なぜ余計な画面項目を継承 元フォームに配置して、失敗するケース が多いのだろうか。  その理由の多くは、処理プログラムを 書くためである。  例えば、[クリア]ボタンを押すと、 画面項目のEdit コンポーネントの表示 内容をクリアする機能を実装したとす る。  その場合、開発者は、ソース1 のよう にコーディングしたい。【ソース1】  しかし、画面上にEdit1 コンポーネン トがないと、ソース1 のようなコードは 記述できないために、しかたなく継承元 フォームに不要なEdit1・・・を配置し てしまう。  では、検索項目をクリアする処理は、 個別の画面フォームでコーディングする べきだろうか? しかし、同じ処理を個 別の画面にコーディングするのであれ ば、継承を行う意味が薄れてしまう。 ・動的なコーディング  このような場合は、画面固有のコン ポーネント名に依存しない、動的なコー ディングを行う必要がある。  例えば、継承元フォームで、ソース2 のようにコーディングする。画面のコン ポーネント名がわからなくても、全ての Edit コンポーネントを動的にクリアす ることができる。【ソース2】  なお、これを応用すれば、Form の代 わりにPanel コンポーネントのような コンテナコンポーネントをあてはめて、 コンテナコンポーネント上だけの制御も 行える。  このように継承元フォームでは、でき るだけ画面固有のコンポーネント名に依 存しないコーディングが有効である。こ れによって、無駄なコンポーネントを配 置する必要がなくなり、継承元フォーム