java:インターフェースを用いることでクラス毎の重複した記述を無くす

javaにはインターフェースという機能があります。
インターフェースとは、メソッドの仕様(メソッド名、戻り値、引数)のみを定義したものです。
インターフェース単独では処理を実行できませんが、そのインターフェースを実装したクラスを定義することで処理を実行可能になります。

インターフェースを利用するメリットとしては、重複した記述を無くせることがあります。
オブジェクトを参照する際にインターフェース名を指定することで、そのインターフェースを実装している全てのクラスを指すことができます。一つの記述で複数のクラスに対応させることができるので、クラスごとに同じ記述を行う必要が無くなり、保守性が向上します。

言葉だと通じにくいと思うので、サンプルコードを用意しました。

【サンプルコード】

まず、インターフェースとして、金融商品インターフェース(FinancialProductsインターフェース)を定義します。
このインターフェースは、1ヶ月後の商品価格を計算するメソッドを持ちます。

・FinancialProducts.java

 

次に、金融商品インターフェースを実装します。
単利商品クラス(SingleInterestProductsクラス)と、複利商品クラス(ComplexInterestProductsクラス)を実装します。
この2つのクラスは、共に1ヶ月後の商品価格を計算するメソッドを実装していますが、その実装内容(計算ロジック)は異なります。

・SingleInterestProducts.java

・ComplexInterestProducts.java

 

そして、単利商品クラスと複利商品クラスを使用するメインクラスです。
メインクラス内で定義している2ヶ月後の商品価格計算メソッドにて、金融商品インターフェースを参照することで、単利商品クラスと複利商品クラスを同じ記述で使用することができているのがポイントです。

・Main.java

【実行結果】


いかがでしたでしょうか。

インターフェースはjavaの基礎的な文法の一つです。
しかし、インターフェースは様々な形で応用されています。
例えば、配列のソートで独自定義を行う時にインターフェースの理解が必要になりますし、デザインパターンやフレームワークといったオブジェクト指向の設計手法でもインターフェースは頻出です。
そのため、単純に読める・コンパイルエラーにならないコードを書ける、というレベルの理解ではなく、これを使うと何が嬉しいのか、というレベルで理解するのが望ましい、と個人的には思います。

これからも、実務で役に立つ情報をお伝えできればと思います。
では、また来週!

マッチング処理のサンプルプログラム

マッチング処理(マスタデータとトランザクションデータを突き合わせる)のロジックについて、前回の記事で紹介しました。
サンプルプログラムを作成しましたので、参考までに紹介します。
言語はCOBOL(opensource COBOL)です。

【サンプルプログラム】

【マスタファイル】

・C:\tmp\a.txt

【トランザクションファイル】

・C:\tmp\b.txt

【出力ファイル】

・C:\tmp\c.txt

【標準出力】


いかがでしたでしょうか。

マッチング処理はそこそこ複雑なロジックなので、マッチング処理を使用するプログラムを前知識無しで目にすると戸惑うと思います。
しかし、前回の記事で紹介したフローが頭に入っていれば、プログラムも読めるようになると思います。
業務で開発するバッチプログラムでは頻出のロジックなので、前回の記事の内容と合わせて頭に入れておくことをお勧めします。

これからも、実務で役に立つ情報をお伝えできればと思います。
では、また来週!

マッチング処理のロジック

今回は、バッチプログラムで使われるロジックの一つである「マッチング処理」について説明します。
「マッチング処理」とは特にCOBOLではよく目にするロジックであり、マスタデータ(業務の基盤となるデータ。商品一覧、取引先一覧等。)とトランザクションデータ(業務で日々発生するデータ。販売履歴、入金履歴等。)を突き合わせる処理です。
マッチング処理を覚えておけば、実業務でバッチプログラムを作る時のヒントになりますし、開発者同士のコミュニケーションもスムーズになります。

