KEN's .NET

[第6回] Consoleアプリケーションでフィルタプログラム2 - 行番号付加プログラム仕様

ホーム > KEN's .NET > [第6回] Consoleアプリケーションでフィルタプログラム2 - 行番号付加プログラム仕様

前回はフィルタプログラムとは何?という話でしたが、今回からいよいよ作成に入ります。作成するプログラムは、 Webサイトにコードを掲載する際に利用する行番号付加プログラムです。
※私はVS.NETやVB.NET Standardなどを持っておらず、現在、使用しているのは.NET Framework SDK(SP1)です。

1.行番号付加プログラム仕様

ここでは、まず作成する行番号付加プログラムの仕様を以下のように決めたいと思います。
  • 実行ファイル名
    LN.EXE(行番号を付加する者→LineNumberer→LN)
  • 使用方法
    LN [/a[uto]] [/d[elimiter]:区切り文字列] [/f[igure]:桁数] [/p[adding]:桁揃え用の文字] [[ドライブ:][パス]ファイル名]
    (※ [ ]内は省略可能を表す)
  • 指定可能オプション
    • オプション指定(上記の/autoなど)はDOSコマンドの慣例に従って、以降スイッチと呼ぶことにする。
      参考→DOS/Vコマンド・リファレンス
    • スイッチは「/」に続くものとする。
      (例) LN /auto (autoがスイッチ)
    • スイッチは大文字/小文字を区別しない。
      (例) LN /auto
      (例) LN /AUTO (どちらもOK。aUtoでもOK)
    • スイッチに対するパラメータ指定は、スイッチの後に「:」を付加してそれに続けて記述する。
      (例) LN /figure:3 (スイッチfigureのパラメータとして3を指定)
    • スイッチはすべて省略可能とする。また、VBのコンパイラ(VBC)のようにスイッチには長い名称と短い名称の両方を使用可能とする。
      (例1) LN (最低限の使用方法)
      (例2) LN /a /padding:0 /d:: (スイッチにauto、padding(パラメータ0)、delimiter(パラメータ:)を指定)
  • スイッチ
    • figure  --- 付加する行番号の桁数を指定。省略時、4桁を指定とみなす。
    • padding  --- 行番号が桁数に満たないときに満たない分を埋める文字を指定。省略時、「 」(スペース)を指定したものとみなす。
    • delimiter --- 行番号と実際の行との間を区切る文字列。省略時、「:」を指定したものとみなす。
    • auto   --- 入力データの行数に合わせて最適な桁数に自動設定。この指定があるときは、figureの指定は無効。省略時、自動設定しないものとみなす。
    • ?     --- 一般的なDOSコマンド同様、使用方法を表示する。他のスイッチがある場合でも、このスイッチがあるときは、使用方法を表示して終わる。
    • ファイル名--- 「/」付きでないコマンドライン引数はファイルのパスを指定しているものとし、この場合、標準入力からではなく指定されたファイルを入力とする。 2つ以上のファイル指定がある場合、ファイルが無効(存在しない、アクセスできない等)の場合、エラーとする。
  • エラー処理
    無効なスイッチの指定はエラーとし、適切なメッセージを表示する。また、スイッチのパラメータが不正な場合も同様にエラーメッセージを表示する。 ファイル指定が2つ以上ある場合、ファイルが無効な場合はエラーとする。

2.クラス構成

このプログラムを構成する要素として、スイッチの解釈、スイッチ解釈時のエラー処理、行番号付加の3つの要素が考えられます。 そこで本体をLineNumbererクラス、スイッチ解釈をCommandLineSwitchクラス、エラー処理担当のConsoleErrorクラスとして作成します。 さらに、この行番号付加プログラムに固有ではなく、CUIプログラムで共通に使いそうな処理部分を雛型としてConsoleApplicationクラスにまとめます。 以下は、各クラスの主なプロパティ(またはインスタンス変数)、メソッドまで含めて記述したUML(Unified Modeling Language)のクラス図です。

行番号付加プログラムのUML
図1 行番号付加プログラムのクラス図


UMLはオブジェクト指向の標準の設計の表現方法です。UMLの詳しい情報はGoogleなどを使って調べてみて下さい。 (単純明快に今回関係あるところだけ説明してるようなサイトを見つけられなかったので)
さて、上図の見方を簡単に説明しますと
  • 1つの箱が1つのクラスを表す。
  • 箱の中身は、上からクラス名、属性(プロパティ)、振る舞い(メソッド)を記述する。
    すべてを記述する必要はなく、そのときそのときのポイントとなるものだけで十分。
  • それぞれの名称の左側に付いている「+」「-」はアクセス制限を表す。
    「+」がPublic、「-」がPrivate、今回はないが、「#」はProtected。
  • ( )の中は引数の型、「:」の後は戻り値の型。
  • アンダーラインは静的(VB.NETではShared(共有))であることを示す。
  • 抽象クラス、抽象メソッド(VB.NETではMustInherit、MustOverride)は斜体字(イタリック)で表現する。 (今回は使用したツールの都合で、個別に斜体字設定できなかったので、abstractと記述した)
  • 三角形+線で表される関係は継承関係。三角形の付いている側が基本クラス(スーパークラス)、 付いていない側が継承クラス(サブクラス)。
  • クラス間の線は関連を表し、その上の数値は多重度を表す。上記のクラス図で言うと、 LineNumbererクラス1つに対して、CommandLineSwitchクラスを複数(*)持っていることを表す。
すべての要素をこと細かに記述しなければならないというわけではなく、 そのときそのときで表現したいポイントに絞って、省略しても構いません。 今回は割と細かく書いています。

3.次回予告

今回は、行番号付加プログラムの仕様とクラスの構成及びUMLを示しました。まだ作成する各クラスの説明、 そこで使われる新しい技術要素の解説まで行けませんでした。次回はその辺を説明したいと思います。

4.サンプルソース

行番号付加プログラムのソース一式、コンパイル済みのEXE、コンパイルオプションのファイルなどをまとめました。 下記よりダウンロードできます。詳細はlzhを解凍した中に入っているReadMe.txtとこの連載をご覧下さい。

LineNumberer.lzh

ホーム > KEN's .NET > [第6回] Consoleアプリケーションでフィルタプログラム2 - 行番号付加プログラム仕様

[e-mail] yone_ken00@hotmail.com