お仕事
明日というか今日から入院なので、そのまえにケリをつけるべく。
今書いてるプログラムは大して難しいところはなく、ふつーに Windows アプリケーションから SQL Server にアクセスするクライアント。ただデータベースがらみになると、RDBMS側のデータ構造をどう OOPL にマッピングするかを考える必要があり、その辺の基礎設計。
今回はちっちゃいプログラムで、かつ、それほどスキルが高くない人間がコード書けるようにしておく必要がある。前に Web のプログラム書いたときには
RDBMS側のテーブル一つに対応してクラス用意することにして、そこにフィールドに対応するメンバ変数を定義しておく。メンバ変数の名前は RDBMS のフィールド名と合わせることにして、フィールドに対応するメンバ変数のインスタンス作成・初期化・コピーなどは、実行時にリフレクションを使って動的に処理。
初期化はこんな感じで、他に deep copy とか用意。アクセス権の都合などを考えてこいつは基底クラスにして、サンプルとして1つのテーブルに対応する派生クラスを作りテスト。他は真似して書いてねって感じで引き継ぎ。
最近仕事だと、プログラム書くというより、プログラムを書くためのプログラムしか書いてない気がするな。もっとも、このレベルのプログラムだと UI もロジックも大して頭使わないから、多少なりとも面白いのはメタな部分と設計ぐらいだけど。
今書いてるプログラムは大して難しいところはなく、ふつーに 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 件のコメント:
コメントを投稿
この投稿へのリンク:
リンクを作成
<< ホーム