或曰

火曜日, 1月 15, 2008

お仕事

明日というか今日から入院なので、そのまえにケリをつけるべく。

今書いてるプログラムは大して難しいところはなく、ふつーに Windows アプリケーションから SQL Server にアクセスするクライアント。ただデータベースがらみになると、RDBMS側のデータ構造をどう OOPL にマッピングするかを考える必要があり、その辺の基礎設計。

今回はちっちゃいプログラムで、かつ、それほどスキルが高くない人間がコード書けるようにしておく必要がある。前に Web のプログラム書いたときには
  • RDBMSからスキーマをXMLファイルに書き出し
  • C#のプログラムでXMLファイルを実行時に読み込み、データ構造を動的に作成
という処理にしてたけど、今回はもう少しライトウェイトにする方向で。

RDBMS側のテーブル一つに対応してクラス用意することにして、そこにフィールドに対応するメンバ変数を定義しておく。メンバ変数の名前は RDBMS のフィールド名と合わせることにして、フィールドに対応するメンバ変数のインスタンス作成・初期化・コピーなどは、実行時にリフレクションを使って動的に処理。
foreach (FieldInfo fi in GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField))
{
  Regex r = new Regex(@"^fld(\w+)");
  Match m = r.Match(fi.Name);
  if (!m.Success) continue;
  // new
  object o = fi.fieldtype.invokemember(
    null,
    BindingFlags.CreateInstance,
    null,
    null,
    new object[] { m.Groups[1].Value }
  );
  // this.fldXXX = o;
  GetType().InvokeMember(
    fi.Name,
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField,
    null,
    this,
    new object[] { o }
  );
  // this.fields.Add(o);
  fields.Add(o);
}

初期化はこんな感じで、他に deep copy とか用意。アクセス権の都合などを考えてこいつは基底クラスにして、サンプルとして1つのテーブルに対応する派生クラスを作りテスト。他は真似して書いてねって感じで引き継ぎ。

最近仕事だと、プログラム書くというより、プログラムを書くためのプログラムしか書いてない気がするな。もっとも、このレベルのプログラムだと UI もロジックも大して頭使わないから、多少なりとも面白いのはメタな部分と設計ぐらいだけど。

0 件のコメント:

コメントを投稿



この投稿へのリンク:

リンクを作成

<< ホーム