今年も始まったらしいTech.Ed 2008。
どうも時間割を見ても僕的に熱くなれるものがなかったのと、もちろん興味深いのはあった。
体力的な問題と、金銭的な問題で今回は見送り。
最近、こつこつと汎用でありながらインテリセンスが有効になるようにこだわったデータ検索とデータ更新のクラスを作成したが、
(MakeGenericTypeが無かったらもうちょっと大変だった。)
今日はそれを利用した簡単なメンテナンスデータアクセス向けサービスのクラス群を自動生成するツールがやっとできた。
コードジェネレータは難しくないけど、力業だと思った次第。
これで、簡単なデータメンテナンスサービスや検索サービスについては、自動生成で対応できる。
クライアントを実装するときもちゃんと項目名がインテリセンスで出てくるように作ってあるから項目名のミスもないだろうし。
インタフェースは具象だからWCFテストクライアントでテストできるので楽ちん。
あとは認証部分のお勉強。
6 月 10 日に開催された Google Developer Day 2008 Japan にて、Google は技術ドキュメントの日本語化の推進を表明いたしました。Google Developer Day を開催した時点で既に多くの技術ドキュメントが日本語化されていましたが、この度話題の Google App Engine のドキュメントが日本語化されたことをお伝えいたします。
id:naoki0311さんのトラックバックで気づきましたがドキュメントが公式に日本語化されました。
元々、比較的平易な英文だったのとサンプル込みで頑張ればなんとかなるとは思っていましたが、日本語化されたのは、嬉しいですね。
最近、あまり触ってませんが(iPhoneにくびったけ)、iPhoneアプリとGoogle App Engineを連携できたらいいなぁと思っています。
ちなみに、公式に日本語化される今までの間、ドキュメント代わりにお世話になっていたのは、
http://d.hatena.ne.jp/hamatsu1974/20080424/1208980226
のサイトです。
最近、Google App EngineといいiPhone SDKといい2008年はアプリケーションインフラ変革の年だなと思います。
後から振り返ったとき2008年に始まったのだなと思えるような。そんな気がします。
私がフレームワークを作るときの無意識に採用している指針を思いつきで羅列して改めて意識してみる試み。
・めんどくさい事や、高度なことは全てフレームワーク側の責務。
・ユーザ(ここで言うユーザとはフレームワークを利用して開発をする人)は決められたストーリーに沿ったコードを書けばよい。
・だからユーザにオブジェクト指向を意識させない。
・ユーザから見たインタフェースはシンプルでなくてはいけない。
・一言で言えばテンプレートベースの開発。
・○○対策等(SQL挿入等)は可能な限りフレームワーク側で処理を行う。ユーザに、そのためだけのコードを書かせない。
・インテリセンスを有効活用できるようにする。
・コードを書かなくても良いが、書くことも可能である。
・拡張可能である。
・ユーザはSQLを書かなくてよい。書けば拡張できる。
・ユーザはDB製品を意識しなくてもよい。
・複雑さを集中させないための制限を作る。
(例えばコードの中に複数のテーブルを結合するようなクエリはかけない。
そんなのは、問い合わせの目的を名前にしたビューやストアドにすればよいだけだから。)
・フレームワークにする意味がなくなるので、出来るだけルール等の運用に逃げない。
購入者として、心待ちにしてました。
評判よりもレビューが早いですね。
レビューまでの過程が長かったのかな。
早速、ダウンロードしてインストールしてみましたが、以前のような不具合は全く無く快適に利用できるようになりました。
嬉しい限りです。
WCFを利用したサービスのバックグラウンドで動いてもらうフレームワークを作成するときに必要だったので調べてみると、System.Type型のメソッドにMakeGenricTypeという、そのままのメソッドがあってこれで作成できる事がわかりました。
そこで、ここではList<int>型を作成し、1から10までの値をListに登録するサンプルコードを紹介したいと思います。
普段の実装でこのようなコメントを書くことはありませんがコメントで解説します。
//List<>の<>内に入れる型のメタデータの配列を生成します。 //今回はList<int>型を作成したいので、int型のメタデータを生成します。 System.Type[] genericsTypeArguments = { typeof(int) }; //List<>のメタデータのMakeGenricTypeメソッドに先ほど作成した //int型のメタデータを渡すことでList<int>型のメタデータを作成できます。 //実は、これを知るまで<>という中に何も入れない書き方ができる事を知りませんでした。 System.Type integerListType = typeof(List<>).MakeGenericType(genericsTypeArguments); //後は通常のメタデータからインスタンスを生成するように //CreateInstanceでインスタンスを生成します。 var integerList = Activator.CreateInstance(integerListType); //integerListはobject型であり、動的に作成するというシナリオ上、 //何のListになったのかわからないので、 //ListのAddメソッドの情報を取得します。 var addMethodInfo = integerListType.GetMethod("Add"); //addメソッドを利用するサンプルとして便宜的に1から10までの数と登録します。 foreach (var value in Enumerable.Range(1,10)) { //Addメソッドの情報からInvokeメソッドを利用して、 //Addメソッドを実行し、与えられた値を設定します。 addMethodInfo.Invoke(integerList, new object[] { value }); }
以上が、ジェネリック型を動的に生成する方法です。
型の配列の要素を現在のジェネリック型定義の型パラメータで置き換え、結果の構築型を表す Type オブジェクトを返します。