突き合わせを行う時は、マスタデータとトランザクションデータで同じキー項目(商品コード、取引先コード等)を使用し、そのキー項目で昇順にソートした後、マスタデータとトランザクションデータを1件ずつ読み、キー項目が一致するかどうかで突き合わせを行います。
マスタデータとトランザクションデータでキー項目が一致した場合(マスタで管理しているもので取引が発生した)と、マスタのみキー項目が存在している場合(マスタで管理しているが取引は発生しなかった)は正常ケースですが、トランザクションのみキー項目が存在している場合(マスタで管理していないものが取引された)は異常ケースとなります。

マスタデータの一つのキー項目に対して、トランザクションデータの0~1つのレコードが対応する場合は、1対1マッチングと呼ばれます。2つ以上のレコードが対応することがある場合は1対nマッチングと呼ばれ、処理が少しだけ複雑になります。

フローチャートと例は以下の通りとなります。

【フローチャート】

【例】

・要件

商品名が管理されている商品マスタと、商品の販売履歴(トランザクション)をファイル形式で読み込み、商品名と販売日を別ファイルで出力したい。

・商品マスタのフォーマット

カンマ区切りの固定長ファイル。
商品コードでレコードを一意に特定できるようにデータをセットする。

・販売履歴のフォーマット

カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。

・出力ファイルのフォーマット

・商品マスタのレコード

・販売履歴のレコード

・処理の流れ

・出力ファイル


以上、「マッチング処理」でした。
少し複雑なロジックですが、ファイルをキーの昇順に並べて順番に読み込むことと、キーがマッチする場合・しない場合は具体的にどのような状況なのかをイメージすることがポイントになります。

次回は、サンプルプログラムを書いてより具体的に説明したいと思います。
では、また来週!

コントロールブレイクのサンプルプログラム

コントロールブレイク(キー項目が変わる度に何らかの処理を実行)のロジックについて、前回の記事で紹介しました。
サンプルプログラムを作成しましたので、参考までに紹介します。
言語はCOBOL(opensource COBOL)です。

【サンプルプログラム】

【入力ファイル】

・C:\tmp\a.txt

【出力ファイル】

・C:\tmp\b.txt


いかがでしたでしょうか。
前回の記事ではプログラムまでは作成しなかったので、今回の記事ではプログラムも作成してみました。

今回はCOBOLでプログラムを作成したので、java等の他の言語を学んできた方にはわかりにくかったかもしれません。
しかし、COBOLは自然言語に近い書き方ができるという特徴があるので、経験が浅い方でもなんとなく雰囲気を感じ取ってもらえるのではないか、と個人的には思っています。
また、コントロールブレイクを使用する現場ではCOBOL資産に触れる機会が少なくないので、その意味でも慣れておいて損はないと思っています。

次回は、コントロールブレイクと並んで使用されることが多いロジックであるマッチングについて書いていきたいと思います。
では、また来週!

コントロールブレイクのロジック

今回の記事では、バッチプログラムで使われるロジックの一つである「コントロールブレイク」について説明します。
「コントロールブレイク」とは特にCOBOLではよく目にするロジックであり、キー項目(「商品番号」「顧客番号」「カード番号」等)順にソートされたデータに対して、キー項目が変わる度にタイトル出力や改ページ等を行うロジックです。
トランザクションファイル・トランザクションテーブル(履歴ファイル・履歴テーブル)を読み込み、帳票やハガキ等を出力する時に使われることが多いです。

フローチャートと例は以下の通りです。

【フローチャート】

【例】

・要件

商品の販売実績のデータをまとめたファイルを読み込み、商品毎にタイトルを付与して、別のファイルに出力したい。

・入力ファイルのフォーマット

カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。

・入力ファイルのレコード

・タイトル行のフォーマット

・処理の流れ

・出力ファイル


以上、「コントロールブレイク」でした。
このロジックを覚えておくと、バッチ処理を設計するのが楽になります。
プログラミングだけでなくExcelの資料作りにも役立つことがあり、意外と応用も効きます。

これまでも週1でブログを更新してきましたが、今後もこのような記事を週1ペースで書いていきたいと思います。
では、また来週!