netcobol for .net 基本編 - fujitsuき型cobolとの互換性...
TRANSCRIPT
-
はじめに
◆本書の目的 本書は、N e t C O B O L f o r . N E T を使用したプログラミングの教材で
す。N e t C O B O L f o r . N E T の開発環境を実際に操作しながら学習できます。その際、以下のいずれかの製品が必要となります。 ・ N e t C O B O L B a s e E d i t i o n 開発パッケージ f o r . N E T V 4 . 0 ・ N e t C O B O L S t a n d a r d E d i t i o n 開発パッケージ f o r . N E T V 4 . 0 ・ N e t C O B O L E n t e r p r i s e E d i t i o n 開発パッケージ f o r . N E T V 4 . 0 また、本書は、C O B O L 言語の基礎的知識をもち、W i n d o w s の基
本的操作ができ、以下のいずれかの経験がある読者を対象として記
述されています。 ・ W i n d o w s 版 N e t C O B O L での開発経験がある。 ・ オフコンや汎用機で C O B O L の開発経験がある。 ・ N e t C O B O L f o r . N E T を使用中、または今後使用を検討中。 なお、本書で掲載している画面は、W i n d o w s X P 上でのイメージ
です。また、ご使用される V i s u a l S t u d i o のエディションまたは設定によって若干異なることがありますのでご了承ください。
◆本書の構成 本書の構成と内容は以下のとおりです。 第 1章 従来の手続き型 C O B O L と N e t C O B O L f o r . N E T
従来の手続き型 C O B O L と N e t C O B O L f o r . N E T の関係を学習します。
第 2章 プログラムを作る前に クラスの考え方をサブルーチンと比較して学習します。
第 3章 N e t C O B O L f o r . N E T プログラミングの考え方 クラスを使用するための考え方を学習します。
第 4章 N e t C O B O L f o r . N E T プログラムの開発 N e t C O B O L f o r . N E T で作成できるアプリケーションの概要と W e b アプリケーションの開発について学習します。
第 5章 演習
W e b アプリケーションの作成を演習により学習します。 第 6章 よく使うクラス、プロパティと C O B O L コーディング例
W e b アプリケーション作成時に使用するクラスやプロパティについて学習します。
Copyright 2006-2009 FUJITSU LIMITED
-
◆略語
本書の記述 正式名称 W i n d o w s 2 0 0 8
M i c r o s o f t ® W i n d o w s S e r v e r ® 2 0 0 8 S t a n d a r d M i c r o s o f t ® W i n d o w s S e r v e r ® 2 0 0 8 S t a n d a r d w i t h o u t H y p e r - V M i c r o s o f t ® W i n d o w s S e r v e r ® 2 0 0 8 E n t e r p r i s e M i c r o s o f t ® W i n d o w s S e r v e r ® 2 0 0 8 E n t e r p r i s e w i t h o u t H y p e r - V
W i n d o w s V i s t a
M i c r o s o f t ® W i n d o w s ® V i s t a H o m e B a s i c M i c r o s o f t ® W i n d o w s ® V i s t a H o m e P r e m i u m M i c r o s o f t ® W i n d o w s ® V i s t a B u s i n e s s M i c r o s o f t ® W i n d o w s ® V i s t a E n t e r p r i s e M i c r o s o f t ® W i n d o w s ® V i s t a U l t i m a t e
W i n d o w s X P M i c r o s o f t ® W i n d o w s ® X P P r o f e s s i o n a l M i c r o s o f t ® W i n d o w s ® X P H o m e E d i t i o n
W i n d o w s S e r v e r 2 0 0 3
M i c r o s o f t ® W i n d o w s S e r v e r ® 2 0 0 3 R 2 , S t a n d a r d E d i t i o n M i c r o s o f t ® W i n d o w s S e r v e r ® 2 0 0 3 R 2 , E n t e r p r i s e E d i t i o nM i c r o s o f t ® W i n d o w s S e r v e r ® 2 0 0 3 , S t a n d a r d E d i t i o n M i c r o s o f t ® W i n d o w s S e r v e r ® 2 0 0 3 , E n t e r p r i s e E d i t i o n
S Q L S e r v e r
M i c r o s o f t ® S Q L S e r v e r 2 0 0 5 M i c r o s o f t ® S Q L S e r v e r 2 0 0 8
V i s u a l S t u d i o V i s u a l S t u d i o 2 0 0 8 V i s u a l S t u d i o T e a m S y s t e m 2 0 0 8
◆商標 ・M i c r o s o f t、W i n d o w s は、米国 M i c r o s o f t C o r p o r a t i o n の米国およびその他の国における登録商標です。
・S u n、S u n M i c r o s y s t e m s、S u n ロゴ、S o l a r i s およびすべての S o l a r i sに関連する商標およびロゴは、米国およびその他の国における米国 S u n M i c r o s y s t e m s , I n c .の商標または登録商標であり、同社のライセンスを受けて使用しています。
・S o l a r i s(T M) O p e r a t i n g S y s t e m は、本資料では「S o l a r i s」と記述しています。
・その他、製品名などの固有名詞は、各社の商標または登録商標です。
・その他、本資料に記載されているシステム名、製品名などは、商標表示
(T M・®)を付記していません。
Copyright 2006-2009 FUJITSU LIMITED
-
Copyright 2006-2009 FUJITSU LIMITED
◆注意事項 本書で扱うサンプルは、開発手順を説明するために機能を絞っていま
す。そのため、実際のアプリケーションでは必須となるパスワード保護
などの機能が省略されています。実際のアプリケーション開発では、要
件に応じて適切な設計を行ってください。
-
第1章 従来の手続き型COBOLと
NetCOBOL for .NET
「NetCOBOL for .NETは、従来の手続き型COBOLとはまったく別物
であり、オブジェクト指向や .NETの知識がないとプログラミングできない。」、「既存の手続き型COBOL資産を動かすためにも、オブジェクト指向や .NETの知識が必要となる。」 このように思われていませんか。そんなことはありません。
NetCOBOL for .NETでは、従来のCOBOLからの互換性も十分確保されています。本章では、オフコンで稼働していたバッチプログラムを
NetCOBOL for .NET環境で動かしてみましょう。
1
Copyright 2006-2009 FUJITSU LIMITED
-
1.1 手続き型COBOLとの互換性
2
Copyright 2006-2009 FUJITSU LIMITED
1.1 手続き型COBOLとの互換性 本書では、2章以降でオブジェクト指向やNetCOBOL for .NETでのプ
ログラミングについての話をしていきます。少しでも .NETの世界に近づいてもらおうという意図です。このように言うと、「NetCOBOL for .NETというのはそんなに難しいのか、ちょっと手が出ないかも。」と思われてしまうかもしれません。確かに、従来の手続き型COBOLとはプログラムの構造が異なるし、手続き型COBOLプログラマーには、未経験のクラスを使ってのプログラミングという壁があります。プログ
ラムソースを見ても、 INVOKE文や見慣れない定義が出てきて、「これってCOBOL?」と思ってしまうかもしれません。見た目の印象から、「COBOLといっても全く別物で、従来の手続き型COBOLとは相容れないもの。」、「導入なんてとても無理。」という拒絶反応を起こしてし
まうかもしれません。 確かに、敷居が高い面はあります。しかし、これはWindowsやWeb環
境で画面を使用するプログラムなどを作成する場合のことなのです。従
来のバッチプログラムやバックエンドで動作するサブルーチンは、プロ
グラムの修正なしに再コンパイルのみで動作させることができます (図1-1-1) 。もちろん新規でも手続き型COBOLの命令のみを使用して、従来と同じようにプログラムを作成することができます。このようなプロ
グラムに関しては、敷居が高いどころか敷居が存在しないも同然なので
す。NetCOBOL for .NETは、従来のCOBOLと異なったものではなく、その仕様を引き継ぎ、発展させたものと理解してください。 また、本書では触れませんが、COBOLだけでなく、C#やVisual
Basic、C++などの言語が、言語毎の独自環境ではなく、 .NET環境を共通環境として動作します。これにより、従来のバッチプログラムやサブ
ルーチンを動作させることだけでなく、これらの資産と他言語とのスム
ーズな連携も可能になっています。
図1-1-1
-
1.2 手続き型COBOLを動かしてみる
1.2 手続き型COBOLを動かしてみる それでは、実際に手続き型COBOLで作られたバッチプログラムを
NetCOBOL for .NET環境で動かしてみましょう。ここでは、オフコンで稼働していた、以下のようなプログラムを対象としています。索引フ
ァイルを入力して、CSVファイルに編集して出力するバッチプログラムです (図1-2-1) 。 (以降の手順で出てくるツールや環境の名称などは次章以降で説明します。ここでは、手順のイメージを掴んでください。 )
PROCEDURE DIVISION.MAIN-SHORI.
OPEN INPUT 在庫ファイル.OPEN OUTPUT 出力ファイル.READ 在庫ファイルAT ENDMOVE "END" TO END-FLAGEND-READ.
PERFORM DATA-SHORI UNTIL END-FLAG = "END".CLOSE 在庫ファイル.CLOSE 出力ファイル.EXIT PROGRAM.
FD 在庫ファイル .01 在庫レコード.02 製品番号 PIC 9(4).02 製品名 PIC X(20).02 在庫数量 PIC S9(2).02 倉庫番号 PIC 9(4).02 定価 PIC 9(9).02 仕切率 PIC S999V99.
バッチプログラム
COBOL索引ファイル
1103,TELEVISION,+08,0002,000248000,067.24 1112,TELEVISION,+09,0002,000300000,081.51 1238,REFRIGERATOR,+06,0001,000150000,072.84 1246,REFRIGERATOR,+07,0001,000170000,088.41 1377,RADIO,+01,0002,000012000,090.23 1381,RADIO,+01,0002,000013000,095.85 1409,CASSETTE DECK,+01,0002,000010000,090.89 1414,CASSETTE DECK,+08,0002,000009000,092.23 2007,AIR CONDITIONER,+00,0001,000200000,076.76 2016,AIR CONDITIONER,+01,0001,000049800,070.28 2123,TELEVISION,+01,0002,000089000,080.14 2151,VIDEO,+00,0002,000039800,084.67 2268,REFRIGERATOR,+00,0001,000019800,093.01 2274,REFRIGERATOR,+01,0001,000059000,088.69 2405,CASSETTE DECK,+02,0002,000008000,090.07 2433,CASSETTE DECK,+01,0002,000009000,092.22 3511,CASSETTE TAPE,+02,0002,000010000,095.21 3808,SHAVER,+08,0003,000009800,079.68 3906,DRIER,+05,0003,000005000,090.74 .
CSVファイル
(PGM:CSVOUT)
図1-2-1
(1) プロジェクトの作成とテンプレートの選択 COBOLの実行可能プログラムの作成に必要なプロジェクトを作成し
ます。Visual Studioを起動し、ファイルメニューから [新規作成 ]- [プロジェクト ]を選択して、以下の操作を行います (図1-2-2)。
3
Copyright 2006-2009 FUJITSU LIMITED
-
1.2 手続き型COBOLを動かしてみる
図1-2-2
(2) COBOLプログラムのコピー準備 オフコンで稼働していたバッチプログラムを本開発環境に持ってくる
準備をします (図1-2-3) 。プロジェクトを作成した段階で表示されている雛型COBOLソースを削除します。
図1-2-3
②テンプレートから 「コンソールアプリ
ケーション」を選択
③プロジェクト名に 「CSV OUT」を指定
①雛型C O B O Lソースの削除
②ソースファイル配下にある
C O B O Lソースのファイル名を「C SV OU T. c o b」に変更
①「C O B OLプロジェクト」を選択
4
Copyright 2006-2009 FUJITSU LIMITED
-
1.2 手続き型COBOLを動かしてみる
(3) COBOLプログラムのコピーとビルド環境設定 対象バッチプログラムを本開発環境に持ってきて、実行可能プログラ
ム作成の準備をします (図1-2-4 , 図1-2-5) 。
図1-2-4
図1-2-5
対象バッチプログラム
ソースのコピー
プロジェクトメニューから「CSV OUTのプロパティ」を選択し、左の欄から
アプリケーションを選択 「スタートアップオブジェクト」を
「CSV OUT」に変更
5
Copyright 2006-2009 FUJITSU LIMITED
-
1.2 手続き型COBOLを動かしてみる
(4) プログラムのビルド ビルドとは、実行可能プログラムを作成することです。まず、翻訳オ
プション「RCS(SJIS-UCS2)」を指定します。これは、入力の索引ファイルの英数字項目がJIS/SJISコードで作成されているため、プログラムのコード系を同じJIS/SJISコードにするオプションです (本オプションを設定しないと、英数字項目のコード系はUnicodeになります ) 。 翻訳オプションの指定は、以下の操作で行います (図1-2-6) 。
図1-2-6
この画面を閉じた後、以下の操作でビルドを行います (図1-2-7) 。
図1-2-7
①プロジェクトメニューから
[C SV OUTのプロパティ ]を選択し、左の欄から「ビルド」を選択
②翻訳オプション
「RCS( SJ I S - UCS2)」の追加
ビルドメニューから
[C SV OUTのビルド ]を選択
6
Copyright 2006-2009 FUJITSU LIMITED
-
1.2 手続き型COBOLを動かしてみる
(5) 実行環境の設定 実行環境は、環境変数で指定します。ツールメニューから
[NetCOBOL for .NETユーティリティ ]- [COBOL実行環境設定ユーティリティ ]を選択して、実行環境設定ユーティリティウィンドウを表示します。環境変数情報として、プログラムのファイル識別名と実ファイル
名の対応を設定します (図1-2-8) 。
図1-2-8
情報設定後、ファイルメニューから格納するファイル名と格納場所を
指定します (図1-2-9) 。 格納するファイル名:実行可能プログラムのファイル名 . conf ig 格納する場所:対象の実行可能プログラムが存在する場所
図1-2-9
ファイル識別名 実ファイル名
格納するファイル名
と格納場所を指定
7
Copyright 2006-2009 FUJITSU LIMITED
-
1.2 手続き型COBOLを動かしてみる
8
Copyright 2006-2009 FUJITSU LIMITED
(6) プログラムの実行 デバッグメニューから [デバッグなしで開始 ] を選択して、プログラ
ムを実行します。DISPLAY文でメッセージを出力するプログラムでは、下図のようにコンソールウィンドウが開き、メッセージが表示されます (図1-2-10) 。
図1-2-10
以上の操作で従来の手続き型COBOLで作成されたプログラムを、プ
ログラムに手を加えることなく動作させることができます。この例では、
オフコンで稼働していたバッチプログラムをそのまま利用しましたが、
新規作成の場合も、動作させる手順は同じです。 さて、NetCOBOL for .NET環境が、従来の手続き型COBOLの発展形
として、互換性を十分確保していることはわかっていただいたと思いま
す。しかし、従来のCOBOLを発展させたといっても、手続き型COBOLプログラマーにとって、違和感を憶える部分があるのも事実です。それ
を2章から見ていきましょう。
プログラムの実行メッセージ
-
第2章 プログラムを作る前に
NetCOBOL for .NETのプログラムの話に入る前に、オブジェクト指
向について説明しておきましょう。オブジェクト指向といっても、考え
方を細かく説明するつもりはありません。また、 .NETのプログラムを作るのに、細かな定義まで理解する必要はありません。しかし、クラス
の考え方は知っておく必要があります。そして、クラスを使用すること
のメリットも押さえておきましょう。 クラスのメリットとして、「データの隠蔽化」とか「再利用性の向
上」ということがいわれます。手続き型COBOLプログラマーである皆さんがそのような説明を聞くと、「サブルーチンではなぜだめなのか
な?どう違うのかな?」という疑問が浮かんできませんか。なぜサブル
ーチンが考え出されたのか、サブルーチンにできないことは何なのか、
クラスの理解を助けるために、サブルーチンとクラスを比較しながら見
ていきましょう。
9
Copyright 2006-2009 FUJITSU LIMITED
-
2.1 サブルーチンとクラス
2.1 サブルーチンとクラス プログラミング言語の歴史の中で、サブルーチンという考え方は機械
語の時代から存在しました。類似した処理があるのなら、それを一箇所
にまとめてモジュール化し、必要であれば、そのモジュールを呼び出し
て使用するというものです。これにより、同じコーディングを何回も書
くような、プログラム作成負荷を軽減させようという狙いがありました。 最初はプログラム作成負荷軽減という目的だったサブルーチンが、プ
ログラムのわかりやすさという観点で語られ始めたのは、エズガー・ダ
イクストラ氏の提唱した構造化プログラミングからになります。構造化
プログラミングとは、プログラムを「モジュール」という単位に分割し、
それらを個々のサブルーチンとして独立させ、以下の基本となる3つの
アルゴリズム (連続、分岐、反復 ) により、サブルーチンや命令を組み合わせてプログラムを作成しようというものです (図2-1-1) 。構造化プログラミングにより、プログラムのわかりやすさが大きく向上したとい
われます。
図2-1-1
構造化プログラミングにより、プログラムのわかりやすさは向上しま
したが、保守という観点で考えるとまだ十分ではありません。1つのサ
ブルーチンを修正することで、そのサブルーチンを使用するプログラム
にまで影響が及んでは困ってしまいます。保守性を高めるためには、サ
ブルーチンの修正が他のプログラムに影響を及ぼさないように、サブル
ーチンの独立性が高くなければなりません。そのためには、モジュール
結合度を弱くすることが重要になります。そこで、サブルーチン作成時
に次のような点に留意して、結合度を弱くして作成する必要があります。
10
Copyright 2006-2009 FUJITSU LIMITED
-
2.1 サブルーチンとクラス
11
Copyright 2006-2009 FUJITSU LIMITED
・ 他のプログラムとの共通領域をできるだけ利用しない ・ データ量は必要最小限度にとどめる ・ 1つのモジュールは、固有の1つの機能を持つ
保守性の向上
わかりやすさの向上
独立性を高める
サブルーチン化の目的の変遷
作業負荷軽減
構造化プログラミング
モジュール化
作業負荷軽減 作業負荷軽減
わかりやすさの向上
図2-1-2
このようなサブルーチンを作成することにより、作業負荷軽減やわか
りやすさの向上だけでなく、保守性の向上も望めるようになります (図2-1-2)。そして、その発展系がクラスを使用したオブジェクト指向プログラミングです。これにより、さらなる「保守性の向上」や 「データの隠蔽化」、「再利用性の向上」などが図られたといわれます。 しかし、手続き型COBOLプログラマーにとっては、今ひとつピンと
こないところがあります。サブルーチンの独立性を高めていくと、サブ
ルーチンで「データの隠蔽化」は実現できそうな気がしませんか。その
データへのアクセスは、そのサブルーチンしかできないようにして、そ
のデータに関する処理ロジックをその中に閉じた形で持たせてやればよ
いわけです。「保守性」に関しても、そのデータに関する処理はこのサ
ブルーチンに閉じているわけですから、他のプログラムへ影響を及ぼさ
ず、問題ないように思えます。もちろん再利用性も向上しそうです。
「じゃあ、クラスのメリットって何?」と、改めて問いたくなってしま
います。しかし、クラスには、サブルーチンでは持ち得ない大きなメリ
ットがあるのです。
-
2.2 クラスのメリット
2.2 クラスのメリット 最初にお話ししたように、NetCOBOL for .NETのプログラムを作る
のに細かい定義を全て理解する必要はありません。ただし、クラスを利
用することにより、サブルーチンでは実現できないメリットを享受でき、
それを利用してプログラミングする、ということを理解しておいてくだ
さい。では、クラスにできてサブルーチンにできないこと、そしてクラ
スのメリットとは何でしょう。これについては、考え方など本質的なと
ころでの比較が必要なのでしょうが、今回は3点だけあげておきます。
(1) インスタンスの生成(クラスのインスタンス化) オブジェクト指向は「モノ」に例えられます。よく「”人”がクラス
で”山田さん”がインスタンス」という説明がありますね。クラスが種類でインスタンスが実体というわけです。イメージとしては正しいのです
が、これがプログラムにどのように関係してくるのか、なかなか掴めま
せん。 コンピュータの世界では、クラスとは、手続きを含んだ定義情報と考
えてください。クラスの中に、データや、クラスの持つ機能 (手続き )を定義します。オブジェクト指向プログラミングでは、クラスに対して処
理を依頼することで処理を実行していくのですが、定義情報だけでは処
理を実行することができません。クラスの持つ機能を使えるようにする
には、メモリ上にクラスの実体を作ってやらなければなりません。メモ
リ上に定義情報をロードして、実行可能状態としてやるわけです。これ
を「インスタンス化」といいます (図2-2-1) 。
実行可能
メモリ
インスタンス化されたクラス
クラスロード
実行できない
定義実体
インスタンス化
図2-2-1
12
Copyright 2006-2009 FUJITSU LIMITED
-
2.2 クラスのメリット
インスタンス化したクラスに対して処理を依頼することで、初めて機
能の実行が可能になります。サブルーチンでもメモリ上にロードすると
いう意味では同じですが、クラスと大きな違いがあります。「オブジェ
クト指向は”モノ”に例えられます。」と書きましたが、”モノ”はいくつも作ることができます。つまり、1つのクラスからメモリ上に実体をい
くつでも作ることができるのです。サブルーチンではこれは不可能です。
具体的なイメージで説明しましょう。 商品マスタファイル読み込み処理を考えてみます。まずサブルーチン
で考えてみましょう。このような処理のサブルーチンは、次のように作
成します (図2-2-2) 。
メインプログラム
・
・
CALL 商品マスタファイル 読み込みサブルーチン.
・・・
*
商品マスタ定義
*PROCEDURE DIVISION.
OPEN 商品マスタファイル.
READ 商品マスタレコード.
CLOSE 商品マスタファイル.
商品マスタファイル読み込みサブルーチン
図2-2-2
簡単なプログラムですね。では、システムの運用上、商品マスタが2
個必要になったとしたらどうしますか。サブルーチンを次のように修正
するはずです (図2-2-3) 。
13
Copyright 2006-2009 FUJITSU LIMITED
-
2.2 クラスのメリット
メインプログラム
・
・
CALL 商品マスタファイル 読み込みサブルーチン.
・・・
*
商品マスタ1の定義商品マスタ2の定義
*PROCEDURE DIVISION.
OPEN 商品マスタファイル1.OPEN 商品マスタファイル2.
READ 商品マスタレコード1.READ 商品マスタレコード2.
CLOSE 商品マスタファイル1.CLOSE 商品マスタファイル2.
商品マスタファイル読み込みサブルーチン
処理対象が増加するとプログラムの修正が必要
図2-2-3
では、3個だったら、4個だったら・・・。ファイルを増やすごとにプ
ログラムの修正が発生します。では、クラスだったらどうなるでしょう。
メモリ商品マスタ
読み込みクラス イ
ン
ス
タ
ン
ス
化
実行可能商品マスタ1読み込みクラス
実行可能商品マスタ2読み込みクラス
実行可能商品マスタ3読み込みクラス
複数生成することでクラスの修正不要
クラス定義はひとつ クラスの実体は、複数作成可能
商品マスタ領域
OPEN処理
READ処理
CLOSE処理
図2-2-4
14
Copyright 2006-2009 FUJITSU LIMITED
-
2.2 クラスのメリット
クラスでは、図2-2-4のように実行可能なクラスの実体を複数作ることによって、前述の条件に対応できるのです。クラス定義自体は、複数
のファイルを意識する必要はありません。「商品マスタ1」などのファイル名を与えてメモリ上に複数の実体を作ってやれば、複数マスタの読
み込みが可能というわけです。クラスの実体は、メモリや処理能力が許
す限りいくつも作ることができます。 つまり、サブルーチンで複数のファイルを対象とする処理を作成する
場合には、何らかの形でコーディングに反映しなければならないのに対
し、クラスは、そのような意識をせずに作成し、使うことができるので
す。この「いくつも作ることができる」という特徴は、再利用性の向上
に大きく寄与します。
(2) 継承 NetCOBOL for .NETのプログラミングのために「継承」の概念も覚
えておいてください。これも手続き型のCOBOLでは、実現できない機能の1つです。サブルーチンと比較して説明していきましょう。従業員
の給与計算のサブルーチンを例として考えます。従業員には、一般従業
員、管理職、役員の区分があるとします。給与の計算は、一般従業員が
基本給+残業代、管理職が基本給+管理職手当て、役員は基本給+役員報酬の計算で行われます。算出区分を設定して、1本のサブルーチンに全
ての機能を持たせるという方法もありますが、ここではサブルーチンの
独立性を高めるために、3本のサブルーチンを作成したとします。
*
基本給算出処理
**
残業代算出処理
**
基本給+残業代算出処理
*
基本給算出処理
**
役員報酬算出処理
**
基本給+役員報酬 算出処理
*
基本給算出処理
**
管理職手当て算出処理
**
基本給+管理職手当て 算出処理
役員給与計算
サブルーチン
管理職給与計算
サブルーチン
一般従業員給与計算
サブルーチン
共通処理
独自処理 独自処理 独自処理
図2-2-5
15
Copyright 2006-2009 FUJITSU LIMITED
-
2.2 クラスのメリット
図2-2-5のように、共通である基本給算出処理が3本とも必要となり、コーディングの重複が発生しています。この部分に修正が発生すると、
全てのサブルーチンに影響が及び、保守が大変です。これが、クラスの
継承を利用すると次のようになります。 従業員クラスに共通部ロジックである基本給算出ルーチンを持たせま
す。そして、この従業員クラスを親クラスとして、その子クラスを一般
従業員クラス、管理職クラス、役員クラスと3つのクラスを作成すると、
親クラスの基本給算出ルーチンをコーディングしなくても、全ての子ク
ラスに引き継ぐことが可能になります。この機能を「継承」といいます。
結果的に子クラスの方では独自部分のコーディングだけで済んでしまい
ます。このようなコーディングを差分コーディングと呼びます (図2-2-6)。まさに親クラスが持つ機能と子クラスが必要な機能との差分のみのコー
ディングで済んでしまうわけです。保守も楽になりますね。継承とは、
「親クラスの性質を子クラスが全て受け継ぐ」ことなのです。本書で扱
うコーディングで差分コーディングを行うわけではありませんが、クラ
スを使用するうえで必要な知識ですので覚えておいてください。
役員オブジェクト
役員報酬算出
基本給算出
管理職オブジェクト
基本給算出
管理職手当て算出
一般従業員オブジェクト
残業代算出
基本給算出
インスタンス化
基本給算出
従業員クラス
継承
一般従業員クラス
残業代算出
管理職クラス
管理職手当て算出
役員クラス
役員報酬算出
差分コーディング
親クラス
子クラス
図2-2-6
(3) 標準で提供 サブルーチンでは、自分のプロジェクトや会社で作ったプログラムの
再利用は可能ですね。では、他社のサブルーチンの再利用は可能でしょ
うか。世の中で広く利用されているサブルーチンライブラリといえるも
のがあるでしょうか。再利用性が向上したと言っても、組織内での再利
16
Copyright 2006-2009 FUJITSU LIMITED
-
2.2 クラスのメリット
17
Copyright 2006-2009 FUJITSU LIMITED
用に閉じた場合が多いようです。これに対してクラスはクラスライブラ
リとして、多くのクラスが言語などに標準で添付される形で提供されま
す。NetCOBOL for .NETでも、Javaなどと同様に多くのクラスが提供されています。サブルーチンはその機能を使用することしかできません
が、クラスではそのクラスを使用するだけでなく、「継承」を利用して
機能を引き継いだり、追加・変更したりして使用することも可能です。
提供されているクラスライブラリを使用することにより、新たにプログ
ラムを作ることなく、多様な機能を実現できることになるのです。
-
◇MEMO◇
18
Copyright 2006-2009 FUJITSU LIMITED
-
第3章 NetCOBOL for .NET
プログラミングの考え方
NetCOBOL for .NETプログラミングは、従来の手続き型COBOL命令
を使用したプログラミングと、クラスを使ったオブジェクト指向プログ
ラミングの組み合わせになります。手続き型の部分はよいとしても、オ
ブジェクト指向の部分は、手続き型COBOLプログラマーにとって、どのように考えてよいのかわからないのではないでしょうか。従来の手続
き型のプログラミングでは、設計書に記述された機能を実現するために、
命令を逐次並べて論理を組み立てていきました。では、クラスを使った
プログラミングは、何を見てどのように考えてプログラミングしていけ
ばよいのでしょう。 これを極めるには、「オブジェクト指向とは」とか「オブジェクト指
向設計」などの勉強から始めていかなければいけないところでしょうが、
本書は、とにかく実際に作ってみるということを目的としています。コ
ーディングに的を絞って見ていきましょう。
19
Copyright 2006-2009 FUJITSU LIMITED
-
3.1 手続き型プログラミングとの違い
3.1 手続き型プログラミングとの違い 手続き型プログラミングでは、コンピュータに処理させたい命令を逐
次記述して論理を組み立てていきます。NetCOBOL for .NETのプログラミングは、これに加えて、クラスという機能の組み合わせでプログラ
ムを作成していきます。例えば、パソコンの自作を考えてみてください。
色々な電子部品を買ってきて、回路図を見ながらハンダづけして、マザ
ーボードやグラフィックカードなどのパーツを作り、ひとつずつ組み立
てていくのが、手続き型のプログラミングに相当します。マザーボード
を作るときに結線を間違ったり、グラフィックカード作成時に冷却ファ
ンを付け忘れたりして、個々のパーツの信頼性が低くなってしまうこと
があるかもしれません。これらの自分で作成したパーツを組み立てて正
常に動作するパソコンを作り上げるというのは、大変なことですね。 これに対して、クラスを使用したプログラミングは、市販のマザーボ
ードやグラフィックカード、ハードディスクなど固有の機能を持ったパ
ーツを揃えて、それらを組み上げてパソコンを作るというイメージにな
ります (図3-1-1) 。自分で電子部品から作成して組み立てるより、十分実績のある市販のパーツを利用した方が、品質も良く、きっと出来上が
りも早いことでしょう。
IC
抵抗
コード
回路図+ハンダ付け
組み立て
クラス
クラス クラスの
組み合わせ
PROCEDURE DIVISION.OPEN OUTPUT 印刷ファイル.ACCEPT 印刷レコード.IF 印刷レコードMOVE 0 TO END-FLG.ACCEPT NOTHING”
TO PRM-DATA(1).DISPLAY PRM-DATA(1).DISPLAY 2 UPON ARG-NUM.IF PWD-CHECK = "OK" THENMOVE 0 TO PROMGRAM-STATUSELSEMOVE -1 TO PROGRAM-STATUSWRITE 印刷レコード.MOVE 0 TO END-FLG.CLOSE 印刷ファイル.END PROGRAM.
クラス
クラス
クラス
クラス
パーツ
部品
WRITE
READ
MOVE
OPEN
命令の
組み合わせ
図3-1-1
20
Copyright 2006-2009 FUJITSU LIMITED
-
3.1 手続き型プログラミングとの違い
21
Copyright 2006-2009 FUJITSU LIMITED
NetCOBOL for .NETのプログラミングでは、この例のように、いかに既成の実績のあるものを使いこなすか、つまり、クラスを使いこなす
かがポイントとなってきます。 そのためには、どこにどのようなクラスがあり、どのような機能を持
ち、どのような使い方をするのかを知る必要があります。 通常、言語製品には、使用可能なクラスの集まりであるクラスライブ
ラリが添付されています。そこから必要な機能を実現してくれるクラス
を選択して使っていけばよいわけです。 NetCOBOL for .NETでも同様に、クラスライブラリが提供されてい
ます。これは正確にいうと、マイクロソフトが提供する .NET Frameworkに添付されているものです。ここでは、詳しく触れませんが、Framework (フレームワーク ) とは、枠組み、骨組みという意味で、NetCOBOL for .NETが動作する基盤システムと理解しておいてください。
-
3.2 クラスとオブジェクト
3.2 クラスとオブジェクト では、クラスとはどのようなものかを、もう少し詳しく見ていきまし
ょう。前項で「クラスという機能の組み合わせ」でプログラムを作って
いくと書きましたが、クラスは、機能だけでなく、データと機能が一体
化したものです。クラスの持つ機能 (処理 ) を「メソッド」、データを「プロパティ」と呼びます。1つのクラスが複数のプロパティやメソッ
ドを持つことができます。例えば、従業員マスタメンテの処理をクラス
で考えてみましょう。
従業員番号
データ(プロパティ)
氏名
年齢
追加
機能(メソッド)
修正
削除
照会
・・・
従業員マスタメンテクラス
図3-2-1
図3-2-1のようなクラスが考えられると思います。機能 (処理 )とデータ
をセットとして持っていますね。このクラスは、従業員データに対して、
追加、修正、削除、照会の4つの機能を持ったクラスとなります。このクラスを使って、従業員データに対して処理を行うことができますが、
クラスを作っただけでは何もできません。2章で説明したように、クラスは定義にしか過ぎないのです。 このクラスの機能を使用するためには、メモリ上に実体を作ってやら
なければなりません。そして、この実体を作ることを「インスタンス
化」といい、作成した実体を「オブジェクトインスタンス」と呼びます。
これらの呼び方は、市販の本などによって呼び方が異なるので、混乱し
ないようにしてください。
22
Copyright 2006-2009 FUJITSU LIMITED
-
3.2 クラスとオブジェクト
例えば、インスタンス化をオブジェクト化と言ったり、インスタンス
オブジェクトをオブジェクトと言ったり、インスタンスと言ったりしま
す。どれも間違いというわけではありませんが、本書では、前者を「イ
ンスタンス化」、後者を「オブジェクト」と呼ぶことにします。クラス
は、このインスタンス化によるオブジェクト生成によって使用可能とな
るのです。 このように書くと難しそうですが、2章で説明したように、メモリ上
に新しい領域を確保して、手続きを含んだ定義情報であるクラスをこの
領域にローディングして、いつでも制御を渡せる状態にするということ
でしたね。 では、オブジェクトに処理をさせるためには何を行えばよいのでしょ
うか。オブジェクト指向関係の本には、よく「オブジェクトにメッセー
ジを送って処理を依頼する (メッセージパッシング )」という記述があります。手続き型COBOLのプログラマーは、こういう記述を読んでも混乱してしまいます。「メッセージ?オンラインプログラムと何か関係が
あるのかな?」などと考えてしまいませんか。概念としてはそうなるの
でしょうが、実際には、サブルーチンに処理を依頼する考えと同様に、
メモリ上のオブジェクトを呼び出して利用しているにすぎません。具体
的には、そのオブジェクトが持つメソッドを指定して処理を依頼するこ
とになります。 ところが、オブジェクトは複数生成可能でしたね。メソッドだけを指
定したのでは、どのオブジェクトのメソッドなのか判断がつかなくなっ
てしまいます。そこで、処理の依頼時には、依頼する処理を特定するた
めに、オブジェクトを指定してメソッドを呼び出します (図3-2-2) 。
23
Copyright 2006-2009 FUJITSU LIMITED
-
3.2 クラスとオブジェクト
24
Copyright 2006-2009 FUJITSU LIMITED
メソッドA
オブジェクト1
メソッドA
オブジェクト2
メソッドA
オブジェクト3
メソッドA
オブジェクト名 +メソッド名 で指定する。(例)オブジェクト2のメソッドAオブジェクト名 +メソッド名 で指定する。(例)オブジェクト2のメソッドA
メソッドAって?どれ?
一意に識別一意に識別
クラス インスタンス化
特定が可能
図3-2-2
このように、メソッドを呼び出してクラスの持つ機能を利用し、従来
の IF文やMOVE文などのCOBOL命令と組み合わせてプログラミングを行います。
-
3.3 クラス使用の考え方
3.3 クラス使用の考え方 3.1章で説明したように、NetCOBOL for .NETで使用するクラス
は、 .NET Frameworkに添付されて提供されます。プログラミング時には、この中から、自分のやりたいことを実現してくれるクラスを選択し
て使用することになります。 では、何を見て選択すれば良いのでしょう。以下のように、メニュー
をたどって表示される画面を見てください (図3-3-1)。 スタートメニュー- [すべてのプログラム ] - [Microsof t Visual Studio 2008] - [Microsof t Visual Studio 2008ドキュメント ]
図3-3-1
この画面の左側にある目次から「 .NETの開発」-「 .NET Framework
SDK」-「 .NET Framework」-「 .NET Framework クラスライブラリ」を選択して、次の画面を表示します (図3-3-2)。
25
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
「 . N E T F r a m e w o r k クラスライブラリリファレンス」
名前空間
図3-3-2
この画面をスクロールして、Systemを表示します (図3-3-3)。
「System」
図3-3-3
26
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
クラスは、リファレンスの中に名前空間という概念で機能別に分類さ
れています。名前空間というとわかりにくいのですが、たくさんのクラ
スを階層構造で整理したフォルダと考えてください。そして、この名前
空間には、整理という役割の他にもうひとつの役割があります。クラス
の識別という役割があるのです。例えば、このクラスライブラリには、
Buttonというクラスはふたつ存在します。同じ名前であっても、機能も用途も異なるクラスです。単にクラス名だけでは識別できませんが、次
のように、上位の名前空間を含めて指定することにより、一意に定める
ことができるのです。 ◎System.Web.UI.WebControls.Button…
System.Web.UI.WebControls配下にあるButtonクラス
◎System.Windows.Forms.Button…
System.Windows.Forms配下にあるButtonクラス
Windowsのファイルフォルダと同じような考え方ですね。 では、リファレンスにどのような内容が記述してあるのかを1つの名
前空間を例として、階層構造に従って見ていきましょう。ここでは、
System名前空間を取り上げます。図3-3-3の名前空間の下部にある「System」を見てみると、次のような概要が記述してあります。
「一般的に使用される値型と参照データ型、イベントとイベント
ハンドラ、インターフェース、属性、および処理例外を定義する
基本クラスが含まれています。その他のクラスには、データ型の
変換、メソッド パラメーターの操作、数値演算、リモート プロ
グラムまたはローカル プログラム呼び出し、アプリケーション環
境の管理、およびマネージ アプリケーションとアンマネージ ア
プリケーションの監視をサポートするサービスが用意されていま
す。」
見慣れない言葉がたくさん出てきますね。このような記述を読み解き
ながら、クラスを使いこなすのが最終的な姿なのでしょうが、今の段階
では、手がかりの言葉だけを抜き出すレベルで、クラスの機能の見当を
つけていくしかありません。 この記述では、「値型、データ型の変換、数値演算」などでしょうか。
どうやらこの名前空間には、文字や数値を操作するクラスが含まれてい
そうです。 では「System」をクリックして、ひとつ下位の画面を見てみましょう。
27
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
次のような画面が表示されます (図3-3-4) 。
クラス名を アルファベット順に表示
クラスの概要
図3-3-4
「System名前空間」には、クラス、構造体、デリゲート、列挙体の一
覧がありますが、ここではクラスの一覧を見ていきましょう。クラスは
アルファベット順に並べられ、右欄にその概要が記述されています。 詳しい解説を読みたい時には、クラスの名称をクリックして、さらに
下位の説明を参照することになります。ここでは、6章で取り上げるStr ingクラスを見てみましょう。クラスの一覧から「Str ing」をクリックすると、次のような画面が表示されます (図3-3-5) 。
28
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
「メンバ」をクリックすると、
このクラスが持つメソッドや プロパティを表示
「構文」を 折りたたむ
「解説」にクラスが持つ
メソッドの説明あり
図3-3-5
この画面の「解説」に、このクラスのメソッドが持つ機能が記述され
ています。ここで、自分が必要なメソッドの見当をつけます。「メン
バ」をクリックすると、このクラスが持つメソッドやプロパティの一覧
を確認することができます (図3-3-6) 。
29
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
St r i n gクラスが持つ メソッドやプロパティの一覧
図3-3-6
この一覧からメソッドやプロパティを選択し、使用例をクリックする
と、次のような画面で使用例が表示されます (図3-3-7) 。
30
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
「使用例」を
クリック
図3-3-7
しかし、Visual BasicやC#などの使用例はありますが、COBOLの使
用例がないのが残念なところです。慣れてくれば、解説だけでクラスを
使えないことはありませんが、やはり使用例が理解できるにこしたこと
はないようです。本書では、6章に、よく使うクラスのCOBOLでの使用例を紹介していますので、参考にしてください。
では、どんな考え方でクラスを探していくか、具体例で見ていきまし
ょう。本書の演習で使用する機能を実現するクラスを実際に探してみま
しょう。演習では、Webアプリケーションの一部を作成します。Webアプリケーションとは、NetCOBOL for .NETで作成できるアプリケーションの形態のひとつです (詳細は4.1章で説明 ) 。このアプリケーションが動作するときのカレントディレクトリは、システムフォルダ
(WINDOWS¥sys tem32など ) です。しかし、演習で使用する画面、プログラム、データはシステムフォルダではなく、ユーザーが作成したフ
ォルダに存在します。 演習では、3つの索引ファイルをサブルーチンによって読み込む処理
を行っています。このプログラムのファイル識別名と実ファイルとの対
応付けを、アプリケーション構成ファイル (web.conf ig) で行っていま
31
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
す (5章 演習参照 ) 。ここで定義している実ファイル名にパスが記述されていますが、パスを記述せずにそのまま実行すると、COBOLは現在のカレントディレクトリであるシステムフォルダに索引ファイルを探し
にいき、「ファイルがありません」というエラーで異常終了します。実
ファイル割り当てのためには、サブルーチンによるファイルアクセスの
前に、検索すべきフォルダをプログラムやデータの存在するフォルダに
変更する必要があります (図3-3-8) 。
カレントディレクトリ
WINDOWS¥system32
Webアプリケーション
索引ファイルアクセスサブルーチン
ユーザフォルダ(索引ファイル存在)
変更要
(Webアプリケーション動作時)
図3-3-8
そこで、「アプリケーションのカレントディレクトリを変更する」と
いう機能を持つクラスを探していきましょう。 クラスを探すためには、提供されているリファレンスを検索していく
必要がありましたね。それでは、スタートメニューから[すべてのプロ
グラム]- [Microsof t Visual Studio 2008ドキュメント ]から始めて、前述の手順で図3-3-9の「名前空間」の画面を表示してみましょう。
32
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
(1) .NET Frameworkクラスライブラリの中から、名前空間の概要を確認し、目的に合う名前空間を探します (図3-3-9) 。
名前空間の概要
図3-3-9
名前空間は、機能別に分類されています。 よく使用する名前空間を以下に挙げておきます。
System:基本クラス、データ型やアプリーション実行に関する重要なクラスが含まれる。
System.Data:データベ-ス関連 System.IO:入出力、ファイル、ディレクトリ System.Web:Web関連、HTTPなど System.Xml:XMLサポート機能 名前空間の説明時にも見ましたが、System名前空間には、次のような
記述があります。 System
説明>
一般的に使用される値型と参照データ型、イベントとイベント ハ
ンドラ、インターフェース、属性、および処理例外を定義する基
本クラスが含まれています。
33
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
その他のクラスには、データ型の変換、メソッド パラメーターの
操作、数値演算、リモート プログラムまたはローカル プログラ
ム呼び出し、アプリケーション環境の管理、およびマネージ アプ
リケーションとアンマネージ アプリケーションの監視をサポート
するサービスが用意されています。
「アプリケーション環境の管理」という言葉が出てきています。ひょ
っとしたら、ここに該当するクラスがあるかもしれません。 Sys tem名前空間を見てみましょう。
(2) System名前空間にあるクラス一覧の記述内容から、該当しそうなクラスの見当をつけていきます。
「E n v i r o n m e n t」クラス
図3-3-10
Environmentクラスに次のような記述があります (図3-3-10) 。 Environment
説明>
現在の環境およびプラットフォームに関する情報、およびそれら
を操作する手段を提供します。このクラスは継承できません。
34
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
「現在の環境」、「それらを操作する手段」という言葉が関係してい
そうですね。このEnvironmentクラスを見てみましょう。
(3) メンバの一覧を見るために「Environmentメンバ」を参照します。 メンバとは、そのクラスに含まれるプロパティやメソッドなどのこと
です。 パブリックプロパティの中に、それらしきCurrentDirectoryプロパテ
ィがありました (図3-3-11) 。
「C u r r e n t D i r e c t o ry」
図3-3-11
CurrentDirectory
説明>
現在のディレクトリ(このプロセスの開始ディレクトリ)の絶対パ
スを取得または設定します。
まさに、やりたいことが書いてありますね。Environmentクラスの
CurrentDirectoryプロパティを使用すれば、ディレクトリの設定ができそうです。
35
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
(4) このプロパティを使用してプログラムを記述すると、次のようになります。
処理例 )カレントディレクトリを「C: ¥WORK」 に設定する。 ①②:必要となるリファレンスで探したクラスやプロパティをプログ
ラム内で使用できるように、内部名と対応付けて宣言します。 ③:定義した名前で、EnvironmentクラスのCurrentDirectoryのプロ
パティに索引ファイルが存在するディレクトリである「C:¥WORK」 を設定しています。
このコーディング例には、REPOSITORYとかCLASS、PROPERTYな
ど見慣れない文や句が出てきますが、詳細は4章で説明します。ここでは、イメージだけを捉えてください。③の処理後にファイルをアクセス
するサブルーチンを呼び出すと、「C:¥WORK」ディレクトリから索引ファイルが検索されます。
このように、おおよその見当をつけながら、目的のクラスを探し当て
ることになります。最初から目的のクラスを探すのはなかなか難しいも
のです。おおよその見当がついたら、名前空間にあるクラスを順番に参
照しながら判断していくことが必要です。これを繰り返してクラス探し
に慣れていってください。 <クラスの探し方>
以上のように階層構造をたどって探すやり方のほかにも探し方がある
ので、紹介しておきましょう。
REPOSITORY. CLASS CLASS-Environment AS "System.Environment" ・・・・・① PROPERTY PROP-CURRENTDIRECTORY AS "CurrentDirectory"・ ・・・・・・② .... SET PROP-CURRENTDIRECTORY OF CLASS-Environment TO "C:¥WORK". ・・・・③
手順1 [Microsof t Visual Studio 2008ドキュメント ]で開いた画面の目次から「開発ツールと開発言語」-「Visual Studio」-「Visual Studio で
36
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
の .NET Framework プログラミング」-「技術のクイックリファレンス」が存在します (図3-3-12) 。ここには、機能別に分類した使用例などが豊富に存在します。この中から目的にあった機能を探します。
「技術のクイック
リファレンス」
図3-3-12
手順2 ある程度クラス名やプロパティ名が予測できれば、キーワードを入力
して目的のクラスやプロパティを探すこともできます。例えば、今回
探したいカレントディレクトリ=CurrentDirectoryというキーワードでリファレンスを検索すればよいわけです。リファレンスの画面のヘ
ルプメニューから [検索 ]と選択すれば、検索画面が表示されます。この画面に、以下のように検索キーワードを指定して検索ボタンをクリ
ックすると、検索結果が表示されます (図3-3-13) 。
37
Copyright 2006-2009 FUJITSU LIMITED
-
3.3 クラス使用の考え方
38
Copyright 2006-2009 FUJITSU LIMITED
検索キーワード指定 検索結果
図3-3-13
画面下部の検索結果から「Environment .CurrentDirectoryプロパティ」を選択してクリックすると、キーワード検索結果画面に見つかった
トピックが表示されます。要約の箇所で「 .NET Framework クラスライブラリ」と表示されていれば、 .NET Frameworkクラスの説明です。 .NET Frameworkのドキュメントには、クラスのリファレンス以外にも様々なドキュメントが含まれています。検索時には、このような文
書も検索結果として表示されることがあるので、クラスの説明かどうか
の判断は、要約で行えばよいでしょう。
-
3.3 クラス使用の考え方
◇MEMO◇
39
Copyright 2006-2009 FUJITSU LIMITED
-
第4章 NetCOBOL for .NET
プログラムの開発
それでは、具体的にNetCOBOL for .NETのプログラム開発に入って
いきましょう。開発環境やプログラムの構造、開発の手順、クラスを使
うための手順などを見ていきます。アプリケーションの形態によっては、
同じCOBOLと言っても手続き型COBOLとかなり違った構造を持ち、また新たな命令を駆使してプログラミングしていくことになります。
4 .1章で説明するように、いろいろな形態のアプリケーションが作成可能ですが、以降の演習や具体例などは、Webアプリケーションを中心に説明していきます。
Copyright 2006-2009 FUJITSU LIMITED
40
-
4.1 作成できるアプリケーションの種類
4.1 作成できるアプリケーションの種類 手続き型COBOLでは、バッチやオンラインのアプリケーションが作
成できたように、NetCOBOL for .NETでもいろいろな形態のプログラムを作成することができます。しかし、ゼロから作成していく必要はな
く、各形態のアプリケーションのテンプレートが提供されています。形
態毎に雛型プログラムが準備されていると考えてください。このテンプ
レートを選択して、必要部分の修正、追加により、プログラムを作成し
ていきます。以下に、作成できる主なアプリケーションについて説明し
ます。
コンソールアプリケーション
Windows
コンソールウィンドウ
ACCEPT
DISPLAY
コンソール
アプリケーション
図4-1-1
この形態のアプリケーションは、手続き型COBOLプログラマーには最も馴染みのある形です。従来のバッチプログラムをイメージしてくだ
さい。画面は使用できませんが、バッチプログラムと同様に、COBOLの小入出力機能 (ACCEPT文やDISPLAY文 )により、コンソールウィンドウから文字を受け取ったり、書き込んだりすることができます。プログ
ラムの形態も従来の手続き型COBOLと同じ形です。1章では、オフコンから移行したCOBOLバッチプログラムを、この形態のアプリケーションとして動作させたわけです。
Copyright 2006-2009 FUJITSU LIMITED
41
-
4.1 作成できるアプリケーションの種類
Windowsアプリケーション
Windows
Windows GUI 画面
Windows
アプリケーション
図4-1-2
この形態のプログラムは、画面の入出力を行う、スタンドアロンやク
ライアントサーバの環境で動作するアプリケーションです。手続き型
COBOLでは、画面設計ツール (NetCOBOL for Windowsで提供しているFORMなど )で画面定義体を作成し、画面に対してREAD/WRITEを行うことで画面の入出力を行ってきました。 本形態では、画面を、開発ツールであるVisual Studioが持つフォーム
デザイナを使用して作成することになります。作成された画面を
「Windowsフォーム」と呼びます。プログラムは、Windowsフォームから自動生成されます。この生成されたプログラムはオブジェクト指向の
プログラムで、手続き型のCOBOLと構造が大きく異なります。 プログラマーは、画面の入出力のREAD/WRITEの命令を直接記述す
る必要はなく、画面の表示などの基本機能は自動生成されています。し
かし、自動生成されたものは雛型であり、基本機能が作られているだけ
で、処理としては何の機能も持っていません。プログラマーが必要な処
理を追加することにより、プログラムを完成させます。
Copyright 2006-2009 FUJITSU LIMITED
42
-
4.1 作成できるアプリケーションの種類
ASP.NET Webアプリケーション(ASP.NET Webサイト)
Webアプリケーション
ブラウザ
WindowsサーバWindowsクライアント
Web GUI画面
図4-1-3
この形態のプログラムは、画面の入出力を行うWeb環境で動作するア
プリケーションです。画面やプログラムの考え方は、画面の名称をWebフォームと呼ぶこと以外は、Windowsアプリケーションと同様です。 ただし、プログラムが動作する環境が異なるため、自動生成されたプ
ログラムが使用しているクラスや、プログラマーが使用するクラスの多
くは、Windowsアプリケーションとは異なります。本書では、この形態のアプリケーションを中心に説明していきます。
Copyright 2006-2009 FUJITSU LIMITED
43
-
4.1 作成できるアプリケーションの種類
Copyright 2006-2009 FUJITSU LIMITED
44
XML Webサービス
Webアプリケーション
ブラウザ
WindowsサーバWindowsクライアント
Web GUI画面
Webサービス
Windowsサーバ
図4-1-4
Webサービスには幅広い意味がありますが、ここでは、Web上で公開され、様々なアプリケーションと連携しながら業務処理を受け持つ、画
面を持たないプログラムというレベルの説明で止めます(図4-1-4はWebアプリケーションとの連携例)。詳細については、書籍やインターネットなど様々な情報源がありますので、次のステップで勉強してみて
ください。
クラスライブラリ
NetCOBOL for .NETプログラムでは、提供されたクラスを使用してプログラミングを行いますが、使用したいクラスを新たに作成すること
もできます。作成したクラスは、 .NET Frameworkで提供されているクラスライブラリのクラスと同様に、 .NET環境の他言語(Visual Basic、C# など)からも利用可能になります。
-
4.2 開発環境
4.2 開発環境 プログラム開発の前に、開発環境について見ておきましょう。
NetCOBOL for .NETの開発では、開発ツールとして、Visual Studioを使用します。この環境では、資産はソリューションとプロジェクトとい
う2つの単位で管理されます。プログラム開発のためには、この両方が
必要になります。プロジェクトとは、プログラム単位に必要なソースや
画面などのファイルの集まりと考えてください。プロジェクトを1つ以
上まとめたものが「ソリューション」となります (図4-2-1)。
ソリューション
プロジェクトA
画面ファイル
COBOLソースファイル
登録集ファイル
プログラム
プログラム
プロジェクトB
画面ファイル
COBOLソースファイル
登録集ファイル
・・・
図4-2-1
プログラム開発には、まずプロジェクトを作成します。もし、1つし
かプロジェクトを作成しないのであれば、これが自動的にソリューショ
ンとして認識、作成されます。この場合は、「1プロジェクト=1ソリューション」というわけです。 この作成したソリューションにプロジェクトを追加していけば、「1
ソリューション=nプロジェクト」のソリューションを作成することができます。管理したい形態にあわせて、プロジェクトやソリューション
を設定します。本書の演習は、2プロジェクト=1ソリューションのパターンで作成しています。Visual Studioでの開発時、次のような画面で画面デザインを行います (図4-2-2)。
Copyright 2006-2009 FUJITSU LIMITED
45
-
4.2 開発環境
開発画面(画面デザイン時)
図4-2-2
メニューバー
ツールバー
プロパティ
ウィンドウ
ソリューション
エクスプローラ
デザイナ
出力ウィンドウ
ツールボックス
開発画面は、複数のウィンドウから構成されています。それぞれのウ
ィンドウを見ていきましょう。
Copyright 2006-2009 FUJITSU LIMITED
46
-
4.2 開発環境
デザイナ
図4-2-3
デザイナとは、画面をデザインするためのウィンドウです (図4-2-3)。
Windowsフォームアプリケーション作成時は「Windowsフォームデザイナ」、Webフォームアプリケーション作成時には「Webフォームデザイナ」となります。Visual Basicなどのように、GUIを使用して非常にビジュアルな画面が簡単に作成できます。
Copyright 2006-2009 FUJITSU LIMITED
47
-
4.2 開発環境
ツールボックス
部品を選択して、 画面に貼り付け
「ツールボック
ス」をクリック
して表示
ピンマークのボタンで 「常に表示」と「自動的に隠す」
を切り替え
図4-2-4
ツールボックスとは、デザイナに表示された画面に貼り付ける各種部
品を選択するメニュー画面です (図4-2-4)。このボックスから各種部品を選択して、デザイナ画面に貼り付けて画面を作成します。これらの部品
のことを「コントロール」と呼びます。NetCOBOL for .NETの世界では、このひとつひとつのコントロールがクラスとして扱われます。クラ
スですから、それぞれが機能 (メソッド )を持ち、値 (プロパティ )を持っています。例えば、TextBoxコントロールは、どのようなメソッドとプロパティを持っているのでしょうか。このコントロールは、入力された
文字をクリアしたり、文字を追加したりするメソッドを持っています。
また、縦の大きさ、横の大きさ、色などをプロパティとして保持してい
ます。3章で学んだ手順で、リファレンスを「TextBox」のキーワードで検索して、内容を確認してみてください。プロパティは画面作成時に
変更も可能ですし、プログラム中からの参照や更新も可能です。これら
のコントロールは、プログラムの実行時に自動的にオブジェクトとして
生成されるので、プログラマーがオブジェクトを生成する必要はありま
せん。これにより、プログラマーはオブジェクトを生成することなしに、
プロパティの値を設定、参照したり、メソッドを使用したりすることが
できます (図4-2-5)。
Copyright 2006-2009 FUJITSU LIMITED
48
-
4.2 開発環境
ラベルコントロール
ラベルコントロール
ラベルコントロール テキストボックスコントロール
テキストボックスコントロール
ボタンコントロール ボタンコントロール
ラベルオブジェクト
プロパティ
メソッド
(Webフォーム)
(Webフォーム) テキストボックスオブジェクト
プロパティ
メソッド
ボタンオブジェクト
プロパティ
メソッド
・・
・・
(Webフォーム)
プロパティやメソッドが使用可能
システムにより実行時に生成
図4-2-5
ソリューションエクスプローラ
参照設定
(アセンブリ )
開発資産
図4-2-6
ソリューションエクスプローラとは、プロジェクトやソリューション
内の開発資産を階層構造で表示するウィンドウです (図4-2-6)。また、プロジェクトやソリューション内で使用するクラスが含まれるアセンブリ
Copyright 2006-2009 FUJITSU LIMITED
49
-
4.2 開発環境
の一覧 (参照設定 )も表示します。クラスの論理的グルーピングの単位が名前空間であるのに対して、物理的なグルーピングの単位を「アセンブ
リ」と言います。アセンブリは、たくさんのクラスを含んだライブラリ
と考えてください。1つのアセンブリに複数の名前空間が含まれたり、1つの名前空間が複数のアセンブリに分かれたりしています。プロジェク
トやソリューション内でクラスを使用するためには、使用したいクラス
を含むアセンブリが、この参照設定に存在する必要があります。名前空
間と同じ名称のものがありますが、参照設定に設定されているものはア
センブリであり、名前空間ではないことに注意してください。作成する
アプリケーションのテンプレートを選択した時点で、プログラムが動作
する基本的なアセンブリは自動的に設定されています。しかし、プログ
ラマーが使用したいクラスが含まれるアセンブリが本ウィンドウに存在
しなければ、プログラマーが必要なアセンブリを追加してやらなければ
なりません。詳細は、「4.5 クラス利用の手順」で説明します。
プロパティウィンドウ
図4-2-7
プロパティウィンドウとは、ソリューションやプロジェクト、画面に
貼り付けたコントロールなどが持つプロパティの設定を行うためのウィ
ンドウです (図4-2-7)。ツールボックスで説明したように、画面のコントロールは、プロパティ (データ )を持っています。画面上のコントロールをクリックすると、そのコントロールの持つプロパティがこのウィンド
ウに表示され、設定項目を変更することができます。
Copyright 2006-2009 FUJITSU LIMITED
50
-
4.2 開発環境
Copyright 2006-2009 FUJITSU LIMITED
51
コードエディタ
図4-2-8
コードエディタとは、COBOLソースを記述するためのエディタです(図4-2-8)。ソリューションエクスプローラに表示されているCOBOLソースファイルをダブルクリックしたり、デザイナ上で右クリックして表
示したメニューから [コードの表示 ]を選択したり、様々な方法で表示できます。単なる編集機能だけでなく、予約語の色を変更する機能や、使
用するクラスのメソッド名やプロパティ名の入力時に、有効なメソッド
名やプロパティ名が一覧表示されるインテリセンス機能など、プログラ
ム作成の効率向上のための機能も備えています。
出力ウィンドウ
プログラム開発時に出力されるビルドの結果やデバッグ時の出力など
の様々なメッセージが出力されます (図4-2-9)。
図4-2-9
-
4.3 プログラムの構造
4.3 プログラムの構造
IDENTIFICATION DIVISION.CLASS-ID. クラス名ENVIRONMENT DIVISION.CONFIGURATION SECTION.SPECIAL-NAMES.REPOSITORY.
END CLASS クラスID.
OBJECT. [データ部] [手続き部][メソッド定義][メソッド定義][メソッド定義]
END OBJECT.
クラス定義
オブジェクト定義
環境部
・・
OBJECT. DATA DIVISION.データ定義
PROCEDURE DIVISION.METHOD-ID. A. DATA DIVISION.データ定義
PROCEDURE DIVISION. 処理ロジック
END-METHOD-A.
METHOD-ID. B.DATA DIVISION.データ定義
PROCEDURE DIVISION. 処理ロジック
END-METHOD-B.
END OBJECT.
・・・・・・
オブジェクト定義
①
②
②
図4-3-1
ここでは、作成するプログラムの構造を見てみましょう。図4-3-1に示すように、手続き型COBOLのプログラムとかなり構造が異なっています。NetCOBOL for .NETでは、1章で見たようなコンソールアプリケーション以外は、プログラムを作成するのではなく、クラスを作成する
と考えてください。クラス定義の中は、環境部とオブジェクト定義部に
分かれます。オブジェクト定義部の中にデータ定義やメソッド定義を記
述します。上記図右のオブジェクト定義の展開を見てください。各メソ
ッドが使用するデータを「DATA DIVISION」に定義しますが、各メソッド共通に使用するデータを①に、各メソッド固有に使用するデータを②
に定義します。②で定義したデータは、メソッド間で共有はできません。 メソッド定義は、手続き型COBOLのデータ定義と処理ロジックにあ
たる部分を記述します。全体の構造は異なるものの、クラスを使用しな
いメソッドであれば、手続き型のCOBOLプログラムと何ら変わりありません。どのように記述するのかは、次の開発の手順で見ていきましょ
う。
Copyright 2006-2009 FUJITSU LIMITED
52
-
4.4 開発の手順
4.4 開発の手順 大きな開発の流れは、図4-4-1のようになります。この手順に沿って
見ていきましょう。
プロジェクトの作成プロジェクトの作成
画面のデザイン/COBOL手続きの記述画面のデザイン/COBOL手続きの記述
開発環境の起動開発環境の起動
実行・デバッグ実行・デバッグ
エラー対処エラー対処ビルド、リビルドビルド、リビルド
翻訳エラーなし翻訳エラー発生
図4-4-1
開発環境の起動
既存プロジェクト名
図4-4-2
Copyright 2006-2009 FUJITSU LIMITED
53
-
4.4 開発の手順
Windowsのスタートメニューから「NetCOBOL for .NET」を選択し、開発環境を起動します。このとき、図4-4-2のスタートページが表示されます。既存のプロジェクトが存在する場合には、その一覧が表示され
ます。既存のプロジェクトを操作したい場合には、一覧の中からプロジ
ェクトを選択します。一覧に表示されていない場合は、 [ファイル ]メニュー- [開く ]- [プロジェクト /ソリューション ]から、既存のソリューションファイル ( . s ln)を選択します。
プロジェクトの作成
プロジェクトを新規作成するときは、 [ファイル ]メニュー- [新規作成 ]- [Webサイト ]を選択します。さらに、 [言語 ]ボックスで「Fuji t su NetCOBOL for .NET」を選択すると、図4-4-3の画面が表示されます。
プロジェクトを
作成する場所
「A S P. N E T We bサイト」を
選択
「F u j i t s u N e t C O B O L f o r . NE T」を選択
図4-4-3
4 .1章でNetCOBOL for .NETで作成できるアプリケーションの種類を
説明しました。これらのアプリケーションをゼロから作る必要がないよ
うに、雛型の選択をここで行うということなのです。テンプレートを選
択することにより、自動的に各形態のアプリケーションを動作させるた
めの基本的なアセンブリを参照設定に取り込んで、環境を設定してくれ
ます。今回は「ASP.NET Webサイト」を選択します。その際、ウィンドウ下部にプロジェクトを作成する場所を指定して、「OK」をクリックします。
Copyright 2006-2009 FUJITSU LIMITED
54
-
4.4 開発の手順
画面のデザイン/COBOL手続きの記述
デザイン画面とソース
(画面定義)の切り替え
図4-4-4
テンプレート選択後、図4-4-4の画面が表示されます。この画面で、使用するWebフォームのデザインを行います。では、ソリューションエクスプローラのウィンドウに注目してみましょう。いくつかのファイル
が自動生成されているのが分かります。ここで、ソリューションエクス
プローラの [Defaul t .aspx]配下を見てみましょう(図4-4-5)。
D e f a u l t . a s p x
D e f a u l t . a s p x . c o b x
図4-4-5
Copyright 2006-2009 FUJITSU LIMITED
55
-
4.4 開発の手順
まず、Dafaul t .aspxというファイルがあります。さらにその下位にDafaul t .aspx.cobxというファイルがあります。この正体は、拡張子がaspxのファイルが画面のフォーマットであり、cobxの拡張子を持つファイルがCOBOLソースです。見せる部分がaspxファイルで、処理する部分がcobxファイルというわけです。この2つのファイルでWebフォームが構成されています。他にもいくつかファイルがありますが、入門レベ
ルでは、この2つのファイルを押さえておけば十分でしょう。 ソリューションエクスプローラのDafaul t .aspx.cobxをダブルクリック
すると、画面左側 (図4-4-6)に自動展開されたCOBOLソースが表示されます。以降は、エディタ画面上部のタグをクリックすれば、画面フォー
マットとCOBOLソースの表示切り替えができます。
表示切り替え
展開された
C O B O Lソース
図4-4-6
この展開されたソースプログラムは、Webアプリケーションとして動
作する最低限のクラス定義とメソッドが設定されているだけです。処理
としては何の機能も持っていませんが、いくつか押さえておくべきポイ
ントがあります。まず、 IDENTIFICATION DIVISIONとREPOSITORYを見てみましょう。次のような記述があります。
Copyright 2006-2009 FUJITSU LIMITED
56
-
4.4 開発の手順
CLASS-ID. CLASS-THIS AS "_Default" PARTIAL INHERITS CLASS-PAGE. ・・・・・① ・ REPOSITORY. ・ CLASS CLASS-PAGE AS "System.Web.UI.Page"・・・・・②
②は、「“System.Web.UI .Page”というクラスは、このプログラムの中ではCLASS-PAGEと記述します。」という宣言です。NetCOBOL for .NETでは、リファレンスに記載されたクラス名を、上記のようにREPOSITORY段落で内部名に対応付けて、プログラム中では内部名で使用します。クラス名をそのまま使用するよりも、プログラムも見やす
くなりそうですね。①では、「CLASS-THISというクラスは、CLASS-PAGEを、つまり、“System.Web.UI .Page”クラスを継承しています。」ということを意味しています。“System.Web.UI .Page”クラスは、Webアプリケーションになくてはならない基本機能を持つクラスです。 この定義により、作成するクラス、つまりWebアプリケーションが、
“System.Web.UI.Page”クラスの子クラスとなり、その全ての機能を継承しているということになります。 展開されたプログラムで、もう1点確認しておきたい部分があります。
Page_Loadメソッドを見てみましょう。次のような記述になっています。
METHOD-ID. PAGE-LOAD AS "Page_Load". DATA DIVISION. LINKAGE SECTION. 01 sender OBJECT REFERENCE CLASS-OBJECT. 01 e OBJECT REFERENCE CLASS-EVENTARGS. PROCEDURE DIVISION USING BY VALUE sender e. END METHOD PAGE_LOAD.
このメソッドは、Webアプリケーション選択時には必ず展開されるメソッドです。そして多くの場合、ユーザーがコーディングを追加しなけ
ればならないメソッドです。Webアプリケーションは画面の入出力を行います。ここは、その画面に対する初期処理を記述するメソッドなので
す。例えば、画面入力項目の初期化、画面出力項目への初期値設定など
をこのメソッドに記述します。このメソッドを実行した後に、システム
が画面を出力してくれます。手続き型COBOLプログラムでは、プログラムの制御は上から下に流れ、画面の入出力も自分で制御しなければな
りませんでした。しかし、NetCOBOL for .NETでは、画面の入出力はシステムで実行してくれるので、項目の設定や編集、ファイルやDBの入出力などの必要な処理のみを記述すればよいのです。
Copyright 2006-2009 FUJITSU LIMITED
57
-
4.4 開発の手順
PAGE_LOADメソッド:画面に対する初期処理を記述する。 では、実際に画面をデザインしてみましょう。 フォームデザイナで、ツールボックスから必要なコントロールを配置
して画面を作成します。ボタンを1つ作って、次のような画面を作成し
てみます。
図4-4-7
作成したボタンをダブルクリックすると、ソースエディタに画面が遷
移し、ボタンを追加したことによって、COBOLプログラムに一部のステートメントが追加生成されます。
Copyright 2006-2009 FUJITSU LIMITED
58
-
4.4 開発の手順
追加された次のメソッドを見てみましょう。
METHOD-ID. Button1_Click PROTECTED. DATA DIVISION. WORKING-STORAGE SECTION. LINKAGE SECTION. 01 sender OBJECT REFERENCE CLASS-OBJECT. 01 e OBJECT REFERENCE CLASS-EVENTARGS. PROCEDURE DIVISION USING BY VALUE sender e. END METHOD Button1_Click.
メソッド内で使用する
データを定義
メソッドで行う処理を記述
これは、メソッドの名前 (But ton1_Click)を見れ